当前位置: 首页 > article >正文

线性回归:机器学习基础算法全解析

在机器学习领域,线性回归(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=1n​xi2​+b∑i=1n​xi​=∑i=1n​xi​yi​w∑i=1n​xi​+bn=∑i=1n​yi​​

写成矩阵形式就是:
[∑i=1n​xi2​∑i=1n​xi​​∑i=1n​xi​n​][wb​]=[∑i=1n​xi​yi​∑i=1n​yi​​]

求解该矩阵方程,就能得到最优的 w 和 b :
[wb​]=[∑i=1n​xi2​∑i=1n​xi​​∑i=1n​xi​n​]−1[∑i=1n​xi​yi​∑i=1n​yi​​]

梯度下降法

梯度下降法的目标是最小化损失函数 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=1m​xi​(yi​−y^​i​)
∂b∂J​=−m1​∑i=1m​(yi​−y^​i​)

参数更新规则为:
w:=w−α∂w∂J​
b:=b−α∂b∂J​

这里的 α 是学习率,决定每次参数更新的步长。

梯度下降法的具体步骤为:

  1. 初始化参数:将 w 和 b 初始化为 0 或者随机值。
  2. 计算损失函数:依据当前参数计算损失函数值 J(w,b) 。
  3. 计算梯度:求出损失函数对 w 和 b 的偏导数。
  4. 更新参数:根据梯度更新 w 和 b 。
  5. 重复迭代:不断重复步骤 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 中的实现过程。

 


http://www.kler.cn/a/568640.html

相关文章:

  • 【Linux】进程替换(七)
  • 小程序中的插槽(Slot)机制及其与 Vue 组件的异同
  • git 的 Detached HEAD
  • 作业及参考
  • 0x36d(CRYPTO)
  • DeepSeek 助力 Vue3 开发:打造丝滑的密码输入框(Password Input)
  • 计算机视觉(opencv-python)之图像预处理基本操作(待补充)
  • Linux :进程状态
  • 微服务合并
  • 关于SSM项目的整合
  • 3.jvm的执行流程
  • 搭建基于Agent的金融问答系统
  • 安当防火墙登录安全解决方案:零信任认证+国密证书+动态口令构建全方位身份安全屏障
  • iOS 实现UIButton自动化点击埋点
  • 从人口焦虑到科技破局:新生人口减少不再是难题,未来社会已悄然蜕变
  • Mysql的索引失效
  • 数据库拓展操作
  • Vim 常用快捷键大全:跳转、编辑、查找替换全解析
  • 委托者模式(掌握设计模式的核心之一)
  • 华为手机自助维修的方法