最小二乘法估计曲线拟合参数:
为了简单起见,这里以一元线性回归为例进行介绍。
假设获取了采样点的数据。
用最小二乘法用多项式曲线拟合该组样本点:
1、拟合多项式如下
2、采样点到该曲线的距离平方和为:
目标函数:
上式对参数求偏导
上式与以下内容等价
如果存在x’x的逆矩阵:
解析解,也就是一步一步的解法
测试中,假设基于曲线y=(x2-1 )3)3)3 (x-0.5 )2) 3sin ) 2x )随机地扩展处理x和y而生成训练样本,假设拟合多项式阶为9 )。 用上述方法拟合的结果如下图所示。
Python代码如下所示。
导入编号为NP
导入随机
import matplotlib.pyplot as plt
fig=plt.figure (
ax=fig.add_subplot(111 ) )
#次数为9
订单=9
生成采样点
x=NP.arange (-1,1,0.02 ) ) ) ) ) )。
y=[(a*a-1 ) *3) a-0.5 ) *2)3*NP.sin )2*a ) ) for a in x]
#ax.plot(x,y,color='r ',linestyle='-',marker=' ' )
x _ a=[ B1 * (random.randint (90,120 )/100 for b1 in x]
y _ a=[ B2 * (random.randint (90,120 )/100 for b2 in y] )
ax.plot(x_a,y_a,color='m ',linestyle=',marker='.' )
#曲线拟合
#创建矩阵
#初始化为数组
array_x=[0forIinrange(order1) ] foriinrange (len ) x_a ) ]
#代入二维数组
forIinrange(0,order 1) :
forjinrange(0,Len ) x_a ) ) :
array_x[j][i]=x_a[j]**i
#将赋值的二维数组转换为矩阵
matx=NP.matrix(Array_x ) ) ) ) ) ) ) ) ) ) matx=NP.matrix(Array_x )。
matrix_A=matx.T*matx
YY=NP.matrix (NP.array (y _ a ) ) ) ) ) ) ) ) ) )。
matrix_B=matx.T*yy.T
mataa=NP.LinaLG.solve(matrix_a,matrix_B ).tolist ) ) ) ) ) ) ) ) )。
绘制拟合后的曲线
xxa=NP.arange (-1,1.06,0.01 ) ) ) ) ) ) ) ) ) ) ) )。
yya=[]
forIinrange(0,Len ) XXA ) ) :
yyy=0.0
forjinrange(0,order 1) :
dy=1.0
forkinrange(0,j ) :
dy*=xxa[i]
dy*=matAA[j][0]
yyy=dy
ya.append(yyy )。
ax.plot(XXA,yya,color='g ',linestyle='-',marker=' ' )
ax.legend () )
plt.show () )
多元线性回归中参数的最大似然估计:
假设您有m个训练样本(x,y )。
假设预测值与样本特征之间的函数关系是线性的。 也就是说,线性回归分析在于根据样本x和样本y的观察值估计函数h(x ),定义如下:
1 .关于第一个训练样本,假设估计对象函数h(x )与真值y有误差,则如下式:
假设:误差(即噪声)按照标准正太分布,如下所示。
2、单样本下组样本观测值的概率密度函数为:
3、根据最大似然概率标准得到的似然函数如下。
目标函数为max(L ) w ) )
4、与第一部分相同,对上式求出偏导数,使其等于0即可得到。
上式仅在逆矩阵存在时适用。
在测试中,假设样本生成式为: y=0.5x4* rand uniform (0,1 ) sin ) 2x ) 3.5,用上述方法进行多元线性回归的结果如下图所示。
Python代码如下所示。
导入编号为NP
导入随机
import matplotlib.pyplot as plt
生成采样点
x=NP.arange (-50,50,0.2 ) )。
array_x=[]
array_y=[]
for a in x:
lineX=[1]
linex.append(a ) )。
array_x.append(Linex ) )。
array _ y.append (0.5 * a 3.5 random.uniform (0,1 ) *4*NP.sin )2*a ) )
#线性回归
xmat=NP.mat(Array_x ) )
ymat=NP.mat(Array_y ).t
xTx=xMat.T*xMat
w=xTx.I*xMat.T*yMat
y=xMat*w
#画画
PLT.title (线性注册) )。
PLT.xlabel(independentvariable )。
PLT.ylabel(dependentvariable ) )。
PLT.plot(x,array_y,color='g ',linestyle=',marker='.' )
PLT.plot(x,y,color='r ',linestyle='-',marker=' ' )
plt.show () )