- •Оглавление
- •1. Асоціативне неконтрольоване навчання
- •3. Зміст звіту по практичній роботі
- •Варіанти завдань
- •Аудиторна робота
- •Результат роботи:
- •2. Конкурентні нейронні мережі («Шар і мапа Кохонена»)
- •3. Зміст звіту по практичній роботі
- •Варіанти завдань: кластеризація даних
- •Аудиторна робота
- •1 % Self Organizing Feature Maps sofm (Kohonen networks)
- •3. Конкурентні нейронні мережі («Бінарний класифікатор сигналів екг на основі lvq»)
- •3. Зміст звіту по практичній роботі
- •Варіанти завдань
- •Аудиторна робота
- •1. %Learning Vector Quantization
- •Література
- •4. Нейронні мережі Гросберга
- •Аудиторна робота
- •1. Leaky integrator
- •2. Shunting network demonstration
- •3. Перший та другий шари мережі Grossberg
- •4. Налаштування ваги
- •Art-1 мережі розпізнавання зображень ()
- •3. Зміст звіту по практичній роботі
- •Варіанти завдань: класифікація зображень
- •Аудиторна робота
- •Листинг программы (matlab)
- •Результаты работы программы
- •Мережa Хопфiлда як асоціативна пам'ять ()
- •Варіанти завдань
- •Аудиторна робота
- •7.Рбф-мережа (робота № 5)
- •Варіанти завдань
- •Подбор параметров радиальной функции для каждого радиального нейрона (центр delta и параметр ширины b)
- •Подбор параметров радиальной функции для каждого радиального нейрона (центр с и параметр ширины b)
- •Ортогонализация по методу наименьших квадратов:
- •Работа первого и второго слоев:
- •Адаптация нелинейных параметров радиальных функций всех нейронов первого слоя сети:
- •8.Мережа з використанням га
3. Конкурентні нейронні мережі («Бінарний класифікатор сигналів екг на основі lvq»)
Мета роботи: ознайомитися з принципами функціонування та навчання конкурентних мереж Learning Vector Quantization (LVQ – двоступінчатий адаптивний класифікатор). Об’єкт дослідження: мережа LVQ, що реалізує бінарний класифікатор.
Теми для опрацювання
1. Нейронні мережі Learning Vector Quantization (LVQ – двоступінчатий адаптивний класифікатор)
Постановка задачі (згідно з індивідуальним завданням):
1. Бінарна класифікація сигналу ЕКГ на основі використання нейронних мереж типу LVQ. Функції підготовки сигналу та побудови бінарного класифікатора на основі мережі LVQ для класифікації сигналів у нормі та при патології реалізувати у вигляді m-файлів.
Математична постановка. Завдання класифікації образів або віднесення об'єкта (наприклад, сигналу електрокардіограми) до певного класу полягає у визначенні одного з наперед заданих класів, до якого належить вхідний образ, зображений у вигляді вектора ознак. Система визначає подібність образів, які досліджуються, і об’єднує схожі образи в один клас.
Для класифікації простору, що охоплює М класів необхідно (M-1) бінарних класифікаторів, кожен з яких можна представити як клас, що має діапазон простору: .
Кожний окремий бінарний класифікатор може зображувати функцію вигляду:
- якщо ,хАі RN, то маємо
- якщо і=М, хАМRN, х0, то маємо .
При класифікації сигналів ЕКГ важливим аспектом є не тільки вибір структури та розробка відповідної НМ, а й попередня обробка сигналу до прийнятного для мережі вигляду (без втрат інформативності даних сигналу).
В якості бінарного класифікатора використовуємо мережу LVQ, на вхід якої подається вектор сигналів ЕКГ.
Порядок виконання роботи
1. Вивчити теоретичний матеріал.
2. Послідовно виконати всі завдання до практичної роботи.
Задання до практичної роботи
1. Підготувати дані для розв’язання задачі класифікації сигналів ЕКГ.
2. Спроектувати класифікатор у вигляді LVQ -мережі.
3. Перевірити мережу на здатність розв’язувати задачу класифікації сигналів ЕКГ.
3. Зміст звіту по практичній роботі
1. Назва і мета роботи.
2. Постановка задачі (завдання).
3. Приклад розв’язання завдання.
Контрольні запитання
1. Опишіть складові мережі квантування векторів LVQ1.
2. Наведіть приклад контрольованого навчання мереж LVQ1.
Варіанти завдань
Бінарна класифікація сигналів ЕКГ з бази даних медичних сигналів [3]
Аудиторна робота
1. %Learning Vector Quantization
clc; clear;
s=[1 1 0 0;0 0 0 1;0 0 1 1;1 0 0 0;0 1 1 0];
st=[1 2 2 1 2]; alpha=0.6;
%initial weight matrix first two vectors of input patterns
w=[s(1,:);s(2,:)]';
disp('Initial weight matrix'); disp(w);
%set remaining as input vector
x=[s(3,:);s(4,:);s(5,:)];
t=[st(3);st(4);st(5)];
con=1; epoch=0;
while con
for i=1:3
for j=1:2
D(j)=0;
for k=1:4
D(j)=D(j)+(w(k,j)-x(i,k))^2;
end
end
for j=1:2
if D(j)==min(D)
J=j;
end
end
if J==t(i)
w(:,J)=w(:,J)+alpha*(x(i,:)'-w(:,J));
else
w(:,J)=w(:,J)-alpha*(x(i,:)'-w(:,J));
end
end
alpha=0.5*alpha;
epoch=epoch+1;
if epoch==100
con=0;
end
end
disp('Weight Matrix after 100 epochs');disp(w);
Output
Initial weight matrix
1 0
1 0
0 0
0 1
Weight Matrix after 100 epochs
1.0000 0
0.2040 0.5615
0 0.9584
0 0.4385
2. Алгоритм розв’язання задачі можна описати таким чином.
І. Підготовчий етап. При використанні мережі LVQ сигнали ЕКГ необхідно попередньо підготувати (привести до необхідного вигляду). Cигнал ЕКГ складається з величезної кількості точок, яка навіть на малій частоті дискретизації перевищує число 2000. Обробляти такий сигнал вкрай складно. Для кожного вектора, що входить до складу множин навчання та тестування буде виконуватися покрокова процедура розрахунків відповідно до запропонованого алгоритму.
Алгоритм виконання підготовчого етапу (зміни сигналу ЕКГ).
Крок 1. Підготовка вхідних даних для навчання та тестування роботи мережі.
З початкових сигналів, узятих з бази даних медичних сигналів [3], виділяємо сигнали одного відведення. Сигнали складаються з великої кількості точок (більше 2500), обробка матриць великих розмірів потребує великих ресурсів (часу, пам’яті). Тому використовуємо таке перетворення сигналу: зменшимо кількість точок сигналу шляхом його апроксимації (алгоритм схожий з дискретизацією, але виключається втрата значущих точок - зубців).
Зменшення частоти дискретизації(зменшення кількості точок). Проблема дискретизації – можливість втратити значимі точки. Щоб це не відбулося, використаємо такий алгоритм відбору точок:
- встановлюється поріг відстані між точками (визначається в межах середнього відхилення сигналу) dm1/2(smax-smin),
- для кожної пари точок розраховується відстань dі: якщо dі > dm, то точка входить до результуючого сигналу, інакше визначається сума відстаней l=lпопереднє+lі. Якщо l>dm , то точка входить в результуючий сигнал, інакше встановлюємо l =0 і переходимо до інших точок.
Використовуємо алгоритм апроксимації для сигналу патології та норми – зменшуємо кількість точок.
а) b)
Рис. 1. Апроксимація сигналу патології (a – 14 комплексів ) та норми (b – 10 комплексів)
Для класифікації вхідного вектора використовується характеристика одного комплексу, а не всієї кардіограми.
Крок 2 (поділ сигналу на комплекси: вибираються точки, що відповідають комплексу QRS). Виходячи з того, що відомо кількість точок в сигналі, кількість комплексів, на які його потрібно розділити та використовуючи команду reshape системи MatLab розділяємо сигнали. Отримуємо один зубець патології та один зубець норми (рис. 3).
а) b)
Рис. 2. Комплекс патології (a) та норми (b)
Крок 3(нормалізація векторів). На вхід мережі подаються вектори, значення яких належать інтервалу [-1, 1], тому масиви вхідних даних необхідно нормалізувати. Приведення всіх значень вектора до значень з інтервалу [-1, 1] виконуємо шляхом поділу значень сигналів на значення максимальної точки вектора. Отримані таким чином дані можна використовувати для навчання та функціонування мережі.
Після підготовки даних можна проводити навчання НМ та перевірку її роботи. З масивів підготовлених даних вибираються дані для навчання мережі (приклади сигналів комплексу норми і патології).
ІІ. Навчання НМ. Навчаємо НМ на множині навчальних векторів, матриця цілей (яка інформує до якого класу належить той чи інший вектор) включає такі вектори: t1=[1 0]T норма , t2=[0 1] T патологія і має вигляд T=[t1, …, t1, t2, …, t2]
ІІІ. Перевірка роботи НМ. Для перевірки роботи НМ використати по два тестових вектори з матриць, які містять вектори комплексів, що не використовувалися при навчанні НМ: 2 тестові вектори–норма і 2 тестові вектори–патологія.
%==============description============
% Simple LVQ algorithm. Learning vector quantization
%=============input parameters=========
% a - learning rate 0<a<1.
% Error - boundary of learning.
% When ((weights changes)^2 < Error) then stop education
% max_iter - max quantity of iteration
% Patt - patterns of input vector
% t - target classes (only one "1" which refer to class). Size of t vectors
% depends on classes quantity
% W2 - matrix of second layer. Const.
% only one "1" which shows connection between subclass of first
% layer with class of final
% W1 - changes while learning. Might be initialized randomly.
% inp_vec - vectors for checking of work. Should be same lenght as Patt
% vectors
function LVQ() % XOR
a = 0.5;
Error = 0.1;
max_iter = 10;
Patt = [-1 -1 1 1;
1 -1 1 -1];
T = [1 0 0 0;
0 1 1 0;
0 0 0 1];
W2 = [1 0 0 0;
0 1 1 0;
0 0 0 1];
inp_vec = [-0.8 -0.8 0.8;
0.5 -0.5 -0.5];
% close to stability -
W1= [-0.5 -0.75 0.4 0.4
0.8 -0.3 0.7 -0.5];
%===================preparation===============
clc;
[R,Q] = size(Patt);
[R_inp,Q_inp] = size(inp_vec);
if (R ~= R_inp) , error('Patt and inp_vec dimensions do not match.'),end
[Cl_quant, SubCl] = size(W2);
disp (['Number of patterns: ', num2str(Q), ' Patterns ']);
disp(Patt);
disp(['Classes: ', num2str(Cl_quant) , ' Subclasses: ', num2str(SubCl) ]);
disp('Weights of hidden layer before learning');
disp(W1);
iter = 0;
%======================LVQ==========================
while true
iter = iter + 1;
iter_error =0;
for q=1:Q
%inner disp('=========another vector========='); %inner
p_cur = Patt(:,q);
%inner disp(p_cur'); %inner
t_cur = T(:,q);
%====================Go forward========================
A1 = -dist(W1',p_cur);
%inner disp('Distance computed:'); %inner
%inner disp(A1');%inner
[ind_win,A1_f] = compet(A1);
%inner disp (['Winner_index: ', num2str(ind_win), ' First(hidden) layer output:']);%inner
%inner disp(A1_f');%inner
A2 = W2*A1_f;
%inner disp('Network (second layer) output');%inner
%inner disp(A2');%inner
is_ok = t_cur'*A2;
%inner disp('Compare with T');%inner
%inner disp(t_cur'); %inner
%inner disp(['Is right output: ',num2str(is_ok)]);%inner
%==================Changing weights=====================
w1_cur = W1(:,ind_win);
if is_ok == 1
% move forward to input
w1_cur_n = w1_cur + a*(p_cur - w1_cur);
else
% move away from input
w1_cur_n = w1_cur - a*(p_cur - w1_cur);
end;
W1(:,ind_win) = w1_cur_n;
%inner disp('Winner weight changes. It was:');%inner
%inner disp(w1_cur');%inner
%inner disp(' Now becomes');%inner
%inner disp(w1_cur_n');%inner
%inner disp('Changed W1');%inner
%inner disp(W1);%inner
iter_error = iter_error + sqrt(sum((w1_cur - w1_cur_n).^2));
end
% =============after iteration=============================
%inner disp(['Iteration changes: ', num2str(iter_error)]);%inner
%inner disp(['End of iteration: ', num2str(iter)]);%inner
if (iter_error < Error) || (iter >= max_iter)
break;
end
end
%================summary==============================
disp('Weights of hidden layer after learning');
disp(W1);
disp(['Iteration of learning: ', num2str(iter)]);
%=================work of network==================
disp('CheckWork after learning');
for q=1:Q_inp
inp_cur = inp_vec(:,q);
disp('----inp vector-----');
disp(inp_cur');
A1 = -dist(W1',inp_cur);
disp('Distance computed:');
disp(A1');
[ind_win,A1_f] = compet(A1);
disp (['Winner_index: ', num2str(ind_win), ' First(hidden) layer output:']);
disp(A1_f');
A2 = W2*A1_f;
disp('Network (second layer) output');
disp(A2');
end;
function [pos,vec_out]=compet(Vec)
[C,pos] = max(Vec);
vec_out = zeros(size(Vec));
% disp(['maxI : ', num2str(I)]); bitand
for i =1:size(Vec);
if (i == pos)
vec_out(i) = 1;
break;
end
end
function z = dist(w,p)
[S,R] = size(w);
[R2,Q] = size(p);
if (R ~= R2), error('Inner matrix dimensions do not match.'),end
z = zeros(S,Q);
if (Q<S)
p = p';
copies = zeros(1,S);
for q=1:Q
z(:,q) = sum((w-p(q+copies,:)).^2,2);
end
else
w = w';
copies = zeros(1,Q);
for i=1:S
z(i,:) = sum((w(:,i+copies)-p).^2,1);
end
end
z = z.^0.5;