Colección de citas famosas - Colección de máximas - ¿Qué es el algoritmo H-K?

¿Qué es el algoritmo H-K?

De hecho, la idea del algoritmo HK es muy simple, que es obtener el vector de peso bajo el criterio de error cuadrático medio mínimo.

Su ventaja sobre el algoritmo perceptrón es que es adecuado para situaciones separables linealmente y no lineales. Para situaciones separables linealmente, se proporciona el vector de peso óptimo. Para situaciones separables no lineales, se puede distinguir para salir del proceso iterativo.

2. el programa Durante el proceso de compilación, el mayor problema que sufrí fue: el juicio sobre las condiciones de convergencia.

Para el vector de error: e=x*w-b

Si egt; continuar iterando

p>

Si e=0, detiene la iteración y obtiene el vector de peso

Si e<0, detiene la iteración, la muestra es separable no linealmente,

Si e tiene un componente mayor que 0 y algunos componentes son menores que 0, la máquina se detendrá cuando cada componente se vuelva cero o dejará de cambiar de negativo a positivo.

3 Puntos a tener en cuenta en la programación:

p>

1) Con respecto al juicio de 0, debido a la precisión de la computadora, no es fácil ser estrictamente igual a cero y en muchos casos no es necesario. casos Siempre que esté dentro de un dominio delta aceptable de 0, se puede aceptar como cero

2) En cuanto al juicio, si las variables cambian antes y después de la iteración

Durante el juicio. , obviamente no es posible juzgar directamente a(i)==a(i 1)

En su lugar, debería ser |a(i)-a(i 1)|〈err

El código detallado de 4.HK es el siguiente:

unction [w, flag]=HK( data)

Iteration=20; bandera=0;

[n, p]=tamaño(datos);

n =tamaño(datos, 1

b=ones(n); , 1)./10;

c=0.6;

xx=inv(datos '*datos)*datos'; ;

e=datos*w-b;

t=0;

mientras (1)

temp=min(e);

temp1=max(e);

si tempgt;-1e-4 amp; temp1e-3

deltab=e abs(e);

b=b c.*deltab;

w=w c.*xx* deltab

e=datos*w-b; p>else

if tempgt;=0 amp; temp1

El algoritmo H-K es Resuelva para Xw=b, donde b=( b1, b2,…, bn)T, y todo los componentes de b son valores positivos. Aquí necesitamos calcular w y b al mismo tiempo. Sabemos que =b no tiene una solución única, pero se puede encontrar su solución lineal de mínimos cuadrados.

Supongamos que la solución lineal de mínimos cuadrados de Xw=b es w*, incluso si || ()bXw(2

1bXw21)bxw(21)b,x,w(JT2

n1i2iiT? ​​​​

Cuando se cumple la condición de Xw=b, J alcanza el valor mínimo desde n

1

<. p>i2iiT

)bxw

(el término en la fórmula anterior son dos cantidades. La suma de las varianzas, y la minimizaremos, por eso también se le llama mínimo cuadrado medio algoritmo de error

Hacer que la función J minimice las variables w y b al mismo tiempo.

El gradiente de w es:

)bXw(Xw

J

T Sea 0w

J, obtenga XT(Xw-b )=0, entonces XTXw=XTb Debido a que XTX es una matriz cuadrada de orden (n 1)*(n 1), la solución se puede obtener:

w = (XTX)-1XTb = X#. b

Aquí X#= (XTX)-1XT se llama pseudoinversa de X, y X es una matriz rectangular de orden N*(n 1).

De la fórmula anterior. , solo necesitamos encontrar que b se puede usar para obtener w. La fórmula iterativa para b se puede obtener usando el método de gradiente:

)

k(bbbJC)k(b) 1k(b

De acuerdo con las restricciones anteriores, en cada iteración, todos los componentes de b(k) solo pueden ser valores positivos. Según la función de criterio de J, J también es un valor positivo. Por lo tanto, cuando el incremento de corrección C se toma como un valor positivo, para garantizar que b (k) en cada iteración sea un valor positivo, se debe hacer)

k(bbbJ es un valor no- valor positivo Bajo esta condición, el diferencial de la función criterio J es:

|bXw|)bXw(bJ2)

k(bb?

Esto. la fórmula satisface las siguientes condiciones:

Si [Xw(k) – b(k)] gt 0, entonces)k(b)k(XwbJ)

k(bb? Si [Xw(k) – b(k)] lt; 0, entonces 0bJ)

k(bb? De la iteración y el diferencial de b, tenemos:

b( k 1) = b(k) δb(k)

δb( k) = C[Xw(k) – b(k) | p>w(k 1) = X#b(k 1 ) = X#[b(k) δb(k)] = w(k) X#δb(k)

Para simplificar, sea e(k) =

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

Desde

X#e(k) = X#[Xw(k) – b(k)] = (XTX)-1XT[Xw(k) – b(k )]

= w(k) –X#b(k) = 0

Por lo tanto

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