机器学习算法理论:线性回归

线性回归

       回归的理论解释:回归分析是确定两种或两种以上变数间相互依赖的定量关系的一种统计分析方法。按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。

       如果在回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。

使用线性回归时,需要遵循以下假设:

  • 要预测的因变量与自变量的关系是线性的。
  • 假设每个观测值之间是相互独立的。
  • 假设在自变量的每个取值点上,误差方差都是常数。
  • 各项误差服从正态分布。
最小二乘法

以房价预测为例。 

目标:给定房屋面积和房龄准确预测房价。

房屋面积(x_{1}房龄(x_2房价(y
642709000
10031060000
875902000
787854000

 根据以上房价为数据样本,假设:

y=\theta _0+x_1\cdot \theta _1+x_2\cdot \theta _2

其中: 

  • y为真实房价(标签)
  • \theta _0为微调模型的参数(偏置)
  • x_1为房屋面积(特征)
  • \theta _1为房屋面积在房价中影响究竟有多大(权重)
  • x_2为房龄(特征)
  • \theta _2为房龄在房价中影响究竟有多大(权重)

向量表示:

y=h_{0}(x)=\sum_{i=0}^{n}\theta _{i}x_{i}=\theta ^{T}x 

在对每个样本进行计算都会产生一个预测值,预测值与真实值之间产生误差值。误差项通常以\varepsilon来表示,则:

y^{(i)}=\theta ^Tx^{(i)}+\varepsilon ^{(i)}

所以求解的目标:就是让误差项最小,甚至为0。而每条样本产生的误差\varepsilon ^{(i)}都是独立同分布的(独立是指每套房子房价是独立的,同分布是指每套房子是在同一行情下),并且服从均值为0方差为\theta ^2的正态分布。则:

p(\varepsilon ^i)=\frac{1}{\sqrt{2\pi \sigma }}exp(-\frac{(\varepsilon ^i)^2}{2\sigma ^2})

 根据前面的公式:y^{(i)}=\theta ^Tx^{(i)}+\varepsilon ^{(i)}可得:\varepsilon ^{(i)} = y^{(i)}-\theta ^Tx^{(i)} 再与以上公式合并可得:

p(y^{(i)}|x^{(i)};\theta )=\frac{1}{\sqrt{2\pi \sigma }}exp(-\frac{(y^{(i)}-\theta ^Tx^{(i)})}{2\sigma ^2})

此时求解的目标为: 在给定了\thetax^{(i)}时,得到的真实值y^{(i)}的概率最大。

根据以上目标得到似然函数:

L(\theta )=\prod _{i=1}^{m}p(y^{(i)}|x^{(i)};\theta ) = \prod _{i=1}^{m}\frac{1}{\sqrt{2\pi \sigma }}exp(-\frac{(y^{(i)}-\theta ^Tx^{(i)})^2}{2\sigma^2})

可以理解为所有样本预测值接近真实值概率的乘积。

为方便求解将以上公式转化为对数似然函数(添加对数不影响求解目标,因为我们要得到的是一个点,而不是点对应的值):

ln(L(\theta))=ln(\prod _{i=1}^{m}p(y^{(i)}|x^{(i)};\theta))=ln(\prod_{i=1}^{m}\frac{1}{\sqrt{2\pi \sigma}}exp(-\frac{(y^{(i)}-\theta ^Tx^{(i)})^2}{2\sigma^2}))

=\sum _{i=1}^{m}ln\frac{1}{\sqrt{2\pi\sigma }}exp(-\frac{(y^{(i)}-\theta ^Tx^{(i)})^2}{2\sigma^2})

           =mln\frac{1}{\sqrt{2\pi \sigma }}-\frac{1}{\sigma ^2}\cdot \frac{1}{2}\sum ^m_{i=1}(y^{(i)}-\theta ^Tx^{(i)})^2

mln\frac{1}{\sqrt{2\pi \sigma }}和 \frac{1}{\sigma ^2} 是常数,所以目标函数转化为: 

J(\theta )=\frac{1}{2}\sum ^{m}_{i=1}(y^{(i)}-\theta ^{T}x^{(i)})^{2}

再将目标函数转化为最小二乘法根据偏导数等于0求解\theta

J(\theta )=\frac{1}{2}\sum ^{m}_{i=1}(y^{(i)}-\theta ^{T}x^{(i)})^{2}=\frac{1}{2}(y-X\theta )^T(y-X\theta )

=\frac{1}{2}(y^T-\theta^TX^T)(y-X\theta)

=\frac{1}{2}(y^Ty-y^TX\theta -\theta^TX^Ty+\theta^TX^TX\theta) 

接下来求偏导:

\Delta_\theta J(\theta )=\frac{1}{2}(2X^TX\theta-X^Ty-X^Ty) = X^TX\theta-X^Ty

令偏导数为0,则得到:

\theta =(X^TX)^{-1}X^Ty

以上是使用最小二乘法求解,接下来将通过梯度下降的方法进行不断学习来逐步优化参数θ。

梯度下降 

梯度下降法是一种常用的优化算法,用于求解目标函数的最小值。其基本原理是通过迭代的方式,不断更新参数的值,使得目标函数的值逐渐趋近于最小值。梯度下降法的核心思想是利用函数的梯度信息来指导参数的更新方向 。

常用的梯度下降方法

批量梯度下降法:这种方法计算整个数据集的梯度,然后更新参数。每个参数的更新都是整个数据集上的平均值。然而,这种方法计算量大,计算速度慢,尤其当数据集很大时。

import numpy as np

# 生成模拟数据
np.random.seed(0)
X = np.random.rand(100, 1)
y = 2 * X + 1 + 0.1 * np.random.randn(100, 1)

# 初始化参数
theta = np.random.randn(2, 1)
alpha = 0.01  # 学习率
iterations = 1000  # 迭代次数
m = len(y)  # 样本数量

# 批量梯度下降法
for i in range(iterations):
    gradients = 2 / m * X.T.dot(X.dot(theta) - y)  # 计算梯度
    theta = theta - alpha * gradients  # 更新参数

print("Theta:", theta)

随机梯度下降法:这种方法每次只使用一个样本计算梯度,然后更新参数。这种方法计算速度快,但是存在一定的随机性,可能会导致收敛速度慢或者无法收敛到全局最优解。

import numpy as np

def sgd(X, y, learning_rate=0.01, epochs=100):
    # 获取输入矩阵的行数和列数
    m, n = X.shape
    # 初始化参数向量theta为全零向量
    theta = np.zeros(n)
    # 进行指定轮数的迭代更新
    for _ in range(epochs):
        # 遍历数据集中的每个样本
        for i in range(m):
            # 随机选择一个样本
            rand_idx = np.random.randint(m)
            xi = X[rand_idx:rand_idx+1]
            yi = y[rand_idx:rand_idx+1]
            # 计算梯度
            gradients = 2 * xi.T.dot(xi.dot(theta) - yi)
            # 更新参数向量theta
            theta = theta - learning_rate * gradients
    # 返回训练得到的参数向量theta
    return theta

# 生成模拟数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

# 训练模型
theta = sgd(X, y)
print("Theta:", theta)

小批量梯度下降法:这种方法介于批量梯度下降法和随机梯度下降法之间,使用一部分数据(小批量)计算梯度,然后更新参数。这种方法计算速度较快,且能得到较好的优化效果。

import numpy as np

# 定义小批量梯度下降法函数
def mini_batch_gradient_descent(X, y, learning_rate=0.01, epochs=100, batch_size=32):
    # 获取样本数量和特征数量
    m, n = X.shape
    
    # 初始化参数向量
    theta = np.zeros((n, 1))
    
    # 迭代更新参数
    for epoch in range(epochs):
        # 随机打乱样本顺序
        permutation = np.random.permutation(m)
        X_shuffled = X[permutation]
        y_shuffled = y[permutation]
        
        # 将数据集划分为小批量
        for i in range(0, m, batch_size):
            X_batch = X_shuffled[i:i+batch_size]
            y_batch = y_shuffled[i:i+batch_size]
            
            # 计算梯度
            gradient = (1/batch_size) * X_batch.T @ (X_batch @ theta - y_batch)
            
            # 更新参数
            theta -= learning_rate * gradient
            
    return theta

# 示例数据
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([[3], [7], [11], [15]])

# 调用小批量梯度下降法函数进行线性回归
theta = mini_batch_gradient_descent(X, y)
print("拟合参数:", theta)

动量梯度下降法:这种方法在每次迭代中不仅考虑当前的梯度,还考虑上次迭代的梯度方向,从而加速收敛速度并减少震荡。动量项的引入可以使得算法在优化过程中具有一定的记忆性,能够沿着之前的下降方向继续前进。

import numpy as np

def momentum_gradient_descent(X, y, learning_rate=0.01, momentum=0.9, num_iterations=100):
    """
    使用动量梯度下降法求解线性回归问题。

    参数:
    X -- 输入数据矩阵 (m x n)
    y -- 目标变量向量 (m x 1)
    learning_rate -- 学习率 (默认值为0.01)
    momentum -- 动量系数 (默认值为0.9)
    num_iterations -- 迭代次数 (默认值为100)

    返回:
    theta -- 最优参数向量 (n x 1)
    """
    # 初始化参数向量和动量向量
    m, n = X.shape
    theta = np.zeros((n, 1))
    velocity = np.zeros((n, 1))

    # 迭代更新参数
    for i in range(num_iterations):
        # 计算梯度
        gradient = (1 / m) * X.T @ (X @ theta - y)

        # 更新动量向量
        velocity = momentum * velocity + learning_rate * gradient

        # 更新参数向量
        theta = theta - velocity

    return theta

Adam:Adam 算法是一种自适应学习率的优化算法,结合了动量梯度下降法和 RMSProp 算法的特点。它通过计算梯度的指数移动平均值来调整学习率,以更好地适应不同参数的更新速度。Adam 算法在许多任务中表现出色,被广泛应用于深度学习模型的训练。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/318634.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟着cherno手搓游戏引擎【5】layer(层)、Glad

编写基类层: Layer.h:提供Attach链接、Detach解绑、Update刷新、Event事件、GetName方法 #pragma once #include"YOTO/Core.h" #include"YOTO/Event/Event.h" namespace YOTO {class YOTO_API Layer{public:Layer(const std::string& nam…

【软件测试】学习笔记-不同视角的软件性能与性能指标

本篇文章探讨新的测试主题:性能测试,因为性能测试的专业性很强,所以我会以从0到1的入门者视角,系统性地阐述性能测试的方法以及应用领域,用实例去诠释各种性能指标。 本篇文章站在全局的视角,帮你梳理软件性…

【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】

前言 大家好吖,欢迎来到 YY 滴C考前速过系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《…

统计学-R语言-4.2

文章目录 前言单变量数据的描述分析分类型数据频数表条形图饼图 数值型数据数值型数据数据的集中趋势--均值数据的集中趋势--众数 离散程度离散程度--极差离散程度--四分位数极差离散程度--方差离散程度--加权方差离散程度--标准差离散程度--变异系数 数据的形状数据的形状--偏…

RAG(检索增强生成 )

📑前言 本文主要是【RAG】——RAG(检索增强生成 )的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句…

最新消息:OpenAI GPT Store 正式上线,GPTs 应用商店来了

OpenAI推出的两款新产品和服务:GPT Store和ChatGPT Team,提供了许多全新的解决方案和功能,旨在帮助用户更轻松地使用和构建GPT工具,同时也增加了公司的收入来源。GPT Store是一个全新的在线平台,允许用户创建和分享自定…

小程序基础学习(多插槽)

先创建插槽 定义多插槽的每一个插槽的属性 在js文件中启用多插槽 在页面使用多插槽 组件代码 <!--components/my-slots/my-slots.wxml--><view class"container"><view class"left"> <slot name"left" ></slot>&…

【DC快速上手教程--1 Setup the DC】

DC快速上手教程--1 Setup the DC 0 Intro1 DC Demo 本篇系列教程介绍总结DC Flow&#xff0c;为了不涉密&#xff0c;在这里以DC labs为Demo做一个入门的介绍&#xff1b;目标&#xff1a;用起来EDA 工具是最基础也是最简单的&#xff1b;重点是如何去分析报告&#xff0c;依据…

Jenkins集成Sonar Qube

下载插件 重启Jenkins 容器 sonarqube 使用令牌 Jenkins 配置 重新构建

Windows平台RTMP推送|轻量级RTSP服务录像模块如何支持中文路径?

技术背景 我们在做Windows平台RTMP推送、轻量级RTSP服务录像模块的时候&#xff0c;部分开发者抱怨路径无法设置中文&#xff0c;只能设置为英文。 以C#的接口为例&#xff0c;早期的设计如下&#xff1a; /** 设置本地录像目录, 必须是英文目录&#xff0c;否则会失败*/[DllI…

YOLOv5改进 | 注意力篇 | CGAttention实现级联群体注意力机制 (全网首发改进)

一、本文介绍 本文给大家带来的改进机制是实现级联群体注意力机制CascadedGroupAttention,其主要思想为增强输入到注意力头的特征的多样性。与以前的自注意力不同,它为每个头提供不同的输入分割,并跨头级联输出特征。这种方法不仅减少了多头注意力中的计算冗余,而且通过增…

Spring | Spring框架最基本核心的jar包、Spring的入门程序、依赖注入

目录&#xff1a; 1.Spring框架最基本、最核心的jar包2.Spring的入门程序3.依赖注入3.1 依赖注入的概念3.2 依赖注入的实现方式 1.Spring框架最基本、最核心的jar包 Spring是一个轻量级框架&#xff0c;Spring最基本、最核心的的jar包括 : beans、context、core、expression。 …

Dobbo---分布式系统通信方式

通信方式 分布式系统通信方式1. RMIRMI 通信实现案例2. RPC常用RPC框架 分布式系统通信方式 1. RMI RMI ( Remote Method Invocation 远程方法调用) 图1.1 客户端-服务端通信方式 客户端将要调用的方法及参数&#xff0c;打包为辅助对象&#xff0c;通过网络socket&#xff…

AI-图片转换中国风动漫人物

&#x1f3e1; 个人主页&#xff1a;IT贫道-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;私聊博主加WX好友&#xff0c;获取更多资料哦~ &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. AI卡通秀原理 2. …

Android WiFi Service启动-Android13

Android WiFi Service启动 - Android13 1、SystemServer中入口2、WifiService启动2.1 关键类概要2.2 启动时序图 Android WiFi基础概览 AOSP > 文档 > 心主题 > WiFi概览 1、SystemServer中入口 编译生成对应的jar包&#xff1a;"/apex/com.android.wifi/javalib…

Sonar Qube基本使用

中文化 Sonar Qube的使用方式很多&#xff0c;Maven可以整合&#xff0c;也可以采用sonar-scanner的方式&#xff0c;再查看Sonar Qube的检测效果 Sonar-scanner实现代码检测 下载Sonar-scanner&#xff1a;https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/…

Qt/C++编写视频监控系统83-自定义悬浮条信息

一、前言 一般视频控件上会给出个悬浮条&#xff0c;这个悬浮条用于显示分辨率或者一些用户期望看到的信息&#xff0c;一般常用的信息除了分辨率以外&#xff0c;还有帧率、封装格式、视频解码器名称、音频解码器名称、实时码率等&#xff0c;由于实际的场景不一样&#xff0…

(南京观海微电子)——色调介绍

色温可以把她理解为宏观上的一种大的环境。你拿起一张图片&#xff0c;整体感觉上在光线分布上颜色是饱满温和还是单调冷艳&#xff0c;从字面意思理解可以简单理解为给人的一种整体印象。包括温暖 白色 清凉或者说冷。 色调就是说在整体环境下色彩的浓淡分配方面的定义。 色调…

通信入门系列——微积分中极限、连续、导数、微分、积分

本节目录 一、极限 1、数列极限 2、函数极限 二、连续 三、导数 四、微分 五、积分本节内容 一、极限 1、数列极限 数列极限&#xff1a;设{xn}为一个实数列&#xff0c;A为一个定数。若对任意给定的ε>0&#xff0c;总存在正整数N,使得当n>N时&#xff0c;有|xn-A|<…

蓝桥杯AcWing学习笔记 8-1数论的学习(上)

蓝桥杯 我的AcWing 题目及图片来自蓝桥杯C AB组辅导课 数论&#xff08;上&#xff09; 蓝桥杯省赛中考的数论不是很多&#xff0c;这里讲几个蓝桥杯常考的知识点。 欧几里得算法——辗转相除法 欧几里得算法代码&#xff1a; import java.util.Scanner ;public class Main…