1. 程式人生 > >一元非線性迴歸-多項式函式擬合

一元非線性迴歸-多項式函式擬合

# coding=utf-8

'''
作者:Xiaole Wen
程式:多項式曲線擬合演算法
'''
import matplotlib.pyplot as plt
import math
import numpy
import random

fig = plt.figure()
ax = fig.add_subplot(111)

#在這裡給出擬合多項式的階數
order=9

#生成曲線上的各個點
x = numpy.arange(-1,1,0.02)
y = [((a*a-1)*(a*a-1)*(a*a-1)+0.5)*numpy.sin(a*2) for a in x]
#ax.plot(x,y,color='r',linestyle='-',marker='')
#,label="(a*a-1)*(a*a-1)*(a*a-1)+0.5"
plt.plot(x,y)                                                                                                                                     #生成的曲線上的各個點偏移一下,並放入到xa,ya中去
i=0
xa=[]
ya=[]
for xx in x:
    yy=y[i]
    d=float(random.randint(60,140))/100
    #ax.plot([xx*d],[yy*d],color='m',linestyle='',marker='.')
    i+=1
    xa.append(xx*d)
    ya.append(yy*d)

ax.plot(xa,ya,color='m',linestyle='',marker='.')
#儲存從0次到m次的所有冥方和
bigMat=[]
for j in range(0,2*order+1):
    sum=0
    for i in range(0,len(xa)):
        sum+=(xa[i]**j)
    bigMat.append(sum)

#計算線性方程組係數矩陣
matA=[]
for rowNum in range(0,order+1):
    row=bigMat[rowNum:rowNum+order+1]
    matA.append(row)

matA=numpy.array(matA)

matB=[]
for i in range(0,order+1):
    ty=0.0
    for k in range(0,len(xa)):
        ty+=ya[k]*(xa[k]**i)
    matB.append(ty)

matB=numpy.array(matB)

matAA=numpy.linalg.solve(matA,matB)

#畫出擬合後的曲線
#print(matAA)
xxa= numpy.arange(-1,1.06,0.01)
yya=[]
for i in range(0,len(xxa)):
    yy=0.0
    for j in range(0,order+1):
        dy=(xxa[i]**j)
        dy*=matAA[j]
        yy+=dy
    yya.append(yy)
ax.plot(xxa,yya,color='g',linestyle='-',marker='')

ax.legend()
plt.show()