他相對於感知器算法的優點在於,他適用於線性可分和非線性可分得情況,對於線性可分的情況,給出最優權矢量,對於非線性可分得情況,能夠判別出來,以退出叠代過程.
2.在程序編制過程中,我所受的最大困擾是:關於收斂條件的判決.
對於誤差矢量:e=x*w-b
若e>0 則繼續叠代
若e=0 則停止叠代,得到權矢量
若e〈0 則停止叠代,樣本是非線性可分得,
若e有的分量大於0,有的分量小於0 ,則在各分量都變成零,或者停止由負值轉變成正值時,停機.
3.在程序編制中的註意點:
1)關於0的判斷,由於計算機的精度原因,嚴格等於零是很不容易的,而且在很多情況下也沒有必要,則只要在0的壹個可以接受的delta域內就可接受為零
2)關於判斷,叠代前後,變量是否發生變化
在判斷時,顯然也不能直接判斷a(i)==a(i+1)
而應該|a(i)-a(i+1)|〈err
4.HK詳細代碼如下:
unction [w,flag]=HK(data)
Iteration=20;
flag=0;
% [n,p]=size(data);
n=size(data,1);
b=ones(n,1)./10;
c=0.6;
xx=inv(data'*data)*data';
w=xx*b;
e=data*w-b;
t=0;
while (1)
temp=min(e);
temp1=max(e);
if temp>-1e-4 && temp1e-3
deltab=e+abs(e);
b=b+c.*deltab;
w=w+c.*xx*deltab;
e=data*w-b;
else
if temp>=0 && temp1
H-K算法是求解Xw=b,式中b=( b1, b2, …, bn)T,b的所有分量都是正值。這裏要同時計算w和b,我們已知X不是N*N的方陣,通常是行多於列的N*(n+1)階的長方陣,屬於超定方程,因此壹般情況下,Xw=b沒有唯壹確定解,但可求其線性最小二乘解。
設Xw=b的線性最小二乘解為w*,即使||Xw*-b||=極小 采用梯度法,定義準則函數:
)bXw()bXw(2
1bXw21)bxw(21)b,x,w(JT2
n1i2iiT?
當Xw=b的條件滿足時,J達到最小值。由於上式中包括的
n1
i2iiT
)bxw
(項為兩個數量方差的和,且我們將使其最小化,因此也
稱之為最小均方誤差算法。
使函數J同時對變量w和b求最小。對於w的梯度為:
)bXw(Xw
J
T 使0w
J
,得XT(Xw-b)=0,從而XTXw=XTb。因為XTX為(n+1)*(n+1)階方陣,因此可求得解:w = (XTX)-1XTb = X#b
這裏X#= (XTX)-1XT稱為X的偽逆,X是N*(n+1)階的長方陣。
由上式可知,只要求出b即可求得w。利用梯度法可求得b的叠代公式為:
)
k(bbbJC)k(b)1k(b
根據上述約束條件,在每次叠代中,b(k)的全部分量只能是正值。由J的準則函數式,J也是正值,因此,當取校正增量C為正值時,為保證每次叠代中的b(k)都是正值,應使)
k(bbbJ
為非正值。在此條件下,準則函數J的微分為:|bXw|)bXw(bJ2)
k(bb?
該式滿足以下條件:
若[Xw(k) – b(k)] > 0,則)k(b)k(XwbJ)
k(bb?
若[Xw(k) – b(k)] < 0,則0bJ)k(bb? 由b的叠代式和微分,有:
b(k+1) = b(k) +δb(k)
δb(k) = C[Xw(k) – b(k) + | Xw(k) – b(k)|]
將此式代入w=X#b,有:
w(k+1) = X#b(k+1) = X#[b(k) +δb(k)] = w(k) + X#δb(k)
為簡化起見,令e(k) = Xw(k) – b(k),可得H-K算法的叠代式。
設初值為b(1),其每壹分量均為正值,則:
w(1) = X#b(1) e(k) = Xw(k) – b(k)
w(k+1) = w(k) + X#{C[Xw(k) – b(k) + |Xw(k) – b(k)|]}
= w(k) + CX#[e(k) + |e(k)|]
由於
X#e(k) = X#[Xw(k) – b(k)] = (XTX)-1XT[Xw(k) – b(k)]
= w(k) –X#b(k) = 0
因此
w(k+1) = w(k) + CX#|e(k)|
b(k+1) = b(k) + C[Xw(k) – b(k) + |Xw(k) – b(k)|]
= b(k) + C[e(k) + |e(k)|]