机器学习(一)线性回归

本文详细介绍了线性回归的基本概念,包括模型定义、损失函数(均方误差)以及参数优化方法——梯度下降。讨论了最小二乘法如何通过求解误差平方和最小化来确定最优参数,并提到了正则化在处理大数据集时的作用。最后,给出了一个简单的线性回归Python代码示例,展示了如何用批量梯度下降训练模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 线性回归

线性回归推导

线性回归是机器学习中的一种基本模型,它是通过对数据集的学习来建立一个线性函数模型,使得预测的值与真实值的误差尽可能地小。下面我们将详细介绍线性回归的原理和推导过程。

首先,我们定义线性回归的模型为:

h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h_{\theta}(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + ... + \theta_n x_n hθ(x)=θ0+θ1x1+θ2x2+...+θnxn

其中, x i x_i xi为第 i i i个特征, θ i \theta_i θi为第 i i i个参数, n n n为特征的数量。我们将数据集表示为 ( x ( 1 ) , y ( 1 ) ) , . . . , ( x ( m ) , y ( m ) ) (x^{(1)},y^{(1)}),...,(x^{(m)},y^{(m)}) (x(1),y(1)),...,(x(m),y(m)),其中 x ( i ) x^{(i)} x(i)为第 i i i个样本的特征向量, y ( i ) y^{(i)} y(i)为第 i i i个样本的真实值。对于给定的 θ \theta θ x ( i ) x^{(i)} x(i),我们可以使用模型 h θ ( x ( i ) ) h_{\theta}(x^{(i)}) hθ(x(i))来预测样本 x ( i ) x^{(i)} x(i)的真实值 y ( i ) y^{(i)} y(i)

接下来,我们需要定义一个损失函数来衡量模型预测值与真实值之间的误差。常用的损失函数是均方误差(Mean Squared Error):

J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^{m}(h_{\theta}(x^{(i)}) - y^{(i)})^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2

其中, 1 2 m \frac{1}{2m} 2m1是为了方便求导。我们的目标是通过最小化损失函数 J ( θ ) J(\theta) J(θ)来找到最优的参数 θ \theta θ

接下来,我们使用梯度下降算法来求解最优的参数 θ \theta θ。梯度下降算法的基本思想是不断迭代,每次更新参数 θ \theta θ,使得损失函数 J ( θ ) J(\theta) J(θ)最小化。

具体地,我们定义 θ j \theta_j θj的更新规则为:

θ j : = θ j − α ∂ J ( θ ) ∂ θ j \theta_j := \theta_j - \alpha \frac{\partial J(\theta)}{\partial \theta_j} θj:=θjαθjJ(θ)

其中, α \alpha α为学习率,是一个超参数,控制每次更新的步长。

我们可以通过求解损失函数 J ( θ ) J(\theta) J(θ)的偏导数来推导出梯度下降的更新规则。偏导数的计算过程如下:

∂ J ( θ ) ∂ θ j = ∂ ∂ θ j 1 2 ( h θ ( x ) − y ) 2 = 2 ⋅ 1 2 ( h θ ( x ) − y ) ⋅ ∂ ∂ θ j ( h θ ( x ) − y ) = ( h θ ( x ) − y ) ⋅ ∂ ∂ θ j ( ∑ i = 0 d θ i x i − y ) = ( h θ ( x ) − y ) x j \begin{split} \frac{\partial J(\theta)}{\partial \theta_j} &=\frac{\partial}{\partial \theta_j}\frac{1}{2}(h_\theta(x)-y)^2 \\&=2\cdot\frac{1}{2}(h_\theta(x)-y)\cdot\frac{\partial}{\partial \theta_j}(h_\theta(x)-y) \\&=(h_\theta(x)-y)\cdot \frac{\partial}{\partial\theta_j}(\sum^{d}_{i=0}\theta_ix_i-y) \\&= (h_\theta(x)-y)x_j \end{split} θjJ(θ)=θj21(hθ(x)y)2=221(hθ(x)y)θj(hθ(x)y)=(hθ(x)y)θj(i=0dθixiy)=(hθ(x)y)xj
d d d表示一个样本有d个特征向量。

因此,我们的参数更新规则为梯度下降算法的标准形式:
θ j : = θ j + α ( y ( i ) − h θ ( x ( i ) ) ) x j ( i ) \theta_j := \theta_j+\alpha(y^{(i)}-h_\theta(x^{(i)}))x_j^{(i)} θj:=θj+α(y(i)hθ(x(i)))xj(i)

我们可以不断迭代,直到达到预设定的停止条件,例如达到最大迭代次数或者损失函数的变化不再明显。

接下来,我们将从推导的角度,详细介绍最小二乘法的求解过程。最小二乘法是一种常用的线性回归方法,它通过最小化误差的平方和来求解最优参数。

首先,我们将线性回归的模型重新写成矩阵形式:

h θ ( X ) = X θ h_{\theta}(X) = X\theta hθ(X)=

其中, X X X m × ( n + 1 ) m \times (n+1) m×(n+1)的矩阵,包含所有的训练样本和它们对应的特征值, θ \theta θ ( n + 1 ) × 1 (n+1) \times 1 (n+1)×1的参数向量。

我们将目标值 y y y表示成 m × 1 m \times 1 m×1的向量,数据集可以表示为:

[ x 0 ( 1 ) x 1 ( 1 ) . . . x n ( 1 ) x 0 ( 2 ) x 1 ( 2 ) . . . x n ( 2 ) . . . . . . . . . . . . x 0 ( m ) x 1 ( m ) . . . x n ( m ) ] [ θ 0   θ 1   . . .   θ n ] ≈ [ y ( 1 )   y ( 2 )   . . .   y ( m ) ] \begin{bmatrix}x_0^{(1)} & x_1^{(1)} & ... & x_n^{(1)} \\ x_0^{(2)} & x_1^{(2)} & ... & x_n^{(2)} \\ ... & ... & ... & ...\\ x_0^{(m)} & x_1^{(m)} & ... & x_n^{(m)}\end{bmatrix} \begin{bmatrix}\theta_0 \ \theta_1 \ ... \ \theta_n\end{bmatrix} \approx \begin{bmatrix}y^{(1)} \ y^{(2)} \ ... \ y^{(m)}\end{bmatrix} x0(1)x0(2)...x0(m)x1(1)x1(2)...x1(m)............xn(1)xn(2)...xn(m) [θ0 θ1 ... θn][y(1) y(2) ... y(m)]

我们的目标是找到一个参数向量 θ \theta θ,使得误差的平方和最小化。这可以表示为:

min ⁡ θ J ( θ ) = 1 2 ( X θ − y ) T ( X θ − y ) \min_{\theta} J(\theta) = \frac{1}{2}(X\theta - y)^T(X\theta - y) θminJ(θ)=21(y)T(y)

其中, J ( θ ) J(\theta) J(θ)是误差的平方和, T ^T T表示矩阵的转置。

为了求解最优的参数向量 θ \theta θ,我们需要对 J ( θ ) J(\theta) J(θ)求偏导数,并令其等于0。具体地,我们需要求解:

∂ J ( θ ) ∂ θ = ∂ ∂ θ 1 2 ( X θ − y ) T ( X θ − y ) \frac{\partial J(\theta)}{\partial \theta} = \frac{\partial}{\partial \theta} \frac{1}{2}(X\theta - y)^T(X\theta - y) θJ(θ)=θ21(y)T(y)

根据矩阵求导法则,我们有:

∂ J ( θ ) ∂ θ = X T ( X θ − y ) \frac{\partial J(\theta)}{\partial \theta} = X^T(X\theta - y) θJ(θ)=XT(y)

将其令为0,我们得到:

X T ( X θ − y ) = 0 X^T(X\theta - y) = 0 XT(y)=0

移项得到:

X T X θ = X T y X^TX\theta = X^Ty XT=XTy

最后,我们就可以通过求解线性方程组 X T X θ = X T y X^TX\theta = X^Ty XT=XTy来得到最优的参数向量 θ \theta θ

如果 X T X X^TX XTX是可逆的,那么解为:

θ = ( X T X ) − 1 X T y \theta = (X^TX)^{-1}X^Ty θ=(XTX)1XTy

如果 X T X X^TX XTX不可逆,我们可以使用正则化方法来解决这个问题。正则化方法是在损失函数中加入一个正则项,以抑制模型复杂度过高带来的过拟合问题。

常见的正则化方法包括L1正则化和L2正则化。L1正则化在损失函数中加入 λ ∣ ∣ θ ∣ ∣ 1 \lambda ||\theta||_1 λ∣∣θ1,其中 λ \lambda λ是正则化参数, ∣ ∣ θ ∣ ∣ 1 ||\theta||_1 ∣∣θ1是参数向量 θ \theta θ的L1范数。L2正则化在损失函数中加入 λ ∣ ∣ θ ∣ ∣ 2 2 \lambda ||\theta||_2^2 λ∣∣θ22,其中 λ \lambda λ是正则化参数, ∣ ∣ θ ∣ ∣ 2 ||\theta||_2 ∣∣θ2是参数向量 θ \theta θ的L2范数。

以L2正则化为例,我们需要求解的是以下线性方程组:

( X T X + λ I ) θ = X T y (X^TX + \lambda I)\theta = X^Ty (XTX+λI)θ=XTy

其中, I I I是一个 ( n + 1 ) × ( n + 1 ) (n+1) \times (n+1) (n+1)×(n+1)的单位矩阵。如果 λ = 0 \lambda = 0 λ=0,则L2正则化就退化为最小二乘法。

至此,我们介绍了线性回归模型的基本概念、模型形式以及如何使用最小二乘法求解最优参数。在实际应用中,我们还需要考虑许多其他因素,如特征选择、模型评估、数据预处理等。但是,理解线性回归模型的核心思想和求解方法是非常重要的基础知识。

总结一下,线性回归模型是一个用于建立特征与目标变量之间线性关系的模型。最小二乘法是一种基本的线性回归方法,它通过最小化误差的平方和来求解最优参数。如果数据集很大,我们可以使用随机梯度下降等优化方法来加速求解。在实际应用中,我们还需要考虑模型的评估和调优等问题。

线性回归的简单范例及其代码:

import numpy as np  
import pandas as pd  
import matplotlib.pyplot as plt  
  
  
def BGD(learning_rate, theta, input, label):  
    grad = []  
    for i, j in zip(input, label):  
        pred = i.dot(theta.T)  
        grad.append((j - pred) * i)  
    grad = np.average(grad, axis=0).reshape(1, 2)  
    theta = theta + learning_rate * grad  
    return theta  
  
  
def train_BGD(times, learning_rate, theta, input, label):  
    for _ in range(times):  
        theta = BGD(learning_rate, theta, input, label)  
    return theta  
  
  
data = pd.read_csv('data', sep='\s+', names=['x1', 'x2', 'x3'])  
data = np.array(data)  
input_data = data[:, :2]  
result = data[:, 2]  
  
theta = np.random.rand(1,input_data.shape[1])  
  
theta = train_BGD(10000,0.001,theta,input_data,result)  
  
plt.plot(input_data[:,1],input_data.dot(theta.T))  
plt.scatter(input_data[:,1],result,c='y')  
plt.show()

运行结果:

线性回归的简单范例及其代码:

数据集下载:https://download.youkuaiyun.com/download/qq_60980658/87530135

import numpy as np  
import pandas as pd  
import matplotlib.pyplot as plt  
  
  
def BGD(learning_rate, theta, input, label):  
    grad = []  
    for i, j in zip(input, label):  
        pred = i.dot(theta.T)  
        grad.append((j - pred) * i)  
    grad = np.average(grad, axis=0).reshape(1, 2)  
    theta = theta + learning_rate * grad  
    return theta  
  
  
def train_BGD(times, learning_rate, theta, input, label):  
    for _ in range(times):  
        theta = BGD(learning_rate, theta, input, label)  
    return theta  
  
  
data = pd.read_csv('data', sep='\s+', names=['x1', 'x2', 'x3'])  
data = np.array(data)  
input_data = data[:, :2]  
result = data[:, 2]  
  
theta = np.random.rand(1,input_data.shape[1])  
  
theta = train_BGD(10000,0.001,theta,input_data,result)  
  
plt.plot(input_data[:,1],input_data.dot(theta.T))  
plt.scatter(input_data[:,1],result,c='y')  
plt.show()

运行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值