Hopf10x12i.mws
Данные образцов (поместить в папку "C:\\dnld\\1\\")
Сеть Хопфилда
> |
restart:with(plottools):with(plots):
|
> |
randomize():p:=rand(1..120):# Функция случайных чисел от 1 до 120
|
> |
K:=12: # Число образцов
|
> |
N:=x*y: # Число нейронов
|
> |
bp:=proc(x) if x=0 then -1 else 1;fi;end:#Биполярное кодирование
|
> |
hs:=proc(x) if x<0 then 0 else 1;fi;end: #кодирование
|
Превращаем вектор в массив
> |
Conv:=proc(VV) convert([seq([seq(VV[i+x*(j-1)],i=1..x)],j=1..y)],list);end:
|
Константы для рисования
> |
S0:=POLYGONS([[0,0],[1,0],[1,1],[0,1]],COLOR(RGB,1,1,1)):#Пустой квадрат
|
> |
S1:=POLYGONS([[0,0],[1,0],[1,1],[0,1]],COLOR(HUE,0.5)):#Синий квадрат
|
Процедура изображения объекта
> |
Ris:=proc(M) local i,j,k,B,S0,S1:
|
> |
k:=M[i,j]:B[i,j]:=translate(S||k,j,y+1-i);
|
> |
PLOT(seq(seq(B[i,j],j=1..x),i=1..y),SCALING(CONSTRAINED),AXESSTYLE(NONE));
|
Считываем файлы с массивами цифр (0-пусто или 1- закрашено) и сразу рисунок заносим в список P[i]
> |
M||i:=readdata(cat("C:\\dnld\\1\\",convert(i,string),".txt"),integer,30):
|
> |
P[i]:=display(Ris(M||i),PLOT(TEXT([10,-0.3],convert(i,string),COLOR(RGB,1,0,0)))):
|
Выводим последовательно все исходные данные
> |
display(seq(P[i],i=0..K),insequence=true);
|
Из массива получаем вектор
> |
V[i]:=Vector[column]([seq(seq(bp(M||i[m,n]),n=1..x),m=1..y)]);
|
Формируем матрицу (сеть) Хопфилда
> |
B[i,j]:=add(V[k1][i]*V[k1][j],k1=1..K)/N:
|
Для устойчивости обнуляем диагональ
> |
for i to N do B[i,i]:=0:od: convert(B,array):
|
> |
NN:=70: # Число итераций
|
> |
Vz:=V[0]:#Распознаваемый образец
|
Основной цикл распознавания
> |
P[ii]:=display(Ris(Conv(VV)),PLOT(TEXT([10,-0.3],
convert(ii,string),COLOR(RGB,1,0,0))),scaling=unconstrained):
|
На вход подаем случайные обновленные элементы. Для синхронной (быстрой) динамики Vz:=Vzz
> |
for j to K1 do k[j]:=p(); Vz[k[j]]:=Vzz[k[j]]: od;
|
Выводим последовательность обновленных элементов на экран
> |
display(seq(P[i],i=1..NN),insequence=true);
|
|