Заключение
В рамках работы были рассмотрены методы классификации 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