【代码】最小二乘法线性拟合Python实现(不使用任何数学库函数)

版权声明:偷我的我会气死的, 希望你去访问我的个人主页:crazyang.top https://blog.csdn.net/yzy_1996/article/details/81064140

文章最后是代码,是用最简单的方式来实现最小二乘,除了使用了一个读取csv文件的库以外不再调用其他库。

最小二乘法的原理我就不再介绍了,现引用维基百科的一个例子。

----------------------------------------------------------------------------------------------------------------------------

某次实验得到了四个数据点(x, y)(1,6)(2,5)(3,7)(4,10)。我们希望找出一条和这四个点最匹配的直线 y=\beta _{1}+\beta _{2}x,即找出在某种“最佳情况”下能够大致符合如下超定线性方程组的 \beta _{1} 和 \beta _{2}

{\begin{alignedat}{4}\beta _{1}+1\beta _{2}&&\;=\;&&6&\\\beta _{1}+2\beta _{2}&&\;=\;&&5&\\\beta _{1}+3\beta _{2}&&\;=\;&&7&\\\beta _{1}+4\beta _{2}&&\;=\;&&10&\\\end{alignedat}}

最小二乘法采用的手段是尽量使得等号两边的方差最小,也就是找出这个函数的最小值:

{\begin{aligned}S(\beta _{1},\beta _{2})=&\left[6-(\beta _{1}+1\beta _{2})\right]^{2}+\left[5-(\beta _{1}+2\beta _{2})\right]^{2}\\&+\left[7-(\beta _{1}+3\beta _{2})\right]^{2}+\left[10-(\beta _{1}+4\beta _{2})\right]^{2}.\\\end{aligned}}

最小值可以通过对S(\beta _{1},\beta _{2}) 分别求 \beta _{1} 和 \beta _{2} 的偏导数,然后使它们等于零得到。

{\frac  {\partial S}{\partial \beta _{1}}}=0=8\beta _{1}+20\beta _{2}-56

{\frac  {\partial S}{\partial \beta _{2}}}=0=20\beta _{1}+60\beta _{2}-154.

如此就得到了一个只有两个未知数的方程组,很容易就可以解出:

\beta _{1}=3.5

\beta _{2}=1.4

也就是说直线 y=3.5+1.4x 是最佳的。

--------------------------------------------------------------------------------------------------------------------------------

你需要先自己构建一个csv文件,可以通过我的文件下载https://github.com/yzy1996/Least-squares or https://download.csdn.net/download/yzy_1996/10545871

import pandas as pd

sales=pd.read_csv('train_data.csv',sep='\s*,\s*',engine='python')  #读取CSV
X=sales['X'].values    #存csv的第一列
Y=sales['Y'].values    #存csv的第二列

#初始化赋值
s1 = 0
s2 = 0
s3 = 0
s4 = 0
n = 4 

#循环累加
for i in range(n):
	s1 = s1 + X[i]*Y[i]
	s2 = s2 + X[i]
	s3 = s3 + Y[i]
	s4 = s4 + X[i]*X[i]
	
#计算斜率和截距
b = (s2*s3-n*s1)/(s2*s2-s4*n)
a = (s3 - b*s2)/n
print("Coeff: {} Intercept: {}".format(b, a))

对代码进行解释,最重要的就是s1、s2、s3、s4的计算,根据上面的公式我们可以得到,自己去推导吧,很容易的。

最终的代码结果是与百科结果是一样的

猜你喜欢

转载自blog.csdn.net/yzy_1996/article/details/81064140
今日推荐