版权声明:偷我的我会气死的, 希望你去访问我的个人主页:crazyang.top https://blog.csdn.net/yzy_1996/article/details/81064140
文章最后是代码,是用最简单的方式来实现最小二乘,除了使用了一个读取csv文件的库以外不再调用其他库。
最小二乘法的原理我就不再介绍了,现引用维基百科的一个例子。
----------------------------------------------------------------------------------------------------------------------------
某次实验得到了四个数据点:、、、。我们希望找出一条和这四个点最匹配的直线 ,即找出在某种“最佳情况”下能够大致符合如下超定线性方程组的 和 :
最小二乘法采用的手段是尽量使得等号两边的方差最小,也就是找出这个函数的最小值:
最小值可以通过对 分别求 和 的偏导数,然后使它们等于零得到。
如此就得到了一个只有两个未知数的方程组,很容易就可以解出:
也就是说直线 是最佳的。
--------------------------------------------------------------------------------------------------------------------------------
你需要先自己构建一个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的计算,根据上面的公式我们可以得到,自己去推导吧,很容易的。
最终的代码结果是与百科结果是一样的