线性回归试图学得
使得约等于
如何确定w和b是解决这个问题的关键。
均方差是回归任务中常用的性能度量,因此我们可以试图让均方误差最小化,即
均方差具有非常好的几何意义,对应了常用的欧几何距离,基于均方差最小化来进行模型求解的方法称为最小二乘法。在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线的欧式距离之和最小。
我们定义了一个损失函数,我们尽量使损失函数值最小,也就是上面说的均方差最小。通过不断拟合,我们最终求得k,b值,使用最小二乘法算法求拟合直线完成
代码参考 机器学习:最小二乘法实际应用的一个完整例子 - lc19861217 - 博客园
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
#代码参考 https://www.cnblogs.com/lc1217/p/6651247.html?utm_source=itdadao&utm_medium=referral
##样本数据(Xi,Yi),需要转换成数组(列表)形式
Xi=np.array([160,165,158,172,159,176,160,162,171])
Yi=np.array([58,63,57,65,62,66,58,59,62])
##需要拟合的函数func :指定函数的形状 k= 0.42116973935 b= -8.28830260655
def func(p,x):
k,b=p
return k*x+b
##偏差函数:x,y都是列表:这里的x,y更上面的Xi,Yi中是一一对应的
def error(p,x,y):
return func(p,x)-y
#k,b的初始值,可以任意设定,经过几次试验,发现p0的值会影响cost的值:Para[1]
p0=[1,20]
#把error函数中除了p0以外的参数打包到args中(使用要求)
Para=leastsq(error,p0,args=(Xi,Yi))
#读取结果
k,b=Para[0]
print("k=",k,"b=",b)
#画样本点
plt.figure(figsize=(8,6)) ##指定图像比例: 8:6
plt.scatter(Xi,Yi,color="green",label="data",linewidth=2)
#画拟合直线
x=np.linspace(150,190,100) ##在150-190直接画100个连续点
y=k*x+b ##函数式
plt.plot(x,y,color="red",label="Fitting line",linewidth=2)
plt.legend() #绘制图例
plt.show()