一元非線性迴歸-多項式函式擬合
阿新 • • 發佈:2018-12-31
# 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()