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

sk04.【scikit-learn基础】--『监督学习』之 线性回归

线性回归(Linear Regression)是机器学习中最基础且广泛应用的算法之一。

线性回归 (Linear Regression) 是一种用于预测连续值的最基本的机器学习算法,它假设目标变量 y 和特征变量 x 之间存在线性关系,并试图找到一条最佳拟合直线来描述这种关系。

y = w\times x + b

其中:

  • y 是预测值

  • x 是特征变量

  • w 是权重 (斜率)

  • b 是偏置 (截距)

线性回归的目标是找到最佳的 w 和 b,使得预测值 y 与真实值之间的误差最小。常用的误差函数是均方误差 (MSE):

MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - y_{\text{pred},i})^2

其中:

  • y_i 是实际值。
  • y_{\text{pred},i}是预测值。
  • n 是数据点的数量。

我们的目标是通过调整 w 和 b ,使得 MSE 最小化。

如何求解线性回归?

1、最小二乘法

最小二乘法是一种常用的求解线性回归的方法,它通过求解以下方程来找到最佳的 ( w ) 和 ( b )。

最小二乘法的目标是最小化残差平方和(RSS),其公式为:

                                         

其中:

  • y_i是实际值。
  • \hat{y}_i是预测值,由线性回归模型 \hat{y}^i=wx_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 + bn = \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} = \left[ \begin{array}{cc} \sum_{i=1}^{n} x_i^2 & \sum_{i=1}^{n} x_i \\ \sum_{i=1}^{n} x_i & n \end{array} \right]^{-1} \cdot \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 是预测值,由线性回归模型y_i=wx_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}

其中:

  • α是学习率(learning rate),控制每次更新的步长。

梯度下降法的步骤

  1. 初始化参数:初始化 w和 b的值(通常设为 0 或随机值)。
  2. 计算损失函数:计算当前参数下的损失函数值 J(w,b)
  3. 计算梯度:计算损失函数对 w和 b 的偏导数。
  4. 更新参数:根据梯度更新 w 和 b
  5. 重复迭代:重复步骤 2 到 4,直到损失函数收敛或达到最大迭代次数。

使用 Python 实现线性回归

下面我们通过一个简单的例子来演示如何使用 Python 实现线性回归。

# 1、导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression# 2、生成模拟数据
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()

显示如下所示:

# 3、使用 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()

输出结果:

斜率 (w): 2.968467510701019
截距 (b): 4.222151077447231

显示如下所示:

我们可以使用 score() 方法来评估模型性能,返回 R^2 值。

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)

输出结果为:

模型得分: 0.7469629925504755

4、手动实现梯度下降法

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 + 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 + 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()

输出结果:

手动实现的斜率 (w): 2.968467510701028
手动实现的截距 (b): 4.222151077447219

显示如下所示:

http://www.dtcms.com/a/391240.html

相关文章:

  • Ubuntu终端切换WiFi
  • eBest渠道商管理软件:快消品渠道数字化的“破局利器”
  • 基于protues的电子时钟仿真与模拟
  • FastProperty 高效的属性读写设置
  • 【开题答辩全过程】以 基于Java的失物招领平台为例,包含答辩的问题和答案
  • 【7/20】前后端整合:Vue.js 调用 Express API,操作 MongoDB 数据,实现用户管理系统
  • 【8/20】用户认证基础:JWT 在 Express 中的实现,实现安全登录
  • 独立站有哪些建站工具
  • Linux 终端常用快捷键整理
  • 跨域的两种解决方法
  • 小程序中获取年月日时分的组件
  • Redis热升级秘籍:零停机迁移方案与工具链
  • 时序数据库选型指南深度解析IoTDB架构设计与性能对比
  • springboot超市管理系统的设计与实现(代码+数据库+LW)
  • 让Trae写一个AI的api中继服务
  • 跨国制造业SD-WAN:延迟下降78%,运维成本下降53%
  • MySQL服务启动不成功的可能解决方法
  • 硬解码出现画面回退分析
  • P1068 [NOIP 2009 普及组] 分数线划定-普及-
  • 用python语言如何排大小
  • pycharm连接GitHub,怎么配置 SSH 密钥并改用 SSH 连接
  • ​​[硬件电路-265]:电源系统要考虑的因素包括:不同的输出电压、隔离防干扰、防反、防浪涌、电压可调、电源开关、电池、可充电、低纹波、低噪声、防波动等
  • 【开题答辩全过程】以 基于Python的电影推荐系统为例,包含答辩的问题和答案
  • 格拉姆角场(Gramian Angular Field, GAF)详解
  • 前端开发工具Vue有哪些?常用Vue前端开发工具推荐、Vue开发工具对比与最佳实践分享
  • 基于vue的幼儿园健康管理系统0fz0y(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 第69课 分类任务: 基于BERT训练情感分类与区别二分类本质思考
  • Mysql杂志(二十)——MyISAM索引结构与B树B+树
  • Java 大视界 -- 基于 Java 的大数据实时流处理在金融高频交易数据分析中的应用
  • BonkFun 推出 USD1:Meme 币玩法的新入口