python_numpy最小二乘法的曲線擬合

在了解了最小二乘法的基本原理之后python_numpy實用的最小二乘法理解饶深,就可以用最小二乘法做曲線擬合了

1.直線擬合

直線擬合

已知圖中擬合數據的坐標数尿,對圖中的擬合數據進行直線擬合蜜另。
依舊使用最小二乘法求解
Ax=b——————1
無解下的最優(yōu)解。已知點的個數為n货邓,所求直線的方程為y1=ax1+b,A由方程右邊的a四濒,b的系數構成構成(nx2)的矩陣,每行為(x1,1)换况,b由已知點的y1坐標構成矩陣(nx1)。方程1中的x為要求的列向量[a,b]盗蟆。
A.TAx'=A.Tb
x'=(A.TA)^(-1)A.TC
求得x‘后戈二,畫出擬合曲線的yy=Ax'

import numpy as np  
import matplotlib.pyplot as plt  
    
#x的個數決定了樣本量
x = np.arange(-1,1,0.02) 
#y為理想函數 
y = 2*np.sin(x*2.3)+0.5*x**3
#y1為離散的擬合數據
y1 = y+0.5*(np.random.rand(len(x))-0.5)


##################################
#主要程序
one=np.ones((len(x),1))#len(x)得到數據量
x=x.reshape(x.shape[0],1)
A=np.hstack((x,one))#兩個100x1列向量合并成100x2,(100, 1) (100,1 ) (100, 2)
C=y1.reshape(y1.shape[0],1)
#等同于C=y1.reshape(100,1)
#雖然知道y1的個數為100但是程序中不應該出現人工讀取的數據

def optimal(A,b):
    B = A.T.dot(b)
    AA = np.linalg.inv(A.T.dot(A))#求A.T.dot(A)的逆
    P=AA.dot(B)
    print P
    return A.dot(P)

#求得的[a,b]=P=[[  2.88778507e+00] [ -1.40062271e-04]]
yy = optimal(A,b)
#yy=P[0]*x+P[1]
##################################
plt.plot(x,y,color='g',linestyle='-',marker='',label=u'理想曲線') 
plt.plot(x,y1,color='m',linestyle='',marker='o',label=u'擬合數據')
plt.plot(x,yy,color='b',linestyle='-',marker='.',label=u"擬合曲線") 
# 把擬合的曲線在這里畫出來
plt.legend(loc='upper left')
plt.show()

直線擬合結果

從結果中可以看出,直線擬合并不能對擬合數據達到很好的效果喳资,下面我們介紹一下曲線擬合觉吭。

2.曲線擬合

曲線擬合

圖中的擬合數據如果用直線進行擬合效果會更差,曲線能更好的表達數據的特征仆邓。這里我們使用多項式函數進行擬合鲜滩。
擬合函數:
y=axn+bx(n-1)+cx^(n-2)+...+d
假設擬合數據共有100個
Ax=b
A=[x1^n x1^(n-1) x1^(n-2) ...... 1]
[x2^n x2^(n-1) x2^(n-2) ...... 1]
......
[x100^n x100^(n-1) x100^(n-2) . 1]

b=[y1]
[y2]
......
[y100]

解得擬合函數的系數[a,b,c.....d]
CODE:

import numpy as np  
import matplotlib.pyplot as plt  
    
x = np.arange(-1,1,0.02)  
y = ((x*x-1)**3+1)*(np.cos(x*2)+0.6*np.sin(x*1.3))

y1 = y+(np.random.rand(len(x))-0.5)

##################################
### 核心程序
#使用函數y=ax^3+bx^2+cx+d對離散點進行擬合,最高次方需要便于修改节值,所以不能全部列舉徙硅,需要使用循環(huán)
#A矩陣
m=[]
for i in xrange(7):#這里選的最高次為x^7的多項式
    a=x**(i)
    m.append(a)
A=np.array(m).T
b=y1.reshape(y1.shape[0],1)

##################################

def projection(A,b):
    AA = A.T.dot(A)#A乘以A轉置
    w=np.linalg.inv(AA).dot(A.T).dot(b)
    print w#w=[[-0.03027851][ 0.1995869 ] [ 2.43887827] [ 1.28426472][-5.60888682] [-0.98754851][ 2.78427031]]
    return A.dot(w)

yw = projection(A,b)
yw.shape = (yw.shape[0],)

plt.plot(x,y,color='g',linestyle='-',marker='',label=u"理想曲線") 
plt.plot(x,y1,color='m',linestyle='',marker='o',label=u"已知數據點")
plt.plot(x,yw,color='r',linestyle='',marker='.',label=u"擬合曲線")
plt.legend(loc='upper left')
plt.show()
結果

根據結果可以看到擬合的效果不錯。
我們可以通過改變

  • 擬合函數類型
  • 樣本數(此處為x的個數)

來調整擬合效果搞疗。
如果此處我們把擬合函數改為最高次為x^20的多項式

m=[]
for i in xrange(20):
    a=x**(i)
    m.append(a)

所得結果如下:

x^20 樣本數100

這種現象稱為過擬合現象

  • 可以通過增加樣本數數嗓蘑,
  • 降低擬合函數的次數

矯正過擬合現象
在保持擬合函數改為最高次為x^20的多項式的條件下,增大樣本數:

x = np.arange(-1,1,0.005) #原來是x = np.arange(-1,1,0.02)  
x^20 樣本數400

通過結果可以看出匿乃,過擬合現象得到了改善桩皿。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市幢炸,隨后出現的幾起案子泄隔,更是在濱河造成了極大的恐慌,老刑警劉巖阳懂,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梅尤,死亡現場離奇詭異,居然都是意外死亡岩调,警方通過查閱死者的電腦和手機巷燥,發(fā)現死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來号枕,“玉大人缰揪,你說我怎么就攤上這事。” “怎么了钝腺?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵抛姑,是天一觀的道長。 經常有香客問我艳狐,道長定硝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任毫目,我火速辦了婚禮蔬啡,結果婚禮上,老公的妹妹穿的比我還像新娘镀虐。我一直安慰自己箱蟆,他們只是感情好,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布刮便。 她就那樣靜靜地躺著空猜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恨旱。 梳的紋絲不亂的頭發(fā)上辈毯,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機與錄音窖杀,去河邊找鬼漓摩。 笑死,一個胖子當著我的面吹牛入客,可吹牛的內容都是我干的。 我是一名探鬼主播腿椎,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桌硫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了啃炸?” 一聲冷哼從身側響起铆隘,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎南用,沒想到半個月后膀钠,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡裹虫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年肿嘲,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筑公。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡雳窟,死狀恐怖,靈堂內的尸體忽然破棺而出匣屡,到底是詐尸還是另有隱情封救,我是刑警寧澤拇涤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站誉结,受9級特大地震影響鹅士,放射性物質發(fā)生泄漏。R本人自食惡果不足惜惩坑,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一如绸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旭贬,春花似錦怔接、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奋刽,卻和暖如春瓦侮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背佣谐。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工肚吏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狭魂。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓罚攀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雌澄。 傳聞我的和親對象是個殘疾皇子斋泄,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內容