线性回归 (Linear Regression)
线性回归(Linear Regression)是机器学习中最基础且广泛应用的算法之一。
线性回归 (Linear Regression) 是一种用于预测连续值的最基本的机器学习算法,它假设目标变量 y 和特征变量 x 之间存在线性关系,并试图找到一条最佳拟合直线来描述这种关系。
y = w * x + b
其中:
-
y是预测值 -
x是特征变量 -
w是权重 (斜率) -
b是偏置 (截距)
线性回归的目标是找到最佳的
w
和
b
,使得预测值
y
与真实值之间的误差最小。常用的误差函数是均方误差 (MSE):
MSE = 1/n * Σ(y_i - y_pred_i)^2
其中:
- y_i 是实际值。
- y_pred_i 是预测值。
- n 是数据点的数量。
我们的目标是通过调整 w 和 b ,使得 MSE 最小化。
如何求解线性回归?
1、最小二乘法
最小二乘法是一种常用的求解线性回归的方法,它通过求解以下方程来找到最佳的 ( w ) 和 ( b )。
最小二乘法的目标是最小化残差平方和(RSS),其公式为:
\[ \text{RSS} = \sum_{i=1}^n (y_i - \hat{y}_i)^2 \]
其中:
-
\( y_i \)是实际值。 -
\( \hat{y}_i \)是预测值,由线性回归模型\( \hat{y}_i = w x_i + b \)计算得到。
通过最小化 RSS,可以得到以下正规方程:
\[ \begin{cases} w \sum_{i=1}^n x_i^2 + b \sum_{i=1}^n x_i = \sum_{i=1}^n x_i y_i \\ w \sum_{i=1}^n x_i + b n = \sum_{i=1}^n y_i \end{cases} \]
矩阵形式
将正规方程写成矩阵形式:
\[ \begin{bmatrix} \sum_{i=1}^n x_i^2 & \sum_{i=1}^n x_i \\ \sum_{i=1}^n x_i & n \end{bmatrix} \begin{bmatrix} w \\ b \end{bmatrix} = \begin{bmatrix} \sum_{i=1}^n x_i y_i \\ \sum_{i=1}^n y_i \end{bmatrix} \]
求解方法
通过求解上述矩阵方程,可以得到最佳的
\( w \)
和
\( b \)
:
\[ \begin{bmatrix} w \\ b \end{bmatrix} = \begin{bmatrix} \sum_{i=1}^n x_i^2 & \sum_{i=1}^n x_i \\ \sum_{i=1}^n x_i & n \end{bmatrix}^{-1} \begin{bmatrix} \sum_{i=1}^n x_i y_i \\ \sum_{i=1}^n y_i \end{bmatrix} \]
2、梯度下降法
梯度下降法的目标是最小化损失函数
\( J(w, b) \)
。对于线性回归问题,通常使用均方误差(MSE)作为损失函数:
\[ J(w, b) = \frac{1}{2m} \sum_{i=1}^m (y_i - \hat{y}_i)^2 \]
其中:
-
\( m \)是样本数量。 -
\( y_i \)是实际值。 -
\( \hat{y}_i \)是预测值,由线性回归模型\( \hat{y}_i = w x_i + b \)计算得到。
梯度是损失函数对参数的偏导数,表示损失函数在参数空间中的变化方向。对于线性回归,梯度计算如下:
\[ \frac{\partial J}{\partial w} = -\frac{1}{m} \sum_{i=1}^m x_i (y_i - \hat{y}_i) \]
\[ \frac{\partial J}{\partial b} = -\frac{1}{m} \sum_{i=1}^m (y_i - \hat{y}_i) \]
参数更新规则
梯度下降法通过以下规则更新参数
\( w \)
和
\( b \)
:
\[ w := w - \alpha \frac{\partial J}{\partial w} \]
\[ b := b - \alpha \frac{\partial J}{\partial b} \]
其中:
-
\( \alpha \)是学习率(learning rate),控制每次更新的步长。
梯度下降法的步骤
-
初始化参数
:初始化
\( w \)和\( b \)的值(通常设为 0 或随机值)。 -
计算损失函数
:计算当前参数下的损失函数值
\( J(w, b) \)。 -
计算梯度
:计算损失函数对
\( w \)和\( b \)的偏导数。 -
更新参数
:根据梯度更新
\( w \)和\( b \)。 - 重复迭代 :重复步骤 2 到 4,直到损失函数收敛或达到最大迭代次数。
使用 Python 实现线性回归
下面我们通过一个简单的例子来演示如何使用 Python 实现线性回归。
1、导入必要的库
importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLinearRegression
2、生成模拟数据
importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLinearRegression# 生成一些随机数据np.random.seed(0)x=2* np.random.rand(100,1)y=4+3* x + np.random.randn(100,1)# 可视化数据plt.scatter(x,y)plt.xlabel('x')plt.ylabel('y')plt.title('Generated Data From Runoob')plt.show()
显示如下所示:
3、使用 Scikit-learn 进行线性回归
importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLinearRegression# 生成一些随机数据np.random.seed(0)x=2* np.random.rand(100,1)y=4+3* x + np.random.randn(100,1)# 创建线性回归模型model=LinearRegression()# 拟合模型model.fit(x,y)# 输出模型的参数print(f"斜率 (w): {model.coef_[0][0]}")print(f"截距 (b): {model.intercept_[0]}")# 预测y_pred=model.predict(x)# 可视化拟合结果plt.scatter(x,y)plt.plot(x,y_pred,color='red')plt.xlabel('x')plt.ylabel('y')plt.title('Linear Regression Fit')plt.show()
输出结果:
斜率 (w): 2.968467510701019 截距 (b): 4.222151077447231
显示如下所示:
我们可以使用
score()
方法来评估模型性能,返回 R^2 值。
importnumpyasnpfromsklearn.linear_modelimportLinearRegression# 生成一些随机数据np.random.seed(0)x=2* np.random.rand(100,1)y=4+3* x + np.random.randn(100,1)# 创建线性回归模型model=LinearRegression()# 拟合模型model.fit(x,y)# 计算模型得分score=model.score(x,y)print("模型得分:",score)
输出结果为:
模型得分: 0.7469629925504755
4、手动实现梯度下降法
importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLinearRegression# 生成一些随机数据np.random.seed(0)x=2* np.random.rand(100,1)y=4+3* x + np.random.randn(100,1)# 初始化参数w=0b=0learning_rate=0.1n_iterations=1000# 梯度下降foriinrange(n_iterations):y_pred=w * x + bdw=-(2/len(x))* np.sum(x *(y - y_pred))db=-(2/len(x))* np.sum(y - y_pred)w=w - learning_rate * dwb=b - learning_rate * db# 输出最终参数print(f"手动实现的斜率 (w): {w}")print(f"手动实现的截距 (b): {b}")# 可视化手动实现的拟合结果y_pred_manual=w * x + bplt.scatter(x,y)plt.plot(x,y_pred_manual,color='green')plt.xlabel('x')plt.ylabel('y')plt.title('Manual Gradient Descent Fit')plt.show()
输出结果:
手动实现的斜率 (w): 2.968467510701028 手动实现的截距 (b): 4.222151077447219
显示如下所示: