古詩詞大全網 - 成語故事 - 什麽是H-K算法

什麽是H-K算法

其實HK算法思想很樸實,就是在最小均方誤差準則下求得權矢量.

他相對於感知器算法的優點在於,他適用於線性可分和非線性可分得情況,對於線性可分的情況,給出最優權矢量,對於非線性可分得情況,能夠判別出來,以退出叠代過程.

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達到最小值。由於上式中包括的

n

1

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)|]