MyKod Информатика Лекции Нейронные сети. Часть 12. Лекции

Авторизация







Нейронные сети. Часть 12. Лекции
22.09.2009 11:32

Нейронные сети. Часть 12. Лекции

Вспомогательные функции

С420. CALCA

Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, тремя нейронами и линией задержки на входе с параметрами [0 2 4]; в сети используется обратная связь с линией задержки [1 2] (рис. 11.62).

net = newlin([0 1],3,[0 2 4]); net.layerConnect(1,1) = 1;net.layerWeights{1,1}.delays = [1 2];

gensim(net)  

Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для 8 шагов по времени, вектор начальных условий  на линии задержки входов Pi:

P = {0 0.1 0.3 0.6 0.4 0.7 0.2 0.1};Pi = {0.2 0.3 0.4 0.1}; Pc = [Pi P];

Pd = calcpd(net,8,1,Pc)  

 Pd(:,:,1) =     [3x1 double]Pd(:,:,2) =     [3x1 double]Pd(:,:,3) =     [3x1 double]Pd(:,:,4) =     [3x1 double]Pd(:,:,5) =     [3x1 double]Pd(:,:,6) =     [3x1 double]Pd(:,:,7) =     [3x1 double]Pd(:,:,8) =     [3x1 double]  

Cформируем вектор начальных условий на линии задержки выхода слоя для каждого из трех нейронов:

Ai = {[0.5; 0.1; 0.2] [0.6; 0.5; 0.2]};  

Применяя функцию calca, рассчитаем сигналы в слое на каждом временном шаге TS:

[Ac,N,LWZ,IWZ,BZ] = calca(net,Pd,Ai,1,8)  Ac =   Columns 1 through 2    [3x1 double]    [3x1 double]  Columns 3 through 4    [3x1 double]    [3x1 double]  Columns 5 through 6    [3x1 double]    [3x1 double]  Columns 7 through 8    [3x1 double]    [3x1 double]  Columns 9 through 10    [3x1 double]    [3x1 double]N =   Columns 1 through 2    [3x1 double]    [3x1 double]  Columns 3 through 4    [3x1 double]    [3x1 double]  Columns 5 through 6    [3x1 double]    [3x1 double]  Columns 7 through 8    [3x1 double]    [3x1 double]LWZ(:,:,1) =     [3x1 double]LWZ(:,:,2) =     [3x1 double]LWZ(:,:,3) =     [3x1 double]LWZ(:,:,4) =     [3x1 double]LWZ(:,:,5) =     [3x1 double]LWZ(:,:,6) =     [3x1 double]LWZ(:,:,7) =     [3x1 double]LWZ(:,:,8) =     [3x1 double]IWZ(:,:,1) =     [3x1 double]IWZ(:,:,2) =     [3x1 double]IWZ(:,:,3) =     [3x1 double]IWZ(:,:,4) =     [3x1 double]IWZ(:,:,5) =     [3x1 double]IWZ(:,:,6) =     [3x1 double]IWZ(:,:,7) =     [3x1 double]IWZ(:,:,8) =     [3x1 double]BZ =

    [3x1 double]  

C422. CALCA1

Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, тремя нейронами и линией задержки на входе с параметрами [0 2 4]; в сети используется обратная связь с линией задержки [1 2] (рис. 11.62).

net = newlin([0 1],3,[0 2 4]); net.layerConnect(1,1) = 1;net.layerWeights{1,1}.delays = [1 2]; gensim(net)  

Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для 3 шагов по времени, вектор начальных условий  на линии задержки входов Pi:

P = {0 0.1 0.3}; Pi = {0.2 0.3 0.4 0.1};

Pc = [Pi P]; Pd = calcpd(net,3,1,Pc)  

 Pd(:,:,1) =     [3x1 double]Pd(:,:,2) =     [3x1 double]Pd(:,:,3) =

    [3x1 double]  

Cформируем вектор начальных условий на линии задержки выхода слоя для каждого из трех нейронов 

Ai = {[0.5; 0.1; 0.2] [0.6; 0.5; 0.2]};  

Применяя функцию calca1, рассчитаем сигналы в слое на первом шаге по времени:

[A1,N1,LWZ1,IWZ1,BZ1] = calca1(net,Pd(:,:,1),Ai,1)   A1 =     [3x1 double]N1 =     [3x1 double]LWZ1 =     [3x1 double]IWZ1 =     [3x1 double]BZ1 =

    [3x1 double]  

 Теперь можно вычислить новые состояния на ЛЗ, используя массивы Ai и A, и рассчитать сигналы слоя на втором шаге по времени

Ai2 = [Ai(:,2:end) A1];[A2,N2,LWZ2,IWZ2,BZ2] = calca1(net,Pd(:,:,2),Ai2,1)   A2 =     [3x1 double]N2 =     [3x1 double]LWZ2 =     [3x1 double]IWZ2 =     [3x1 double]BZ2 =

    [3x1 double]  

C423. CALCPD

Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, тремя нейронами и линией задержки на входе с параметрами [0 2 4]

net = newlin([0 1],3,[0 2 4]); gensim(net)  

Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для 3 шагов по времени и вектор начальных условий  на линии задержки Pi:

P = {0 0.1 0.3}; Pi = {0.2 0.3 0.4 0.1};  

Запаздывающие входы (значения входов после прохождения через линию задержки) рассчитываются с помощью функции calcpd после их объединения в вектор Рс

Pc = [Pi P]; Pd = calcpd(net,3,1,Pc)   Pd(:,:,1) =     [3x1 double]Pd(:,:,2) =     [3x1 double]Pd(:,:,3) =

    [3x1 double]  

Теперь можно просмотреть значения запаздывающих входов для двух первых шагов

Pd{1,1,1}, Pd{1,1,2}   ans =         0    0.4000    0.2000ans =    0.1000    0.1000    0.3000  C424. CALCE

Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, двумя нейронами и линией задержки на входе с параметрами [0 2 4]; в сети используется обратная связь с линией задержки [1 2]:

 net = newlin([0 1],2,[0 2 4]); net.layerConnect(1,1) = 1; net.layerWeights{1,1}.delays = [1 2]; gensim(net)  

Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для 5 шагов по времени, вектор начальных условий  на линии задержки входов Pi:

P = {0 0.1 0.3 0.6 0.4}; Pi = {0.2 0.3 0.4 0.1};

Pc = [Pi P]; Pd = calcpd(net,5,1,Pc);  

Cформируем вектор начальных условий на линии задержки выхода слоя для каждого из двух нейронов и рассчитаем сигналы в слое на 5 шагах по времени:

Ai = {[0.5; 0.1] [0.6; 0.5]};

[Ac,N,LWZ,IWZ,BZ] = calca(net,Pd,Ai,1,5);  

Определим цели слоя для двух нейронов для каждого из 5 временных шагов и рассчитаем ошибки слоя:

Tl = {[0.1;0.2] [0.3;0.1], [0.5;0.6] [0.8;0.9], [0.5;0.1]};El = calce(net,Ac,Tl,5)   El =   Columns 1 through 2    [2x1 double]    [2x1 double]  Columns 3 through 4    [2x1 double]    [2x1 double]

    [2x1 double]  

Просмотрим ошибки слоя 1 на временном шаге 2:

El{1,2}  

 ans =    0.3000

    0.1000  

C425. CALCE1

Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, двумя нейронами и линией задержки на входе с параметрами [0 2 4]; в сети используется обратная связь с линией задержки [1 2]:

 net = newlin([0 1],2,[0 2 4]); net.layerConnect(1,1) = 1; net.layerWeights{1,1}.delays = [1 2]; gensim(net)  

Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для 5 шагов по времени, вектор начальных условий  на линии задержки входов Pi:

P = {0 0.1 0.3 0.6 0.4}; Pi = {0.2 0.3 0.4 0.1};

Pc = [Pi P]; Pd = calcpd(net,5,1,Pc);  

Cформируем вектор начальных условий на линии задержки выхода слоя для каждого из двух нейронов и рассчитаем сигналы в слое на 5 шагах по времени:

Ai = {[0.5; 0.1] [0.6; 0.5]};[A1,N1,LWZ1,IWZ1,BZ1] = calca1(net,Pd(:,:,1),Ai,1)   A1 =     [2x1 double]N1 =     [2x1 double]LWZ1 =     [2x1 double]IWZ1 =     [2x1 double]BZ1 =

    [2x1 double]  

Определим цели слоя для двух нейронов для каждого из 5 временных шагов и рассчитаем ошибки слоя на первом шаге:

Tl = {[0.1;0.2] [0.3;0.1], [0.5;0.6] [0.8;0.9], [0.5;0.1]};El = calce1(net,A1,Tl(:,1))  El =

    [2x1 double]  

Просмотрим ошибку слоя на первом шаге:

El{1}  

 ans =    0.1000

    0.2000  

Теперь можно вычислить новые состояния на ЛЗ, используя массивы Ai и A, и рассчитать сигналы слоя на втором шаге по времени

Ai2 = [Ai(:,2:end) A1];[A2,N2,LWZ2,IWZ2,BZ2] = calca1(net,Pd(:,:,2),Ai2,1);El = calce1(net,A2,Tl(:,2)); El{1}   ans =    0.3000

    0.1000  

C426. FORMX

Создадим однослойную сеть с тремя нейронами и двухэлементным вектором входа со значениями из диапазонов [0 1] и [-1 1]:

net = newff([0 1; -1 1],[3]); gensim(net)  

Выведем значения массивов весов и смещений:

b = net.b, b{1}     b =     [3x1 double]ans =   -3.8200   -1.1587   -1.3436  iw = net.iw,   iw{1}   iw =     [3x2 double]ans =    2.7902   -1.9834    2.3173   -2.1301   -2.1626   -2.1704  lw = net.lw  lw =

    {[]}  

Объединим массивы весов и смещений в общий вектор

x = formx(net,net.b,net.iw,net.lw); x'  ans =  Columns 1 through 4     2.7902    2.3173   -2.1626   -1.9834  Columns 5 through 8    -2.1301   -2.1704   -3.8200   -1.1587  Column 9

   -1.3436  

C428. GETX

Создадим однослойную сеть с тремя нейронами и двухэлементным вектором входа со значениями из диапазонов [0 1] и [-1 1]:

net = newff([0 1; -1 1],[3]); gensim(net)  

Выведем значения массивов весов и смещений:

net.iw{1,1}, net.b{1}  

 ans =   -1.0809   -2.3639    4.7917   -0.3739   -1.9788   -2.2138ans =    2.9653   -2.3959

   -1.4355  

Эти же значения можно вывести в виде объединенного вектора, который содержится в описании нейронной сети:

x = getx(net); x'   ans =  Columns 1 through 4    -1.0809    4.7917   -1.9788   -2.3639  Columns 5 through 8    -0.3739   -2.2138    2.9653   -2.3959  Column 9

   -1.4355  

C428. SETX

Создадим однослойную сеть с тремя нейронами и двухэлементным вектором входа со значениями из диапазонов [0 1] и [-1 1]:

net = newff([0 1; -1 1],[3]); gensim(net)net.iw, net.b   ans =     [3x2 double]ans =     [3x1 double]  

Сеть имеет 6 весовых коэффициентов и 3 элемента смещений, то есть всего 9 значений. Зададим этим элементам случайные значения и включим их в описание нейронной сети:

net = setx(net,rand(9,1));  

Эти значения можно вывести на экран с помощью команды

getx(net)  

ans =    0.6252    0.7334    0.3759    0.0099    0.4199    0.7537    0.7939    0.9200

    0.8447  

C429. CALCPERF

Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, двумя нейронами и линией задержки на входе с параметрами [0 2 4]; в сети используется обратная связь с линией задержки [1 2]:

 net = newlin([0 1],2,[0 2 4]); net.layerConnect(1,1) = 1; net.layerWeights{1,1}.delays = [1 2]; gensim(net)  

Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для 5 шагов по времени, вектор начальных условий  на линии задержки входов Pi:

P = {0 0.1 0.3 0.6 0.4}; Pi = {0.2 0.3 0.4 0.1}; Pc = [Pi P];

Pd = calcpd(net,5,1,Pc);  

сформируем вектор начальных условий на линии задержки выхода слоя для каждого из двух нейронов и массив векторов целей на 5 шагах по времени:

Ai = {[0.5; 0.1] [0.6; 0.5]};

Tl = {[0.1;0.2] [0.3;0.1], [0.5;0.6] [0.8;0.9], [0.5;0.1]};  

Извлечем объединенный вектор весов и смещений из описания сети

X = getx(net);  

Вычислим функционал качества и сигналы в сети

[perf,El,Ac,N,BZ,IWZ,LWZ] = calcperf(net,X,Pd,Tl,Ai,1,5);  

Выведем значения функционала качества и массива ошибок слоя

perf, cat(2, El{:})  perf =    0.2470ans =  Columns 1 through 4     0.1000    0.3000    0.5000    0.8000    0.2000    0.1000    0.6000    0.9000  Column 5     0.5000

    0.1000  

C430. CALCGX

Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, двумя нейронами и линией задержки на входе с параметрами [0 2 4]; в сети используется обратная связь с линией задержки [1 2]:

 net = newlin([0 1],2,[0 2 4]); net.layerConnect(1,1) = 1; net.layerWeights{1,1}.delays = [1 2]; gensim(net)  

Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для 5 шагов по времени, вектор начальных условий  на линии задержки входов Pi:

P = {0 0.1 0.3 0.6 0.4}; Pi = {0.2 0.3 0.4 0.1}; Pc = [Pi P];

Pd = calcpd(net,5,1,Pc);  

Cформируем вектор начальных условий на линии задержки выхода слоя для каждого из двух нейронов и массив векторов целей на 5 шагах по времени:

Ai = {[0.5; 0.1] [0.6; 0.5]};

Tl = {[0.1;0.2] [0.3;0.1], [0.5;0.6] [0.8;0.9], [0.5;0.1]};  

Извлечем из описания сети объединенный вектор весов и смещений сети и вычислим функционал качества и сигналы сети

X = getx(net);[perf,El,Ac,N,BZ,IWZ,LWZ] = calcperf(net,X,Pd,Tl,Ai,1,5);  

В заключение используем функцию calcgx, чтобы вычислить градиент функционала по объединенному вектору весов и смещений:

[gX,normgX] = calcgx(net,X,Pd,BZ,IWZ,LWZ,N,Ac,El,perf,1,5); gX'  

ans =  Columns 1 through 4     0.1720    0.1540    0.0600    0.0420  Columns 5 through 8     0.0780    0.0800    0.0120    0.0240  Columns 9 through 12     0.0100    0.0200    0.0460    0.0320  Columns 13 through 16     0.0320    0.0140    0.4400    0.3800  normgX  normgX =

    0.6440  

C432. CALCJX

Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, двумя нейронами и линией задержки на входе с параметрами [0 2 4]; в сети используется обратная связь с линией задержки [1 2]:

net = newlin([0 1],2, [0 2 4]); net.layerConnect(1,1) = 1;net.layerWeights{1,1}.delays = [1 2]; gensim(net)  

Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для 5 шагов по времени, вектор начальных условий  на линии задержки входов Pi:

P = {0 0.1 0.3 0.6 0.4}; Pi = {0.2 0.3 0.4 0.1}; Pc = [Pi P];Pd = calcpd(net,5,1,Pc);  

Зададим два начальных значения запаздывающих выходов слоя для каждого из двух нейронов и цели слоя для двух нейронов на пять шагов по времени:

Ai = {[0.5; 0.1] [0.6; 0.5]};

Tl = {[0.1;0.2] [0.3;0.1], [0.5;0.6] [0.8;0.9], [0.5;0.1]};  

Извлечем из описания сети объединенный вектор весов и смещений сети и вычислим функционал качества и сигналы сети

X = getx(net);[perf,El,Ac,N,BZ,IWZ,LWZ] = calcperf(net,X,Pd,Tl,Ai,1,5);  

Теперь можно применить функцию calcjx, чтобы вычислить якобиан функционала качества по объединенной матрице весов и смещений

jX = calcjx(net,Pd,BZ,IWZ,LWZ,N,Ac,1,5); figure(1), clf, spy(jX)  C433. CALCJEJJ

Создадим линейную сеть с одним входом, изменяющимся в диапазоне от 0 до 1, двумя нейронами и линией задержки на входе с параметрами [0 2 4]; в сети используется обратная связь с линией задержки [1 2]:

net = newlin([0 1],2, [0 2 4]); net.layerConnect(1,1) = 1;net.layerWeights{1,1}.delays = [1 2]; gensim(net)net.iw, net.lw, net.b  ans =     [2x3 double]ans =     [2x4 double]ans =     [2x1 double]  

Данная сеть имеет 16 настраиваемых параметров: 6 элементов весовой матрицы входа, 8 элементов весовой матрицы в обратной связи и 2 элемента вектора смещения.

Вычислим вектор запаздывающих входов Pd, если заданы реализация вектора входа P для 5 шагов по времени, вектор начальных условий  на линии задержки входов Pi:

P = {0 0.1 0.3 0.6 0.4}; Pi = {0.2 0.3 0.4 0.1}; Pc = [Pi P];Pd = calcpd(net,5,1,Pc);  

Зададим два начальных значения запаздывающих выходов слоя для каждого из двух нейронов и цели слоя для двух нейронов на 5 шагов по времени:

Ai = {[0.5; 0.1] [0.6; 0.5]};

Tl = {[0.1;0.2] [0.3;0.1], [0.5;0.6] [0.8;0.9], [0.5;0.1]};  

Извлечем из описания сети объединенный вектор весов и смещений сети и вычислим функционал качества и сигналы сети

X = getx(net);[perf,El,Ac,N,BZ,IWZ,LWZ] = calcperf(net,X,Pd,Tl,Ai,1,5);  

В заключение используем функцию calcjejj, задав коэффициент экономии памяти равным 2

tic, [je,jj,normje] = calcjejj(net,Pd,BZ,IWZ,LWZ,N,Ac,El,1,5,2); toc, figure(1), clf, spy(je)  elapsed_time =

    0.7700  

Результаты будут одинаковыми при любом значении коэффициента экономии памяти, однако время вычислений будет расти. Увеличим  коэффициент экономии памяти до значения 4:

tic, [je,jj,normje] = calcjejj(net,Pd,BZ,IWZ,LWZ,N,Ac,El,1,5,4); toc, figure(2), clf, spy(je)  elapsed_time =

    0.9800  

Операции с массивами данных

С436. CELL2MAT

C = {[1 2] [3]; [4 5; 6 7] [8; 9]};  figure(1), clf, cellplot(C),  M = cell2mat(C)  M =     1     2     3     4     5     8

     6     7     9  

C437. COMBVEC

Рассмотрим следующие 2 выборки Р1 и Р2 и рассчитаем объединенную выборку Р:

P1 = [1 2 3; 4 5 6]; P2 = [7 8; 9 10];P = combvec(P1,P2)  P =     1     2     3     1     2     3     4     5     6     4     5     6     7     7     7     8     8     8

     9     9     9    10    10    10  

Добавим выборку Р3

P3 = [4 5 6];P = combvec(P,P3)  P =  Columns 1 through 7      1     2     3     1     2     3     1     4     5     6     4     5     6     4     7     7     7     8     8     8     7     9     9     9    10    10    10     9     4     4     4     4     4     4     5  Columns 8 through 14      2     3     1     2     3     1     2     5     6     4     5     6     4     5     7     7     8     8     8     7     7     9     9    10    10    10     9     9     5     5     5     5     5     6     6  Columns 15 through 18      3     1     2     3     6     4     5     6     7     8     8     8     9    10    10    10

     6     6     6     6  

C438. CON2SEQ, SEQ2CON

Преобразуем числовой массив P размера 2´3, соответствующий групповому представлению данных, в массив ячеек S размера 1´3, содержащих числовые массивы размера 2´1 и соответствующий последовательному представлению данных:

P = [1 4 2; 2 5 3]; S = con2seq(P)  S =   Columns 1 through 2    [2x1 double]    [2x1 double]

    [2x1 double]  

Преобразуем массив ячеек P размера Q´1, содержащих массивы размера R´m*TS, который соответствует структуре группового представления, в массив ячеек S размера Q´TS, содержащих массивы размера R´m, и который соответствует структуре последовательного представления данных.

P = { [1 2; 1 2]; [3 4; 3 4]; [5 6; 5 6] }; S = con2seq(P,2)  S =     [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]  

Этому массиву соответствует следующее описание

cell2mat(S), figure(1), clf, cellplot(S)  ans =     1     2     1     2     3     4     3     4     5     6

     5     6  

Преобразуем массив ячеек S размера Q´TS, содержащих числовые массивы размера R´m, в массив ячеек Р размера Q´1 . При этом каждая ячейка содержит числовой массив размера R´m*TS:.

S = {[1; 1] [5; 4] [1; 2];  [3; 9] [4; 1] [9; 8]}P = seq2con(S)  S =   Columns 1 through 2    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]P =     [2x3 double]

    [2x3 double]  

Сформируем числовой массив P, соответствующий групповому представлению

P = cell2mat(P)  P =     1     5     1     1     4     2     3     4     9

     9     1     8  

C439. CONCUR

Функция concur создает три копии вектора смещения для данного слоя нейронной сети:

b = [1; 3; 2; -1]; B = concur(b,3)  B =     1     1     1     3     3     3     2     2     2

    -1    -1    -1  

Двухслойная нейронная сеть имеет 2 вектора смещения, которые  для применения функции concur необходимо объединить в вектор ячеек

b1 = [1; 3; 2; -1]; b2 = [3; 2; -1]; b = {b1; b2}B = concur(b,3)  b =     [4x1 double]    [3x1 double]B =     [4x3 double]    [3x3 double]  C440. IND2VEC, VEC2IND

Преобразовать вектор индексов классов в матрицу связности

ind = [1 3 2 3], vec = ind2vec(ind), vec = full(vec)  ind =     1     3     2     3vec =   (1,1)        1   (3,2)        1   (2,3)        1   (3,4)        1vec =     1     0     0     0     0     0     1     0

     0     1     0     1  

Преобразовать матрицу связности в вектор индексов классов 

vec = [1 0 0 0; 0 0 1 0; 0 1 0 1];ind = vec2ind(vec)  ind =

     1     3     2     3  

C441. MAT2CELL

Преобразовать числовой массив М размера 3´4 в массив ячеек с разбиением mrow = [2 1], ncol = [1 2 1]:

M = [1 2 3 4; 5 6 7 8; 9 10 11 12];C = mat2cell(M,[2 1],[1 2 1])  C =   Columns 1 through 2    [2x1 double]    [2x2 double]    [         9]    [1x2 double]    [2x1 double]    [        12]  [C{1,:}; C{2,:}]  ans =     1     2     3     4     5     6     7     8

     9    10    11    12  

C441. MINMAX

Вычислить минимальные и максимальные значения элементов в строках массива P:

P = [0 1 2; -1 -2 -0.5]; pr = minmax(P)  pr =         0    2.0000   -2.0000   -0.5000  

C442. NORMC, NORMR

Нормировать матрицу М по строкам и столбцам

M = [1 2; 3 4];  normr(M), normc(M)  ans =    0.4472    0.8944    0.6000    0.8000ans =    0.3162    0.4472    0.9487    0.8944  C442. PNORMC

Выполнить псевдонормировку стобцов матрицы

M = [0.1 0.6; 0.3 0.1];pM = pnormc(M)  pM =    0.1000    0.6000    0.3000    0.1000

    0.9487    0.7937  

С443. QUANT

Округлить элементы массива Р с точностью до 0.1

P = [1.333 4.756 -3.897]; qP = quant(P,0.1)  qP =

    1.3000    4.8000   -3.9000  

С443. SUMSQR

Вычислить сумму квадратов всех элементов массива M:

M = [ 1 2 3; 4 5 6]; s = sumsqr(M)  s =

    91  

Графические утилиты

С443. PLOTV

Отобразить векторы в виде линий

P = [-0.4 0.7 0.2; -0.5 0.1 0.5];figure(1), clf, plotv(P,'-'); grid on %Рис.11.64  C444. PLOTVEC

Отобразить векторы входа в виде маркеров

P =[ 0.1000    1.0000    0.5000    0.7000    -1.0000    2.0000    0.5000    0.1000     1.0000    0.1000    0.7000    0.5000];t = minmax(P)'; figure(1), clf, axis(t(:)'), c=[1 2 3 4]';plotvec(P,c,'o'), grid on %Рис.11.65  C445. PLOTPV

Отобразить векторы входа и целей персептрона в виде маркеров

P = [0 0 1 1; 0 1 0 1; 1 0 0 1];  T = [0 0 0 1];figure(1), clf, plotpv(P,T),grid on, title('Векторы входов и целей') %Рис.11.66  С446. PLOTPC

Определим векторы входов и целей и отобразим их в двумерном пространстве входов

P = [0 0 1 1; 0 1 0 1]; T = [0 0 0 1];figure(1), clf, plotpv(P,T), grid on, hold on  

Создадим персептрон с входами P, зададим произвольные значения весам и смещениям и построим разделяющую линию в пространстве входов:

net = newp(minmax(P),1);net.iw{1,1} = [-1.2 -1]; net.b{1} = 1.3;h = plotpc(net.iw{1,1},net.b{1});set(h,'Color',[1/2,1/2,0],'LineWidth',2)  

Построиv разделяющую плоскость в трехмерном пространстве

P = [0 0 1 1; 0 1 0 1; 1 0 0 1]; T = [0 0 0 1];figure(1), clf, plotpv(P,T), grid on, hold on  

Следующие функции создают персептрон с входами, соответствующими значениям вектора P, назначают значения его весам и смещениям и строят разделяющую плоскость:

net = newp(minmax(P),1);net.iw{1,1} = [-1.2 -1 -0.5]; net.b{1} = 1.3;h = plotpc(net.iw{1,1}, net.b{1});  C448. HINTONW

Зададим случайную матрицу весов и построим для нее диаграмму Хинтона, используя значения дополнительных аргументов по умолчанию

W = rands(4,5); hintonw(W), % Рис.11.69C449. HINTONWB 

Зададим случайные матрицу весов и вектор смещений и построим для них диаграмму Хинтона, используя значения дополнительных аргументов по умолчанию

W = rands(4,5); b = rands(4,1); hintonwb(W,b), % Рис.11.70  C450. PLOTPERF

Зададим 8 значений вектора входа P, соответствующий им вектор целей T, а также контрольное подмножество в виде векторов VV.P и VV.T:

P = 1:8; T = sin(P); VV.P = P; VV.T = T+rand(1,8)*0.1;  

Создадим и обучим двухслойную сеть прямой передачи с 4-мя нейронами в первом слое с функцией активации tansig и одним нейроном во втором слое также с функцией активации tansig

net = newff(minmax(P),[4 1],{'tansig','tansig'});[net,tr] = train(net,P,T,[],[],VV); grid on  TRAINLM, Epoch 0/100, MSE 1.45434/0, Gradient 2.89033/1e-010TRAINLM, Epoch 25/100, MSE 0.358863/0, Gradient 0.12179/1e-010TRAINLM, Epoch 50/100, MSE 0.0103365/0, Gradient 0.0194758/1e-010TRAINLM, Epoch 70/100, MSE 0.00721783/0, Gradient 0.0138325/1e-010TRAINLM, Validation stop.  

В процеесе выполнения процедуры train для построения графика точности обучения также применяется функция plotperf и во многих случаях этого бывает достаточно для оценки процедуры обучения.

Однако функция plotperf позволяет оформить графики результатов обучения и по завершении этой процедуры, используя дополнительные аргументы. Например, выполняя обучение с предельной точностью, заданной по умолчанию, на заключительном графике можно указать требуемую точность и оценить длительность обучения

plotperf(tr, 0.005) %Рис.11.71  C451. ERRSURF, PLOTES

Вычислить и построить график поверхности ошибки для нейрона 

p = [3 2]; t = [0.4 0.8];wv = -4:0.4:4; bv = wv;ES = errsurf(p,t,wv,bv,'logsig');plotes(wv,bv,ES,[60 30]) % Рис.11.72  С452. PLOTEP

Построить траекторию обучения в пространстве настраиваемых параметров. Script-файл, приведенный ниже, описывает сценарий построения такой траектории. Этот сценарий необходимо скопировать и выполнить в рабочем окне системы MATLAB:

  Script   %   Задание обучающей последовательности    P = 1:8; T = sin(P);     %   Построение поверхности ошибок   w_range = -1:0.2:1;  b_range = -1:0.2:1;   ES = errsurf(P, T, w_range, b_range, 'purelin');   plotes(w_range, b_range,ES);     %    Формирование нейронной сети   maxlr = 0.40*maxlinlr(P, 'bias');   net = newlin([-2 2], 1, [0], maxlr);     %    Задание начальной точки   subplot(1, 2, 2);     h = text(sum(get(gca, 'xlim'))*0.5, ...   sum(get(gca, 'ylim'))*0.5, '*Укажите точку*');     [net.IW{1,1} net.b{1}] = ginput(1);   delete(h);% Построение траектории обучения   limiting = net.trainParam.epochs;   limloop = limiting+1;   net.trainParam.epochs = 1;                 net.trainParam.goal = .001;   net.trainParam.show = Inf;   h = plotep(net.IW{1}, net.b{1}, mse(T-sim(net, P)));        [net, tr] = train(net, P, T);                                                       r = tr;   epoch = 1; cont = 1;   while (length(r.epoch)<limloop & cont)      epoch = epoch+1;      [net, tr]=train(net, P, T);      if length(tr.epoch)>1         h = plotep(net.IW{1,1}, net.b{1}, tr.perf(2), h);         r.epoch = [r.epoch epoch];          r.perf    = [r.perf tr.perf(2)];         r.vperf  = [r.vperf NaN];         r.tperf  = [r.tperf NaN];      else         cont = 0;      end;   end; % Рис.11.73

Информация о сети и ее топологии

С454. DISP, DISPLAY

Создадим персептрон и выведем на экран его свойства:

net = newp([-1 1; 0 2],3); display(net)  net =    Neural Network object:    architecture:         numInputs: 1         numLayers: 1       biasConnect: [1]      inputConnect: [1]      layerConnect: [0]     outputConnect: [1]     targetConnect: [1]         numOutputs: 1  (read-only)        numTargets: 1  (read-only)    numInputDelays: 0  (read-only)    numLayerDelays: 0  (read-only)    subobject structures:            inputs: {1x1 cell} of inputs            layers: {1x1 cell} of layers           outputs: {1x1 cell} containing 1 output           targets: {1x1 cell} containing 1 target            biases: {1x1 cell} containing 1 bias      inputWeights: {1x1 cell} containing 1 input weight      layerWeights: {1x1 cell} containing no layer weights    functions:          adaptFcn: 'trains'           initFcn: 'initlay'        performFcn: 'mae'          trainFcn: 'trainc'    parameters:        adaptParam: .passes         initParam: (none)      performParam: (none)        trainParam: .epochs, .goal, .show, .time    weight and bias values:                IW: {1x1 cell} containing 1 input weight matrix                LW: {1x1 cell} containing no layer weight matrices                 b: {1x1 cell} containing 1 bias vector    other:          userdata: (user stuff)  C455. PLOTSOM

Рассмотрим способы отображения двумерных и трехмерных карт Кохонена; для этого с помощью М-фунеции gridtop рассчитаем сетку с прямоугольной топологией

pos = gridtop(4,3); figure(1), clf, plotsom(pos),

title('Позиции нейронов'), grid on   %Рис.11.74,а  

Для отображения двумерной карты Кохонена в пространстве весов зададим случайную матрицу весов W размера 12x2 и вычислим матрицу расстояний D на выбранной сетке

W = rand(12,2); D = dist(pos);figure(2), clf,plotsom(W,D), title('Позиции нейронов в пространстве весов'),grid on      %Рис.11.74,б  

Выполним аналогичные построения для трехмерной карты Кохонена

pos = gridtop(4,3,3);figure(1), clf, plotsom(pos), plotsom(pos)  

title('Позиции нейронов'), grid on   %Рис.11.75,а  

D = dist(pos); W = rand(36,3);plotsom(W, D), figure(2), clf,plotsom(W,D), title('Позиции нейронов в пространстве весов'),grid on %Рис.11.75,б         С457. GRIDTOP

Рассчитать положения нейронов на 4-мерной сетке с прямоугольной топологией размера 5x4x3x2 и выполнить попытку построить график

pos = gridtop(5,4,3,2); figure(1), clf, plotsom(pos), plotsom(pos)  

title('Позиции нейронов'), grid on   %Рис.11.76  

Warning - PLOTSOM only shows first three dimensions.Warning - PLOTSOM only shows first three dimensions.  С457. HEXTOP

Рассчитать положения нейронов на 3-мерной сетке с гексагональной топологией размера 5x4x3 с 60 нейронами и построить график их расположения

pos = hextop(5,4,3); figure(1), clf, plotsom(pos), plotsom(pos)   title('Позиции нейронов'), grid on   %Рис.11.77  С458. RANDTOP

Рассчитать положения нейронов на 3-мерной сетке с гексагональной топологией размера 5x4x3 с 60 нейронами и построить график их расположения

pos = randtop(5,4,3); figure(1), clf, plotsom(pos), plotsom(pos)  

title('Позиции нейронов'), grid on   %Рис.11.78 

Моделирование нейронных сетей и система Simulink

Функции моделирования сети

С459. SIM

Создадим нейронную сеть персептрона с одним слоем и двухэлементным входом с диапазоном значений [0 1] и одним нейроном

net = newp([0 1;0 1],1);  

Теперь можно промоделировать персептрон, подавая различные последовательности векторов входа: один вектор с двумя элементами, группа из двух векторов с тремя элементами, последовательность из 3 векторов, что соответствует различным формам представления данных

p1 = [.2; .9]; a1 = sim(net,p1)p2 = [.2 .5 .1 ;.9 .3 .7]; a2 = sim(net,p2)p3 = {[.2; .9] [.5; .3] [.1; .7]}; a3 = sim(net,p3)  a1 =     1a2 =     1     1     1a3 =

    [1]    [1]    [1]  

В данном случае в качестве результата выводятся только выходы нейрона.

Создадим динамическую однослойную линейную сеть с двумя нейронами, трехэлементным входом с диапазоном значений [0 2] и линией задержки на входе [0 1]:

net = newlin([0 2;0 2;0 2],2,[0 1]);  

Линейный слой моделируется с последовательностью из двух векторов входа, для заданных по умолчанию начальных условия на линиях задержки

p1 = {[2; 0.5; 1] [1; 1.2; 0.1]};[y1,pf] = sim(net,p1)  y1 =     [2x1 double]    [2x1 double]pf =     [3x1 double]  

Затем этот слой моделируется еще для 3 векторов, используя состояния на элементах задержки как новые начальные условия

p2 = {[0.5; 0.6; 1.8] [1.3; 1.6; 1.1] [0.2; 0.1; 0]};[y2,pf] = sim(net,p2,pf)  y2 =   Columns 1 through 2    [2x1 double]    [2x1 double]    [2x1 double]pf =

    [3x1 double]  

Создадим двухслойную сеть Элмана с одноэлементным входом с диапазоном значений [0 1], имеющую 3 нейрона с функцией активации tansig в слое 1 и 2 нейрона с функцией активации purelin в слое 2. Сеть Элмана имеет линию задержки [0 1] при переходе от слоя 1 к слою 2:

net = newelm([0 1],[3 2],{'tansig','purelin'});  

Сеть моделируется для трехэлементного вектора входа, используя заданные по умолчанию начальные условия на линии задержки

p1 = {0.2 0.7 0.1};[y1,pf,af,e,perf] = sim(net,p1)  y1 =   Columns 1 through 2    [2x1 double]    [2x1 double]    [2x1 double]pf =    Empty cell array: 1-by-0af =     [3x1 double]    [2x1 double]e =   Columns 1 through 2    [2x1 double]    [2x1 double]    [2x1 double]perf =

    0.5221  

[e{:}]  

ans =    0.3072    0.7206    0.7108

    0.7558    0.8468    0.8517  

Выполним еще один шаг моделирования, но теперь для четырехэлементного вектора входа, используя  состояния на элементах задержки как новые начальные условия

p2 = {0.1 0.9 0.8 0.4};[y1,pf,af,e,perf] = sim(net,p2,pf,af)  y1 =   Columns 1 through 2    [2x1 double]    [2x1 double]  Columns 3 through 4    [2x1 double]    [2x1 double]pf =    Empty cell array: 1-by-0af =     [3x1 double]    [2x1 double]e =   Columns 1 through 2    [2x1 double]    [2x1 double]  Columns 3 through 4    [2x1 double]    [2x1 double]perf =    0.6336  [e{:}]  ans =    0.7274    0.7144    0.7448    0.7554

    0.8536    0.8453    0.8526    0.8568  

Построение моделей нейронных сетей

С465. GENSIM

Создадим однослойную линейную сеть, реализующую следующее соотношение между входом и целью

P = [1 2 3 4 5];  T = [1 3 5 7 9];net = newlind(P,T);  

Для того чтобы сформировать S-модель этой сети, используем команду

gensim(net,-1) %Рис.11.84  

Теперь рассмотрим пример моделирования динамической сети. Обратимся к сети Элмана, связанной с детектированием амплитуды гармонического сигнала.

Сформируем и обучим сеть Элмана

clear, p1 = sin(1:20); p2 = sin(1:20)*2;t1 = ones(1,20); t2 = ones(1,20)*2;p = [p1 p2 p1 p2]; t = [t1 t2 t1 t2];Pseq = con2seq(p); Tseq = con2seq(t);R = 1; % Число элементов входаS2 = 1;% Число нейронов выходного слояS1 = 10;% Число нейронов рекуррентного слоя  net = newelm([-2 2],[S1 S2],{'tansig','purelin'},'traingdx');  net.trainParam.epochs = 500; net.trainParam.show = 25;net.trainParam.goal = 0.05;[net,tr] = train(net,Pseq,Tseq); TRAINGDX, Epoch 0/500, MSE 9.2038/0.05, Gradient 21.0604/1e-006TRAINGDX, Epoch 25/500, MSE 0.322819/0.05, Gradient 0.533849/1e-006TRAINGDX, Epoch 50/500, MSE 0.269378/0.05, Gradient 0.174894/1e-006TRAINGDX, Epoch 75/500, MSE 0.219944/0.05, Gradient 0.14799/1e-006TRAINGDX, Epoch 100/500, MSE 0.0492742/0.05, Gradient 0.162553/1e-006TRAINGDX, Performance goal met.  

gensim(net)  

Создадим S-модель этой сети, дополнив ее блоком To Workspace, который позволяет записать результаты моделирования в виде массива yout в рабочую область системы MATLAB (рис.11.88, а).

Задав значение входного сиграла (рис. 11.89,а), выполним моделирование сети и выведем результат в виде графика изменения выхода сети, используя данные из рабочей области системы MATLAB.

stairs(tout(1:5:end),yout) %Рис.11.89,бС470. GENSIMM

Сформируем М-файл для S-модели сети Элмана

p1 = sin(1:20); p2 = sin(1:20)*2;t1 = ones(1,20); t2 = ones(1,20)*2;p = [p1 p2 p1 p2]; t = [t1 t2 t1 t2];Pseq = con2seq(p); Tseq = con2seq(t);  R = 1; % Число элементов входаS2 = 1;% Число нейронов выходного слояS1 = 10;% Число нейронов рекуррентного слоя  net = newelm([-2 2],[S1 S2],{'tansig','purelin'},'traingdx');  netelm = gensimm(net)  netelm =C:\WINDOWS\TEMP\matlab_nnet\tp354077.m  

Выведем текст М-файла:

type(netelm)  function [perf,El,Ac,N,LWZ,IWZ,BZ] = tp354077(net,Pd,Ai,Tl,Q,TS)%TP354077 Temporary network simulation file.%%  [perf,El,Ac,N,LWZ,IWZ,BZ] = tp354077(net,Pd,Ai,Tl,Q,TS)%    net  - Neural network.%    Pd   - numInputs-by-numLayers-by-TS cell array of delayed inputs.%    Ai   - numLayers-by-numLayerDelays cell array of layer delay conditions.%    Tl   - numLayers-by-TS cell array of layer targets.%    Q    - number of concurrent simulations.%    TS   - number of time steps.%  returns:%    perf - network performance:%    El   - numLayers-by-TS cell array of layer errors:%    Ac   - numLayers-by-(numLayerDelays+TS) cell array of layer outputs:%    N    - numLayers-by-TS cell array of net inputs:%    LWZ  - numLayers-by-numLayers-by-TS cell array of weighed layer outputs:%    IWZ  - numLayers-by-numInputs-by-TS cell array of weighed inputs:%    BZ   - numLayers-by-1 cell array of expanded biases: % Input weightsIW1_1 = net.IW{1,1}; % Layer weightsLW1_1 = net.LW{1,1};LW2_1 = net.LW{2,1}; % BiasesQOnes = ones(1,Q);B1 = net.b{1}(:,QOnes);B2 = net.b{2}(:,QOnes);BZ = {B1; B2}; % SignalsEl = cell(2,TS);Ac = [Ai cell(2,TS)];N = cell(2,TS);IWZ = cell(2,1,TS);LWZ = cell(2,2,TS); for ts=1:TS;  tsc = ts + 1;     % Simulate Layer 1  IWZ{1,1,ts} = IW1_1*Pd{1,1,ts};  LWZ{1,1,ts} = LW1_1*Ac{1,tsc-1};  N{1,ts} = IWZ{1,1,ts}+LWZ{1,1,ts}+B1;  Ac{1,tsc} = tansig(N{1,ts});     % Simulate Layer 2  LWZ{2,1,ts} = LW2_1*Ac{1,tsc};  N{2,ts} = LWZ{2,1,ts}+B2;  Ac{2,tsc} = N{2,ts};  El{2,ts} = Tl{2,ts} - Ac{2,tsc};end; perf = mse(El,net,net.trainParam);