Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2015_for_stud_Практика_С.doc
Скачиваний:
16
Добавлен:
17.03.2016
Размер:
1.69 Mб
Скачать

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), обробка матриць великих розмірів потребує великих ресурсів (часу, пам’яті). Тому використовуємо таке перетворення сигналу: зменшимо кількість точок сигналу шляхом його апроксимації (алгоритм схожий з дискретизацією, але виключається втрата значущих точок - зубців).

Зменшення частоти дискретизації(зменшення кількості точок). Проблема дискретизації – можливість втратити значимі точки. Щоб це не відбулося, використаємо такий алгоритм відбору точок:

- встановлюється поріг відстані між точками (визначається в межах середнього відхилення сигналу) dm1/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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]