利用高中知识求解最小二乘法

使用配方法求解最小二乘拟合函数参数的推导过程

函数原型

函数原型:y = w*x + b
其中x是自变量,y是因变量,w是斜率,b是截距。

样本说明

(x1, y1)代表第1个样本点的数据,
(x2, y2)代表第2个样本点的数据,
以此类推
(xn, yn)代表第n个样本点的数据。
这些都是已知量。

x’代表样本在x轴的平均值,
y’代表样本在y轴的平均值。
这两个变量通过已知量计算平均值求出。

问题

求出能使
(wx1 + b - y1)² + (wx2 + b - y2)² +…+(wxn + b - yn)²
的结果最小的w和b的值

第一步,对b进行配方法,配成b的完全平方式

将上式转换为:
(b - (y1-wx1))² + (b - (y2-wx2))² +(b - (y3-wx3))² (式1)

展开式1:
b² -2b(y1-wx1)+ (y1-wx1)²
+b² -2b(y2-wx2)+ (y2-wx2)²
+…
+b² -2b(yn-wxn)+ (yn-wxn)²

合并b的同类项:
nb² -2b(y1-wx1 + y2-wx2 + …+yn-wxn) + 其他不含b的项

将上式中的第二项中的y1 + y2 +…+yn合并,那么这就是y的和,如果将y’定义为y的平均值,那么y的和也等于ny’,同理,x的和也等于nx’。

上式转换为:nb² -2b(ny’ - nx’) + 其他不含b的项

将n提取出来:n(b² - 2b(y’ - wx’)) + 其他不含b的项

利用配方法配平平方式,上式就转换为:
n(b - (y’ - wx’))² + 其他不含b的项
要让整个式子的值最小,n(b - (y’ - wx’))²必须等于0,即:
b必须等于y’- wx’, 由此得出:
b = y’- wx’ (式2)

第二步,对w进行配方法,配成w的完全平方式

(b - (y1-wx1))² + (b - (y2-wx2))² +(b - (y3-wx3))² (式1)
b = y’ - wx’ (式2)

要让式1的结果最小,将式2带入式1中,式1转换为:
( y’- wx’- (y1-wx1))² + ( y’- wx’- (y2-wx2))² +…+ ( y’- wx’- (yn-wxn))² (式3)

式3可以转换为:
( y’- wx’- y1+wx1))² + ( y’- wx’- y2+wx2))² +…+ ( y’- wx’- yn+wxn))²

合并每个平方中的w,上式可转换为:
(w(x1- x’) - (y1-y’))² + (w(x2- x’) - (y2-y’))² +…+(w(xn- x’) - (yn-y’))²

展开上式:
w²(x1-x’)² -2w(x1-x’)(y1-y’) +(y1-y’)² +
w²(x2-x’)² -2w(x2-x’)(y2-y’) +(y2-y’)² +

w²(xn-x’)² -2w(xn-x’)(yn-y’) +(yn-y’)²

合并包含w的项:
w²[(x1-x’)² + (x2-x’)² +…+(xn-x’)² ] -
2w[(x1-x’)(y1-y’) + (x2-x’)(y2-y’) +…+(xn-x’)(yn-y’)] +常数项

将[(x1-x’)² + (x2-x’)² +…+(xn-x’)² ]定义为A
将[(x1-x’)(y1-y’) + (x2-x’)(y2-y’) +…+(xn-x’)(yn-y’)]定义为B

上式就可以转换为:
W²*A -2W*B + 常数项

将上式用配方法转换为完全平方式并合并成差平方的格式,上式就可以转换为:
A(W-B/A)² + 常数项

此时要使整个式子的结果最小,必须:
W=B/A

B = [(x1-x’)(y1-y’) + (x2-x’)(y2-y’) +…+(xn-x’)(yn-y’)]
利用求和符号Σ可以将[(x1-x’)(y1-y’) + (x2-x’)(y2-y’) +…+(xn-x’)(yn-y’)]表示为:
在这里插入图片描述

A=[(x1-x’)² + (x2-x’)² +…+(xn-x’)² ],利用求和符号可以表示为:
在这里插入图片描述

由w=B/A,因此w的结果就是:
在这里插入图片描述

结论:

在这里插入图片描述

python案例:

#按照 y = 2x + 0.6 构造样本, w = 2, b = 0.6 
x=[1,2,3,4,5,6,7,8,9,10]
y=[2.59,4.61,6.59,8.61,10.59,12.61,14.59,16.61,18.59,20.61]

#循环计算出x和y的和,再求平均值
length = len(x) #先计算样本长度
sumx  = 0 #自变量的和
sumy  = 0 #因变量的和
for i in range(length):
    sumx = sumx + x[i]
    sumy = sumy + y[i]

x_ave = sumx/length
y_ave = sumy/length

#利用循环计算w的分子和分母
numerator = 0
denominator = 0
for n in range(length):  
    numerator = numerator + (x[n] - x_ave)*(y[n] - y_ave)       
    denominator = denominator + (x[n] - x_ave)*(x[n] - x_ave)

w = numerator/denominator
b = y_ave - w*x_ave

print("w =",w, "b =",b)

计算结果:
w = 2.000606060606061 b = 0.596666666666664

欢迎收看:如何自学人工智能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值