Python编程实现多项式拟合

Python编程实现多项式拟合

初学机器学习,看到书中讲线性拟合,便试着用Python编程实现。所要拟合的函数为:

f(x)=sin(x)+ξ,x(0,20) f ( x ) = sin ⁡ ( x ) + ξ , x ∈ ( 0 , 20 )

其中, ξ ξ 服从均差为0.3的高斯分布
实现代码如下:

import numpy as np
import matplotlib.pyplot as plt
import math
class PolynomialFitting(object):
    def __init__(self,degree=5,scale=50):
        self.degree=degree
        self.scale=scale
    # 生成特征矩阵X
    def generatingX(self):
        self.x=np.arange(0,20,20/self.scale)
        self.X=np.ones((self.scale,self.degree+1))
        for i in range(self.scale):
            for j in range(self.degree+1):
                self.X[i,j]=math.pow(self.x[i],j)
    # 生成矩阵Y
    def generatingY(self):
        self.Y=np.sin(self.x)+np.random.normal(scale=0.1,size=len(self.x))
        self.Y=self.Y.reshape(self.scale,1)
    # 求系数A
    def generatingA(self):
       self.A=np.linalg.inv(np.dot(self.X.T,self.X)).dot(self.X.T).dot(self.Y)
       print("系数矩阵为:")
       print(self.A)
    # 测试
    def test(self):
        plt.plot(self.x,self.X.dot(self.A),'r')
        plt.plot(self.x,self.Y,'g.')
        plt.title("degree="+str(self.degree))
        plt.show()
def main():
    p=PolynomialFitting(degree=25,scale=1000)
    p.generatingX()
    p.generatingY()
    p.generatingA()
    p.test()
if __name__=="__main__":
    main()

多次改变次数degree,所得结果如下(其中绿点为数据点,红线为拟合曲线):
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
可以看出,次数为15次时效果最好。在多项式拟合中,并不是次数越高拟合效果越好

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值