Для создания нейронной сети PNN предназначена М-функция newpnn. Определим
7 следующих векторов входа и соотнесем каждый из них с одним из трех классов:
P = [0 0;1 1;0 3;1 4;3 1;4 1;4 3]';
Tc = [1 1 2 2 3 3 3];
Вектор Тс назовем вектором индексов классов. Этому индексному вектору можно
поставить в соответствие матрицу связности T в виде разреженной матрицы вида
T = ind2vec(Tc)
T =
(1,1) 1
(1,2) 1
(2,3) 1
(2,4) 1
(3,5) 1
(3,6) 1
(3,7) 1
которая определяет принадлежность первых двух векторов к классу 1, двух последующих – к классу 2 и трех последних – к классу 3. Полная матрица Т имеет вид:
Т = full(T)
Т =
1 1 0 0 0 0 0
0 0 1 1 0 0 0
0 0 0 0 1 1 1
Массивы Р и Т задают обучающее множество, что позволяет выполнить формирование сети, промоделировать ее, используя массив входов P, и удостовериться, что сеть правильно решает задачу классификации на элементах обучающего множества. В результате моделирования сети формируется матрица связности, соответствующая массиву
векторов входа. Для того чтобы преобразовать ее в индексный вектор, предназначена
М-функция vec2ind:
net = newpnn(P,T);
net.layers{1}.size % Число нейронов в сети PNN
ans = 7
Y = sim(net,P);
Yc = vec2ind(Y)
Yc = 1 1 2 2 3 3 3
Результат подтверждает правильность решения задачи классификации.
Выполним классификацию некоторого набора произвольных векторов р, не принадлежащих обучающему множеству, используя ранее созданную сеть PNN:
p = [1 3; 0 1; 5 2]';
Выполняя моделирование сети для этого набора векторов, получаем
a = sim(net,p);
ac = vec2ind(a)
ac = 2 1 3
Фрагмент демонстрационной программы demopnn1 позволяет проиллюстрировать
результаты классификации в графическом виде:
clf reset, drawnow
p1 = 0:.05:5;
p2 = p1;
[P1,P2]=meshgrid(p1,p2);
pp = [P1(:) P2(:)];
aa = sim(net,pp');
aa = full(aa);
m = mesh(P1,P2,reshape(aa(1,:),length(p1),length(p2)));
set(m,'facecolor',[0.75 0.75 0.75],'linestyle','none');
hold on
view(3)
m = mesh(P1,P2,reshape(aa(2,:),length(p1),length(p2)));
set(m,'facecolor',[0 1 0.5],'linestyle','none');,
m = mesh(P1,P2,reshape(aa(3,:),length(p1),length(p2)));
set(m,'facecolor',[0 1 1],'linestyle','none');
plot3(P(1,:),P(2,:),ones(size(P,2))+0.1,'.','markersize',30)
plot3(p(1,:),p(2,:),1.1*ones(size(p,2)),'*','markersize',20,... 'color',[1 0 0])
hold off
view(2)
Результаты классификации представлены на рис. 6.15 и показывают, что 3 представленных сети вектора, отмеченные звездочками, классифицируются сетью PNN, состоящей из семи нейронов, абсолютно правильно.
Рис. 6.15
В заключение отметим, что сети PNN могут весьма эффективно применяться для решения задач классификации. Если задано достаточно большое обучающее множество, то решения, генерируемые сетями, сходятся к решениям, соответствующим правилу Байеса. Недостаток сетей GRNN и PNN заключается в том, что работают они относительно медленно, поскольку выполняют очень большие объемы вычислений по сравнению с другими типами нейронных сетей.
7. Сети кластеризации
и классификации данных
В процессе анализа больших информационных массивов данных неизменно возникают задачи, связанные с исследованием топологической структуры данных, их объединением
в группы (кластеры), распределением по классам и т. п. Это могут быть экономические, финансовые, научно-технические, медицинские и другие приложения, где требуется решение таких практических задач, как сжатие данных, их хранение и поиск, определение характеристик объекта по ограниченному набору признаков. Такие задачи могут быть успешно решены с применением специального класса самоорганизующихся нейронных сетей.