【线性回归】-最小二乘法求一元线性回归公式推导及代码实现

博客围绕一元线性回归方程展开,先进行原理分析,介绍通过计算误差和求平方和来判断直线对数据点的拟合程度,将问题转化为求多元函数极值,通过求偏导数得出最优参数。接着进行代码实现,包括导入依赖、画线性图、用最小二乘法计算参数及验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.原理分析

在这里插入图片描述

1.如何计算一元线性回归方程最优参数

首先,假设我们有一条拟合上图这些散乱的点的直线f(x) = a*x + b ,那么我们如何判断这条线是否很好的拟合了这些点? 那么我们不妨用下面的方法 : 我们输入一个x , 得出对应的y值 , 然后在根据 真实的 y值 , 计算二者的误差, 误差越小说明直线拟合的越小

所以 我们可以得出一个损失函数 -> y - f(x) 真实的值减去 使用拟合函数计算得出的 值 就是二者的误差. 所以 我们可以计算出所有误差的和 , 这个值越小,说明总体拟合是比较好的, 为了防止出现 误差的值正负抵消的情况 (我是这么理解的), 所以我们求误差的值的平方 再求和
所以最后 误差公式是
在这里插入图片描述
如上图 : 这里 a 和 b 是 未知数 ,那么这个问题就转化成了一个数学问题 , 求 当 J 最小的时候 对应的
a , b 的值 ,这里涉及到了多元函数的极值问题 , 由误差函数我们可以知道 当偏导数的值是0的时候,可以求的极小值 ,所以我们可以对这个函数求偏导数 , 当偏导数的值等于0的时候 对应 a b 值
下面是推导过程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里可以对公式进行行简单的变换
在这里插入图片描述

二.代码实现

1.导入依赖

import matplotlib.pyplot as plt

2.画出线性图

x = [2.8 ,2.9, 3.2 ,3.2, 3.4, 3.2, 3.3, 3.7, 3.9, 4.2]
y = [25.3,  27.6,  29.4,   32.3,  34.1,  36.2,  35.3,  39.1,  42,   45]

plt.scatter(x,y)
plt.show()

在这里插入图片描述

3.使用最小二乘法计算参数

# 计算xy的均值
def avg(x):
    m = len(x)
    sum = 0
    
    for num in x:
        sum += num
    
    return sum / m

# 构建拟合函数

def fit(x, y):
    
    # 计算平均值
    x_avg = avg(x)
    y_avg = avg(y)
    m = len(x)
    
    # 计算参数的临时变量
    tmp_1 = 0;
    tmp_2 = 0;
    
    # 使用最小二乘法计算参数 a
    for i in range(m):
        tmp_1 += (x[i] - x_avg) * (y[i] - y_avg)
        tmp_2 += (x[i] - x_avg) ** 2
        
    a = tmp_1 / tmp_2

    # 计算b的值
    b = y_avg - a * x_avg
    
    return a,b
    
a, b = fit(x, y)

print(a)
print(b)
    
13.733100233100233
-11.787878787878775

4.验证

# 使用线性,模型计算值
pre_y = []

for i in range(len(y)):
    pre_y.append(a * x[i] + b)
    

# 使用计算出的值画图
# 散点图加直线
plt.scatter(x, y) # 画散点图
plt.plot(x, pre_y , c='r')
plt.show()

在这里插入图片描述

### 一元线性回归中的最小二乘法推导一元线性回归中,目标是找到一条直线来最好地描述两个变量 \( x \) 和 \( y \) 之间的关系。这条直线可以用下面的方程表示: \[ y = wx + b \] 其中: - \( w \) 是斜率, - \( b \) 是截距。 为了使模型尽可能好地拟合数据集,需要定义一种衡量标准来评估不同参数组合下的误差大小。常用的方法是最小化残差平方和 (RSS),也称为最小二乘法。具体来说,对于给定的数据点集合 \( {(x_i, y_i)}_{i=1}^{n} \),希望找到最优的 \( w \) 和 \( b \),使得所有样本点到该直线的距离之和最小[^1]。 #### 定义损失函数 设实际观测值为 \( y_i \),而根据当前假设得到的预测值为 \( \hat{y}_i = wx_i + b \),则第 i 个样本对应的残差 e 可以写作: \[ e_i = y_i - (\widehat{wx_i+b}) \] 因此,整个训练集中所有样本的总误差 E(w,b) 表达如下: \[ E(w,b)=\sum_{i=1}^ne_i^2=\sum_{i=1}^n(y_i-(wx_i+b))^2 \] 这个表达式就是所谓的 **均方误差** 或者说 **残差平方和** ,它用来度量我们的模型与真实情况之间差距的程度[^2]。 #### 寻找最佳参数 为了让上述公式达到极小值,可以通过对 \( w \) 和 \( b \) 分别偏导数,并令其等于零来进行优化操作。这样做的目的是让这些参数能够最大程度上减小整体误差。下面是具体的计算过程: 针对 \( w \): \[ \frac{\partial}{\partial w}\left[\sum_{i=1}^{n}(y_i-wx_i-b)^2\right]=0 \] 展开后简化可得: \[ 2\cdot(-)\sum_{i=1}^{n}x_ie_i=-2\sum_{i=1}^{n}x_i(y_i-wx_i-b)=0 \] 进一步整理得出关于 \( w \) 的正规方程形式: \[ nwb+\sum_{i=1}^{n}bx_i-\sum_{i=1}^{n}xy_i+w\sum_{i=1}^{n}x_i^2=0 \] 同理,针对 \( b \): \[ \frac{\partial}{\partial b}\left[\sum_{i=1}^{n}(y_i-wx_i-b)^2\right]=0 \] 最终获得另一个正规方程: \[ nb+\sum_{i=1}^{n}wx_i-\sum_{i=1}^{n}y_i=0 \] 联立这两个方程式即可解出 \( w \) 和 \( b \)[^3]。 通过以上步骤完成了一元线性回归最小二乘法公式的理论证明。当有了具体的数值之后就可以带入相应的公式去估算未知系数了。 ```python import numpy as np def compute_coefficients(X, Y): """ 计算简单线性回归的最佳拟合线 """ mean_x = np.mean(X) mean_y = np.mean(Y) num = sum((X-mean_x)*(Y-mean_y)) den = sum(pow((X-mean_x), 2)) slope = num / den intercept = mean_y - slope*mean_x return slope, intercept ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兀坐晴窗独饮茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值