首页 > 编程知识 正文

最大似然估计和OLS,如何求最大似然估计

时间:2023-05-03 23:44:46 阅读:105821 作者:4284

最小二乘法估计曲线拟合参数:

为了简单起见,这里以一元线性回归为例进行介绍。

假设获取了采样点的数据。

用最小二乘法用多项式曲线拟合该组样本点:

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 () )

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。