一.原理分析
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()