线性回归:机器学习基础算法全解析
在机器学习领域,线性回归(Linear Regression)是极为基础且应用广泛的算法。它旨在预测连续值,核心假设是目标变量 y 与特征变量 x 存在线性关联,试图找出一条最佳拟合直线,其数学表达式为 y=w∗x+b 。这里,y 是预测值,x 为特征变量,w 代表权重(类似直线斜率),b 则是偏置(等同于直线截距)。
线性回归的关键任务,是确定最优的 w 和 b ,使预测值 y 与真实值之间的误差尽可能小。常用的误差衡量指标是均方误差(MSE) ,公式为 MSE=n1∑i=1n(yi−ypredi)2 ,其中 yi 是实际值,ypredi 是预测值,n 为数据点数量 ,我们通过调整 w 和 b ,让 MSE 达到最小。
求解线性回归的方法
最小二乘法
最小二乘法是求解线性回归的常用手段,它以最小化残差平方和(RSS)为目标,公式为 RSS=∑i=1n(yi−y^i)2 ,其中 yi 是实际值, y^i 是由线性回归模型 y^i=wxi+b 计算得出的预测值。
为了最小化 RSS,能得到正规方程:
{w∑i=1nxi2+b∑i=1nxi=∑i=1nxiyiw∑i=1nxi+bn=∑i=1nyi
写成矩阵形式就是:
[∑i=1nxi2∑i=1nxi∑i=1nxin][wb]=[∑i=1nxiyi∑i=1nyi]
求解该矩阵方程,就能得到最优的 w 和 b :
[wb]=[∑i=1nxi2∑i=1nxi∑i=1nxin]−1[∑i=1nxiyi∑i=1nyi]
梯度下降法
梯度下降法的目标是最小化损失函数 J(w,b) ,对于线性回归,常采用均方误差(MSE)作为损失函数,即 J(w,b)=2m1∑i=1m(yi−y^i)2 ,其中 m 是样本数量,yi 是实际值, y^i 是由模型 y^i=wxi+b 计算出的预测值。
梯度是损失函数对参数的偏导数,反映了损失函数在参数空间的变化方向。对于线性回归,梯度计算如下:
∂w∂J=−m1∑i=1mxi(yi−y^i)
∂b∂J=−m1∑i=1m(yi−y^i)
参数更新规则为:
w:=w−α∂w∂J
b:=b−α∂b∂J
这里的 α 是学习率,决定每次参数更新的步长。
梯度下降法的具体步骤为:
- 初始化参数:将 w 和 b 初始化为 0 或者随机值。
- 计算损失函数:依据当前参数计算损失函数值 J(w,b) 。
- 计算梯度:求出损失函数对 w 和 b 的偏导数。
- 更新参数:根据梯度更新 w 和 b 。
- 重复迭代:不断重复步骤 2 到 4,直到损失函数收敛或者达到最大迭代次数。
用 Python 实现线性回归
导入必要的库
首先,我们得导入相关的 Python 库,代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
生成模拟数据
接下来,生成一些模拟数据用于演示,代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# 生成一些随机数据
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()
运行上述代码,会生成一个散点图展示这些随机数据。
使用 Scikit - learn 进行线性回归
利用 Scikit - learn 库进行线性回归操作,代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# 生成一些随机数据
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()
运行后,会输出模型的斜率和截距,并生成一个图展示拟合直线与数据点的关系。
同时,我们还能用 score () 方法评估模型性能,返回 R2 值,代码如下:
import numpy as np
from sklearn.linear_model import LinearRegression
# 生成一些随机数据
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)
手动实现梯度下降法
除了使用现成库,还能手动实现梯度下降法来完成线性回归,代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# 生成一些随机数据
np.random.seed(0)
x = 2 * np.random.rand(100, 1)
y = 4 + 3 * x + np.random.randn(100, 1)
# 初始化参数
w = 0
b = 0
learning_rate = 0.1
n_iterations = 1000
# 梯度下降
for i in range(n_iterations):
y_pred = w * x + b
dw = -(2/len(x)) * np.sum(x * (y - y_pred))
db = -(2/len(x)) * np.sum(y - y_pred)
w = w - learning_rate * dw
b = b - learning_rate * db
# 输出最终参数
print(f"手动实现的斜率 (w): {w}")
print(f"手动实现的截距 (b): {b}")
# 可视化手动实现的拟合结果
y_pred_manual = w * x + b
plt.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()
运行代码后,会输出手动实现梯度下降法得到的斜率和截距,并生成拟合效果图。通过这些代码示例,大家能更直观地理解线性回归在 Python 中的实现过程。