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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_40040107/article/details/90414629

一.原理分析

在这里插入图片描述

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40040107/article/details/90414629
今日推荐