Python實現最小均方演算法 lms

2021-07-31 17:31:49 字數 3360 閱讀 8528

lms演算法跟rosenblatt感知器相比,主要區別就是權值修正方法不一樣。lms採用的是批量修正演算法,rosenblatt感知器使用的

是單樣本修正演算法。兩種演算法都是單層感知器,也只適用於線性可分的情況。

詳細**及說明如下:

'''

演算法:最小均方演算法(lms)

均方誤差:樣本**輸出值與實際輸出值之差平方的期望值,記為mes

設:observed 為樣本真值,predicted為樣本**值,則計算公式:

(轉換為容易書寫的方式,非數學標準寫法,因為數學符號在這裡不好寫)

mes=[(observed[0]-pridicted[0])*(observed[0]-pridicted[0])+....

(observed[n]-pridicted[n])*(observed[n]-pridicted[n])]/n

''''''

變數約定:大寫表示矩陣或陣列,小寫表示數字

x:表示陣列或者矩陣

x:表示對應陣列或矩陣的某個值

''''''

關於學習效率(也叫步長:控制著第n次迭代中作用於權值向量的調節)。(下面的引數a):

學習效率過大:收斂速度提高,穩定性降低,即出結果快,但是結果準確性較差

學習效率過小:穩定性提高,收斂速度降低,即出結果慢,準確性高,耗費資源

對於學習效率的確定,有專門的演算法,這裡不做研究。僅僅按照大多數情況下的選擇:折中值

'''import numpy as np

a=0.1 #

#學習率 0x=np.array([[1,1],[1,0],[0,1],[0,0]]) #

#輸入矩陣

d=np.array([1,1,1,0]) #

#期望輸出結果矩陣

w=np.array([0,0]) #

#權重向量

expect_e=0.005 #

#期望誤差

maxtrycount=20 #

#最大嘗試次數

##硬限幅函式(即標準,這個比較簡單:輸入v大於0,返回1.小於等於0返回-1)

'''最後的權重為w([0.1,0.1]),則:0.1x+0.1y=0 ==>y=-x

即:分類線方程為:y=-x

'''def sgn(v):

if v>0:

return 1

else:

return 0 #

#跟上篇感知器單樣本訓練的-1比調整成了0,為了測試需要。-1訓練不出結果

##讀取實際輸出

'''這裡是兩個向量相乘,對應的數學公式:

a(m,n)*b(p,q)=m*p+n*q

在下面的函式中,當迴圈中xn=1時(此時w=([0.1,0.1])):

np.dot(w.t,x)=(1,1)*(0.1,0.1)=1*0.1+1*0.1=0.2>0 ==>sgn 返回1

'''def get_v(w,x):

return sgn(np.dot(w.t,x))#

#dot表示兩個矩陣相乘

##讀取誤差值

def get_e(w,x,d):

return d-get_v(w,x)

##權重計算函式(批量修正)

'''對應數學公式: w(n+1)=w(n)+a*x(n)*e

對應下列變數的解釋:

w(n+1) <= neww 的返回值

w(n) <=oldw(舊的權重向量)

a <= a(學習率,範圍:0'''

def neww(oldw,d,x,a):

e=get_e(oldw,x,d)

return (oldw+a*x*e,e)

##修正權值

'''此迴圈的原理:

權值修正原理(批量修正)==>神經網路每次讀入乙個樣本,進行修正,

達到預期誤差值或者最大嘗試次數結束,修正過程結束

'''cnt=0

while true:

err=0

i=0for xn in x:

w,e=neww(w,d[i],xn,a)

i+=1

err+=pow(e,2) #

#lms演算法的核心步驟,即:mes

err/=float(i)

cnt+=1

print(u"

第 %d 次調整後的權值:

"%cnt)

print(w)

print(u"

誤差:%f

"%err)

if error cnt>=maxtrycount:

break

print("

最後的權值:

",w.t)

##輸出結果

print("

開始驗證結果...

")for xn in x:

print("

d%s and w%s =>%d

"%(xn,w.t,get_v(w,xn)))

##測試準確性:

'''由上面的說明可知:分類線方程為y=-x,從座標軸上可以看出:

(2,3)屬於+1分類,(-2,-1)屬於0分類

'''print("

開始測試...

")test=np.array([2,3])

print("

d%s and w%s =>%d

"%(test,w.t,get_v(w,test)))

test=np.array([-2,-1])

print("

d%s and w%s =>%d

"%(test,w.t,get_v(w,test)))

輸出結果:

第 1 次調整後的權值:

[ 0.1 0.1]

誤差:0.250000

第 2 次調整後的權值:

[ 0.1 0.1]

誤差:0.000000

最後的權值: [ 0.1 0.1]

開始驗證結果...

d[1 1] and w[ 0.1 0.1] =>1

d[1 0] and w[ 0.1 0.1] =>1

d[0 1] and w[ 0.1 0.1] =>1

d[0 0] and w[ 0.1 0.1] =>0

開始測試...

d[2 3] and w[ 0.1 0.1] =>1

d[-2 -1] and w[ 0.1 0.1] =>0

從結果看出,經過2次訓練,就得出了最優結果。

補充說明:經過多次調整樣本或者權重,在20次迴圈中有時候出結果,有時候找不到最優解。所以在實驗過程中,沒有達到

預期結果,除了迴圈次數不夠之外,最大的可能就是樣本或者權值設定的問題。

最小均方演算法(LMS)

lms演算法是自適應濾波器中常用的一種演算法,與維納演算法不同的是,其系統的係數隨輸入序列而改變。維納演算法中擷取輸入序列自相關函式的一段構造系統的最佳係數。而lms演算法則是對初始化的濾波器係數依據最小均方誤差準則進行不斷修正來實現的。因此,理論上講lms演算法的效能在同等條件下要優於維納演算法,...

最小均方演算法(LMS)的原理

最小均方演算法 least mean square,lms 是一種簡單 應用為廣泛的自適應濾波演算法,是在維納濾波理論上運用速下降法後的優化延伸,早是由 widrow 和 hoff 提出來的。該演算法不需要已知輸入訊號和期望訊號的統計特徵,當前時刻 的權係數是通過 上一 時刻 權係數再加上乙個負均方...

最小均方誤差(MMSE)

mmse是乙個model用來最小化mean square error mse 什麼是最小均方誤差?讓我們從通道模型說起 mmse是一種方法,讓接到的資料盡可能更加接近傳送的資料,所以mmse的目的就是找乙個矩陣g,來讓gy更加接近x 接下來我們的目標就是解決這個式子gy x,讓gy更加接近x,我們認...