HoRain云--线性回归 (Linear Regression)

  

🎬 HoRain 云小助手个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

线性回归(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),其公式为:

RSS=∑i=1n(yi−y^i)2RSS=i=1∑n​(yi​−y^​i​)2

其中:

  • yiyi​ 是实际值。
  • y^iy^​i​ 是预测值,由线性回归模型 y^i=wxi+by^​i​=wxi​+b 计算得到。

通过最小化 RSS,可以得到以下正规方程:

{w∑i=1nxi2+b∑i=1nxi=∑i=1nxiyiw∑i=1nxi+bn=∑i=1nyi{w∑i=1n​xi2​+b∑i=1n​xi​=∑i=1n​xi​yi​w∑i=1n​xi​+bn=∑i=1n​yi​​

矩阵形式

将正规方程写成矩阵形式:

[∑i=1nxi2∑i=1nxi∑i=1nxin][wb]=[∑i=1nxiyi∑i=1nyi][∑i=1n​xi2​∑i=1n​xi​​∑i=1n​xi​n​][wb​]=[∑i=1n​xi​yi​∑i=1n​yi​​]

求解方法

通过求解上述矩阵方程,可以得到最佳的 ww 和 bb

[wb]=[∑i=1nxi2∑i=1nxi∑i=1nxin]−1[∑i=1nxiyi∑i=1nyi][wb​]=[∑i=1n​xi2​∑i=1n​xi​​∑i=1n​xi​n​]−1[∑i=1n​xi​yi​∑i=1n​yi​​]

2、梯度下降法

梯度下降法的目标是最小化损失函数 J(w,b)J(w,b) 。对于线性回归问题,通常使用均方误差(MSE)作为损失函数:

J(w,b)=12m∑i=1m(yi−y^i)2J(w,b)=2m1​i=1∑m​(yi​−y^​i​)2

其中:

  • mm 是样本数量。
  • yiyi​ 是实际值。
  • y^iy^​i​ 是预测值,由线性回归模型 y^i=wxi+by^​i​=wxi​+b 计算得到。

梯度是损失函数对参数的偏导数,表示损失函数在参数空间中的变化方向。对于线性回归,梯度计算如下:

∂J∂w=−1m∑i=1mxi(yi−y^i)∂w∂J​=−m1​i=1∑m​xi​(yi​−y^​i​)

∂J∂b=−1m∑i=1m(yi−y^i)∂b∂J​=−m1​i=1∑m​(yi​−y^​i​)

参数更新规则

梯度下降法通过以下规则更新参数 ww 和 bb

w:=w−α∂J∂ww:=w−α∂w∂J​

b:=b−α∂J∂bb:=b−α∂b∂J​

其中:

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

梯度下降法的步骤

  1. 初始化参数:初始化 ww 和 bb 的值(通常设为 0 或随机值)。
  2. 计算损失函数:计算当前参数下的损失函数值 J(w,b)J(w,b)
  3. 计算梯度:计算损失函数对 ww 和 bb 的偏导数。
  4. 更新参数:根据梯度更新 ww 和 bb
  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 + 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()

输出结果:

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

显示如下所示:

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值