Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИДЗ_Дегилевич.docx
Скачиваний:
5
Добавлен:
04.09.2023
Размер:
954.53 Кб
Скачать

Заключение

В рамках работы были рассмотрены методы классификации k ближайших соседей, главных компонент, по минимуму расстояний, по критерию Фишера. Методы были применены к базе данных записей ЭКГ с целью классификации опасных аритмий.

Полученные результаты исследования каждого метода представлены в соответственном разделе с графическими и численными результатами. Были найдены весовые вектора, пороги классификации, расписаны формулы разрешающих плоскостей и сформулированы алгоритмы классификации. Алгоритм каждого метода разработан в программной среде MATLAB.

По итогам сравнения метрик точности было определенно, что максимальная точность была достигнута с помощью метода критерия Фишера.

Приложение a программный код (matlab)

clc;

clear all;

close all;

%% Загрузка данных

filename = "Data.xlsx";

N = table2array(readtable(filename,"Sheet","НР"));

ZhT = table2array(readtable(filename,"Sheet","ЖТ"));

FZh = table2array(readtable(filename,"Sheet","ФЖ"));

Data = [N; ZhT; FZh];

N(:,12) = 1;

ZhT(:,12) = 2;

FZh(:,12) = 3;

k = randperm(30);

k_train = k(1:end/2);

k_test = k(end/2+1:end);

train = [N(k_train,:); ZhT(k_train,:); FZh(k_train,:)];

test = [N(k_test,:); ZhT(k_test,:); FZh(k_test,:)];

%% k-соседей

type1 = 'equal';

type2 = 'squaredinverse';

for i=3:9

[acc, classMatrix] = kneib(train, test, i, type1);

accS(:,i-2)=[i;acc];

classMatrixS(:,:,i-2) = classMatrix;

[acc2, classMatrix2] = kneib(train, test, i, type2);

accS2(:,i-2)=[i;acc2];

classMatrixS2(:,:,i-2) = classMatrix2;

end

fontSize=18;

lineWidth=2;

figure(1)

subplot(1,2,1)

plot(accS(1,:), accS(2,:),LineWidth=lineWidth)

xlim([3,9])

ylim([min(accS(2,:)-0.1),1])

ylabel('Точность','FontSize',fontSize)

xlabel('Количество соседей','FontSize',fontSize)

title('Классический','FontSize',fontSize)

grid on

subplot(1,2,2)

plot(accS2(1,:), accS2(2,:),LineWidth=lineWidth)

xlim([3,9])

ylim([min(accS(2,:)-0.1),1])

ylabel('Точность','FontSize',fontSize)

xlabel('Количество соседей','FontSize',fontSize)

title('Взвешенный','FontSize',fontSize)

grid on

%% Метод гланых компонент

g = [N(:,end); ZhT(:,end); FZh(:,end)];

[coeff,score,latent,tsquared,explained,mu] = pca(Data);

f1 = explained(1)/sum(explained);

f2 = explained(2)/sum(explained);

figure(2)

gscatter(score(:,1),score(:,2),g,'rgb','so*',20)

title('Диаграмма рассеяния')

xlabel('Главная компонента 1')

ylabel('Главная компонента 2')

set(gca,'FontSize',20)

grid on

%% Классификация по минимуму расстояний

X11 = FZh(:,1:end-1);

X12 = [N(:,1:end-1); ZhT(:,1:end-1)];

m11 = mean(X11)';

m12 = mean(X12)';

w1 = (m11-m12);

W1 = w1/norm(m11-m12);

x01 = (m11+m12)/3 - mean(std(Data))*log(1/2)*(m11-m12)/norm(m11-m12)^2;

a1 = -440;

Pw11 = X11*W1;

Pw12 = X12*W1;

deltaX1 = W1'*x01;

X21 = N(:,1:end-1);

X22 = ZhT(:,1:end-1);

m21 = mean(X21)';

m22 = mean(X22)';

w2 = (m21-m22);

W2 = w2/norm(m21-m22);

x02 = (m21+m22)/3 - mean(std([X21; X22]))*log(1)*(m21-m22)/norm(m21-m22)^2;

a2 = (m21+m22)'*W2/2;

Pw21 = X21*W2;

Pw22 = X22*W2;

deltaX2 = W2'*x02;

gx1 = -1200:25:-200;

gx2 = -1000:25:-200;

figure(3)

subplot(2,2,1)

histogram(Pw11,'BinWidth',50)

hold on

histogram(Pw12,'BinWidth',50)

hold on

xline(-440,'LineWidth',3)

legend('ФЖ','ФР+ЖТ','Порог','FontSize',20,'Location','northwest')

grid on

title('Гистограммы 1 этап','FontSize',20)

xlim([gx1(1),gx1(end)])

subplot(2,2,2)

histogram(Pw21,'BinWidth',50)

hold on

histogram(Pw22,'BinWidth',50)

hold on

xline(a2,'LineWidth',3)

legend('ФР','ЖТ','Порог','FontSize',20,'Location','northwest')

grid on

title('Гистограммы 2 этап','FontSize',20)

xlim([gx2(1),gx2(end)])

subplot(2,2,3)

G11 = normpdf(gx1,mean(Pw11),std(Pw11));

bar(gx1,G11)

hold on

G12 = normpdf(gx1,mean(Pw12),std(Pw12));

bar(gx1,G12)

hold on

xline(-440,'LineWidth',3)

legend('ФЖ','ФР+ЖТ','Порог','FontSize',20,'Location','northwest')

grid on

title('Гаусовское распределение 1 этап','FontSize',20)

xlim([gx1(1),gx1(end)])

subplot(2,2,4)

G21 = normpdf(gx2,mean(Pw21),std(Pw21));

bar(gx2,G21)

hold on

G22 = normpdf(gx2,mean(Pw22),std(Pw22));

bar(gx2,G22)

hold on

xline(a2,'LineWidth',3)

legend('ФР','ЖТ','Порог','FontSize',20,'Location','northwest')

grid on

title('Гаусовское распределение 2 этап','FontSize',20)

xlim([gx2(1),gx2(end)])

X1 = [Pw11;Pw12];

for i=1:length(X1)

if X1(i)>a1

P1(i)=1;

else

P1(i)=2;

end

end

[acc1, sens1, spec1, TP1, TN1, FP1, FN1] = Acc(P1,[N(:,end);ZhT(:,end);ZhT(:,end)]);

X2 = [Pw21;Pw22];

for i=1:length(X2)

if X2(i)>a1

P2(i)=1;

else

P2(i)=2;

end

end

[acc2, sens2, spec2, TP2, TN2, FP2, FN2] = Acc(P2,[N(:,end);ZhT(:,end)]);

ROC11 = getROC(X1, [N(:,end);ZhT(:,end);ZhT(:,end)], gx1);

ROC12 = getROC(X2, [N(:,end);ZhT(:,end)], gx2);

[Gacc1, Gsens1, Gspec1, GTP1, GTN1, GFP1, GFN1] = GausAcc(G11, G12, gx1, a1);

[Gacc2, Gsens2, Gspec2, GTP2, GTN2, GFP2, GFN2] = GausAcc(G21, G22, gx2, a2);

GROC11 = getGausROC(G11, G12, gx1);

GROC12 = getGausROC(G21, G22, gx2);

SROC11 = squareROC(ROC11);

SROC12 = squareROC(ROC12);

SGROC11 = squareROC(GROC11);

SGROC12 = squareROC(GROC12);

%% Классификация по критерию Фишера

X11 = FZh(:,1:end-1);

X12 = [N(:,1:end-1); ZhT(:,1:end-1)];

n11 = length(X11);

n12 = length(X12);

m11 = mean(X11);

m12 = mean(X12);

E11 = n11*cov(X11);

E12 = n12*cov(X12);

E1 = E11+E12;

w1 = inv(E1)*(m11-m12)';

W1 = w1/norm(w1);

Pw11 = X11*W1;

Pw12 = X12*W1;

a1 = -7;

X21 = N(:,1:end-1);

X22 = ZhT(:,1:end-1);

n21 = length(X21);

n22 = length(X22);

m21 = mean(X21);

m22 = mean(X22);

E21 = n21*cov(X21);

E22 = n22*cov(X22);

E2 = E21+E22;

w2 = inv(E2)*(m21-m22)';

W2 = w2/norm(w2);

Pw21 = X21*W2;

Pw22 = X22*W2;

a2 = -10;

gx1 = -40:2:20;

gx2 = -40:2:20;

figure(4)

subplot(2,2,1)

histogram(Pw11,'BinWidth',2)

hold on

histogram(Pw12,'BinWidth',2)

hold on

xline(a1,'LineWidth',3)

legend('ФЖ','ФР+ЖТ','Порог','FontSize',20,'Location','northwest')

grid on

title('Гистограммы 1 этап','FontSize',20)

xlim([gx1(1),gx1(end)])

subplot(2,2,2)

histogram(Pw21,'BinWidth',2)

hold on

histogram(Pw22,'BinWidth',2)

hold on

xline(a2,'LineWidth',3)

legend('ФР','ЖТ','Порог','FontSize',20,'Location','northwest')

grid on

title('Гистограммы 2 этап','FontSize',20)

xlim([gx2(1),gx2(end)])

subplot(2,2,3)

G11 = normpdf(gx1,mean(Pw11),std(Pw11));

bar(gx1,G11)

hold on

G12 = normpdf(gx1,mean(Pw12),std(Pw12));

bar(gx1,G12)

hold on

xline(a1,'LineWidth',3)

legend('ФЖ','ФР+ЖТ','Порог','FontSize',20,'Location','northwest')

grid on

title('Гаусовское распределение 1 этап','FontSize',20)

xlim([gx1(1),gx1(end)])

subplot(2,2,4)

G21 = normpdf(gx2,mean(Pw21),std(Pw21));

bar(gx2,G21)

hold on

G22 = normpdf(gx2,mean(Pw22),std(Pw22));

bar(gx2,G22)

hold on

xline(a2,'LineWidth',3)

legend('ФР','ЖТ','Порог','FontSize',20,'Location','northwest')

grid on

title('Гаусовское распределение 2 этап','FontSize',20)

xlim([gx2(1),gx2(end)])

X1 = [Pw11;Pw12];

for i=1:length(X1)

if X1(i)>a1

P1(i)=1;

else

P1(i)=2;

end

end

[acc1, sens1, spec1, TP1, TN1, FP1, FN1] = Acc(P1,[N(:,end);ZhT(:,end);ZhT(:,end)]);

X2 = [Pw21;Pw22];

for i=1:length(X2)

if X2(i)>a1

P2(i)=1;

else

P2(i)=2;

end

end

[acc2, sens2, spec2, TP2, TN2, FP2, FN2] = Acc(P2,[N(:,end);ZhT(:,end)]);

ROC21 = getROC(X1, [N(:,end);ZhT(:,end);ZhT(:,end)], gx1);

ROC22 = getROC(X2, [N(:,end);ZhT(:,end)], gx2);

[Gacc1, Gsens1, Gspec1, GTP1, GTN1, GFP1, GFN1] = GausAcc(G11, G12, gx1, a1);

[Gacc2, Gsens2, Gspec2, GTP2, GTN2, GFP2, GFN2] = GausAcc(G21, G22, gx2, a2);

GROC21 = getGausROC(G11, G12, gx1);

GROC22 = getGausROC(G21, G22, gx2);

SROC21 = squareROC(ROC21);

SROC22 = squareROC(ROC22);

SGROC21 = squareROC(GROC21);

SGROC22 = squareROC(GROC22);

%% Равные ковариционные матрицы

X11 = FZh(:,1:end-1);

X12 = [N(:,1:end-1); ZhT(:,1:end-1)];

n11 = length(X11);

n12 = length(X12);

m11 = mean(X11)';

m12 = mean(X12)';

E11 = n11*cov(X11);

E12 = n12*cov(X12);

E1 = E11+E12;

w1 = inv(E1)*(m11-m12);

W1 = w1;

x01 = (m11+m12)/2 - log(1/2)*(m11-m12)/norm(m11-m12)^2;

a1 = -0.055;

Pw11 = X11*W1;

Pw12 = X12*W1;

deltaX1 = W1'*x01;

X21 = N(:,1:end-1);

X22 = ZhT(:,1:end-1);

n21 = length(X21);

n22 = length(X22);

m21 = mean(X21)';

m22 = mean(X22)';

E21 = n21*cov(X21);

E22 = n22*cov(X22);

E2 = E21+E22;

w2 = inv(E2)*(m21-m22);

W2 = w2;

x02 = (m21+m22)/2 - log(1/2)*(m21-m22)/norm(m21-m22)^2;

a2 = -0.055;

Pw21 = X21*W2;

Pw22 = X22*W2;

deltaX2 = W2'*x02;

gx1 = -0.3:0.01:0.2;

gx2 = -0.3:0.01:0.1;

figure(5)

subplot(2,2,1)

histogram(Pw11,'BinWidth',0.01)

hold on

histogram(Pw12,'BinWidth',0.01)

hold on

xline(a1,'LineWidth',3)

legend('ФЖ','ФР+ЖТ','Порог','FontSize',20,'Location','northwest')

grid on

title('Гистограммы 1 этап','FontSize',20)

xlim([gx1(1),gx1(end)])

subplot(2,2,2)

histogram(Pw21,'BinWidth',0.01)

hold on

histogram(Pw22,'BinWidth',0.01)

hold on

xline(a2,'LineWidth',3)

legend('ФР','ЖТ','Порог','FontSize',20,'Location','northwest')

grid on

title('Гистограммы 2 этап','FontSize',20)

xlim([gx2(1),gx2(end)])

subplot(2,2,3)

G11 = normpdf(gx1,mean(Pw11),std(Pw11));

bar(gx1,G11)

hold on

G12 = normpdf(gx1,mean(Pw12),std(Pw12));

bar(gx1,G12)

hold on

xline(a1,'LineWidth',3)

legend('ФЖ','ФР+ЖТ','Порог','FontSize',20,'Location','northwest')

grid on

title('Гаусовское распределение 1 этап','FontSize',20)

xlim([gx1(1),gx1(end)])

subplot(2,2,4)

G21 = normpdf(gx2,mean(Pw21),std(Pw21));

bar(gx2,G21)

hold on

G22 = normpdf(gx2,mean(Pw22),std(Pw22));

bar(gx2,G22)

hold on

xline(a2,'LineWidth',3)

legend('ФР','ЖТ','Порог','FontSize',20,'Location','northwest')

grid on

title('Гаусовское распределение 2 этап','FontSize',20)

xlim([gx2(1),gx2(end)])

X1 = [Pw11;Pw12];

for i=1:length(X1)

if X1(i)>a1

P1(i)=1;

else

P1(i)=2;

end

end

[acc1, sens1, spec1, TP1, TN1, FP1, FN1] = Acc(P1,[N(:,end);ZhT(:,end);ZhT(:,end)]);

X2 = [Pw21;Pw22];

for i=1:length(X2)

if X2(i)>a1

P2(i)=1;

else

P2(i)=2;

end

end

[acc2, sens2, spec2, TP2, TN2, FP2, FN2] = Acc(P2,[N(:,end);ZhT(:,end)]);

ROC31 = getROC(X1, [N(:,end);ZhT(:,end);ZhT(:,end)], gx1);

ROC32 = getROC(X2, [N(:,end);ZhT(:,end)], gx2);

[Gacc1, Gsens1, Gspec1, GTP1, GTN1, GFP1, GFN1] = GausAcc(G11, G12, gx1, a1);

[Gacc2, Gsens2, Gspec2, GTP2, GTN2, GFP2, GFN2] = GausAcc(G21, G22, gx2, a2);

GROC31 = getGausROC(G11, G12, gx1);

GROC32 = getGausROC(G21, G22, gx2);

SROC31 = squareROC(ROC31);

SROC32 = squareROC(ROC32);

SGROC31 = squareROC(GROC31);

SGROC32 = squareROC(GROC32);

%% Множественный дискриминантный анализ

Sb=0;

Sw=0;

M = mean(Data);

for c = 0:2

Xi = Data((1+30*c):30*(c+1),:);

Mi = mean(Xi);

Sb = Sb + (Mi-M)'*(Mi-M)/3;

Sw = Sw + cov(Xi)/3;

end

[V, D, W] = eig(inv(Sw)*Sb);

lambda = [real(D(1,1)), real(D(2,2))];

W1 = V(:,1);

W2 = V(:,2);

Pw11=N(:,1:end-1)*W1;

Pw12=ZhT(:,1:end-1)*W1;

Pw13=FZh(:,1:end-1)*W1;

Pw21=N(:,1:end-1)*W2;

Pw22=ZhT(:,1:end-1)*W2;

Pw23=FZh(:,1:end-1)*W2;

M11 = mean(Pw11);

M12 = mean(Pw12);

M13 = mean(Pw13);

M21 = mean(Pw21);

M22 = mean(Pw22);

M23 = mean(Pw23);

S11 = var(Pw11);

S12 = var(Pw12);

S13 = var(Pw13);

S21 = var(Pw21);

S22 = var(Pw22);

S23 = var(Pw23);

Dadata = [Pw11,Pw21;Pw12,Pw22;Pw13,Pw23];

figure(6)

scatter(Pw11,Pw21,120,'b','filled')

hold on

scatter(Pw12,Pw22,120,'g','filled')

hold on

scatter(Pw13,Pw23,120,'r','filled')

grid on

xlabel('W1','FontSize',20)

ylabel('W2','FontSize',20)

legend('ФР','ЖТ','ФЖ','FontSize',20,'Location','northwest')

%% ROC

figure(7)

subplot(1,2,1)

plot(ROC11(1,:),ROC11(2,:), LineWidth=4)

hold on

plot(ROC21(1,:),ROC21(2,:), LineWidth=3)

hold on

plot(ROC31(1,:),ROC31(2,:), LineWidth=2)

xlabel("Специфичность",'FontSize',20)

ylabel("Чувствительность",'FontSize',20)

legend('Минимум расстояний','Фишер','Равные ков. матрицы','FontSize',20,'Location','southeast')

grid on

title('ROC кривая 1 Этап','FontSize',20)

xlim([0,1])

ylim([0,1])

subplot(1,2,2)

plot(ROC12(1,:),ROC12(2,:), LineWidth=4)

hold on

plot(ROC22(1,:),ROC22(2,:), LineWidth=3)

hold on

plot(ROC32(1,:),ROC32(2,:), LineWidth=2)

xlabel("Специфичность",'FontSize',20)

ylabel("Чувствительность",'FontSize',20)

legend('Минимум расстояний','Фишер','Равные ков. матрицы','FontSize',20,'Location','southeast')

grid on

title('ROC кривая 2 Этап','FontSize',20)

xlim([0,1])

ylim([0,1])

figure(8)

subplot(1,2,1)

plot(GROC11(1,:),GROC11(2,:), LineWidth=4)

hold on

plot(GROC21(1,:),GROC21(2,:), LineWidth=3)

hold on

plot(GROC31(1,:),GROC31(2,:), LineWidth=2)

xlabel("Специфичность",'FontSize',20)

ylabel("Чувствительность",'FontSize',20)

legend('Минимум расстояний','Фишер','Равные ков. матрицы','FontSize',20,'Location','southeast')

grid on

title('ROC кривая 1 Этап','FontSize',20)

xlim([0,1])

ylim([0,1])

subplot(1,2,2)

plot(GROC12(1,:),GROC12(2,:), LineWidth=4)

hold on

plot(GROC22(1,:),GROC22(2,:), LineWidth=3)

hold on

plot(GROC32(1,:),GROC32(2,:), LineWidth=2)

xlabel("Специфичность",'FontSize',20)

ylabel("Чувствительность",'FontSize',20)

legend('Минимум расстояний','Фишер','Равные ков. матрицы','FontSize',20,'Location','southeast')

grid on

title('ROC кривая 2 Этап','FontSize',20)

xlim([0,1])

ylim([0,1])

function [acc, sens, spec, TP, TN, FP, FN] = Acc(predict,target)

TP = length(find(predict ~= 1 & target ~= 1));

TN = length(find(predict == 1 & target == 1));

FP = length(find(predict ~= 1 & target == 1));

FN = length(find(predict == 1 & target ~= 1));

%% Метрики точности

acc = (TP+TN)/height(target);

sens = TP/(FN+TP);

spec = TN/(FP+TN);

end

function [acc, sens, spec, TP, TN, FP, FN] = GausAcc(G1, G2, gx, a)

deltaGx = gx(2)-gx(1);

S1 = sum(G1.*deltaGx);

S2 = sum(G2.*deltaGx);

g2=find(gx<a);

g1=find(gx>=a);

TP = sum(G2(g2).*deltaGx)/S2;

TN = sum(G1(g1).*deltaGx)/S1;

FP = 1-TN;

FN = 1-TP;

%% Метрики точности

acc = (TP+TN)/2;

sens = TP/(FN+TP);

spec = TN/(FP+TN);

end

function ROC = getGausROC(G1, G2, gx)

for i=1:length(gx)

[acc, sens, spec, TP, TN, FP, FN] = GausAcc(G1, G2, gx, gx(i));

ROC(:,i)=[1-spec; sens];

end

end

function ROC = getROC(X, target, gx)

for j = 1:length(gx)

for i=1:length(X)

if X(i)>gx(j)

predict(i)=1;

else

predict(i)=2;

end

end

[acc, sens, spec, TP, TN, FP, FN] = Acc(predict',target);

ROC(:,j)=[1-spec; sens];

end

end

function [acc, classMatrix] = kneib(Train, Test, k, type)

Model = fitcknn(Train(:,1:end-1), Train(:,end), 'NumNeighbors', k, ...

'DistanceWeight',type);

Predict = predict(Model,Test(:,1:end-1));

Target = Test(:,end);

classMatrix = zeros(3);

for k=1:length(Predict)

classMatrix(Target(k),Predict(k))=classMatrix(Target(k),Predict(k))+1;

end

acc = (classMatrix(1,1)+classMatrix(2,2)+classMatrix(2,2))/45;

end

function SROC = squareROC(ROC)

SROC=0;

for i = 2:1:length(ROC)

SROC = SROC + ROC(2,i)*(ROC(1,i)-ROC(1,i-1));

end

end

Соседние файлы в предмете Технологии и системы принятия решений