LINUX.ORG.RU

Объясните данный код на matlab распознавания образов для 2х классов

 , ,


0

1
%1. Случай, когда классы отличаются лишь матожиданиями,
%а матрицы ковариации одинаковы C1=C2=C

clear all;
n=100;
C=[4 1 -1; 1 4 1;-1 1 4]; %матрица ковариации
%формируем реализации образов класса N1 на основе двумерной %гауссовcкой случайной величины с матожиданием M1
M1=[-2 -3 -3];
N1=randncor(3,n,C);
N1(1,:)=N1(1,:)+M1(1);
N1(2,:)=N1(2,:)+M1(2);
N1(3,:)=N1(3,:)+M1(3);
%формируем реализации образов класса N2 с матожиданием M2
M2=[1 11 0];
N2=randncor(3,n,C);
N2(1,:)=N2(1,:)+M2(1);
N2(2,:)=N2(2,:)+M2(2);
N2(3,:)=N2(3,:)+M2(3);

T1(1:n)=0;
T2(1:n)=1;
N=[N1 N2];
T=[T1 T2];
figure(1);
%subplot(2,2,1); %позволяет выводить графики каскадом
plotpv(N,T);
%Пусть на вход классификатора поступают реализации класса N1,
%тогда логарифм отношения правдоподобия g(x)
g1(1:n)=0;g2(1:n)=0;
I1=0;
I2=0;
for i=1:n
    g1(i)=(N1(:,i)'/C)*(M1-M2)'-(1/2)*((M1+M2)/C)*(M1-M2)';
    g2(i)=(N2(:,i)'/C)*(M1-M2)'-(1/2)*((M1+M2)/C)*(M1-M2)';
    if g1(i)>0 
         I1=I1+1; 
    end;
    if g2(i)>0 
         I2=I2+1; 
    end; 
end;
figure(2);
subplot(1,2,1);
hist(g1,16); %для n<1000 получается не похоже на норм. распр. 

subplot(1,2,2);
hist(g2,16); %для n<1000 получается не похоже на норм. распр. 

%Посчитаем теоретические матожидание и дисперсию g(x) для %гипотезы о принадлежности первому классу

Mg_1=1/3*(M1-M2)/inv(C)*(M1-M2)'
a1=Mg_1;
Dg_1=2*a1
%второму классу
Mg_2=-1/3*(M1-M2)/inv(C)*(M1-M2)'
Dg_2=Dg_1
%посчитаем практические матожидание и дисперсию
Mg_pr_1=mean(g1)
Dg_pr_1=std(g1)^2

%оценим вероятность ошибки первого рода (принимаем решение о %принадлежности второму классу, а в действительности верна %гипотеза о принадлежности первому)
c1=0;
x=(c1-a1)/sqrt(2*a1);
alpha=normcdf(x)

%оценим вероятность ошибки второго рода (принимаем решение о %принадлежности первому классу, а в действительности верна %гипотеза о принадлежности второму)
x=(c1+a1)/sqrt(2*a1);
beta=1-normcdf(x)
SummOshibkaDlyaN1=1-I1/n
SummOshibkaDlyaN2=1-I2/n

%****Для второго класса

Mg_1=1/2*(M1-M2)/inv(C)*(M1-M2)'
Dg_1=2*Mg_1;
%второму классу
Mg_2=-1/2*(M1-M2)/inv(C)*(M1-M2)';
a2=Mg_2;
Dg_2=2*a2;
%посчитаем практические матожидание и дисперсию
Mg_pr_2=mean(g2)
Dg_pr_2=std(g2)^2

%оценим вероятность ошибки первого рода (принимаем решение о %принадлежности второму классу, а в действительности верна %гипотеза о принадлежности первому)
c1=0;
x=(c1-a2)/sqrt(2*a2);
alpha=1-normcdf(x)

%оценим вероятность ошибки второго рода (принимаем решение о %принадлежности первому классу, а в действительности верна %гипотеза о принадлежности второму)
x=(c1+a2)/sqrt(2*a2);
beta=normcdf(x)

function y=randncor(m,n,C);
%09.09.05 функция для генерации гауссовских случайных векторов 
%с нулевым мат. ожиданием и матрицей ковариации С размера m*m
%m-размер (длина) вектора; n-количество генерируемых векторов
%в совокупности на выходе образуется матрица размера m*n  
% формирование верхнетреугольной матрицы разложения (факторизации) Холецкого
R=chol(C);
%генерация матрицы размера m*n гауссовских независимых случайных величин с
%параметрами 0;1
x=randn(m,n);
%получение матрицы n гауссовских коррелированных векторов длиною m каждый
y=R'*x;
%пример проверки результатов путем оценки матрицы ковариации получаемой
%совокупности данных
% m=3; n=1000;
% C=[3 2 1;2 3 2;1 2 3]
% R=chol(C)
% A=R'*R
% x=randn(m,n);
% y=R'*x;
% оценка выборочной матрицы ковариации
% s=zeros(m,m)
% for i=1:n
% s=s+y(:,i)*y(:,i)';
% end;
% s=s/n


Последнее исправление: Gremlin_ (всего исправлений: 3)

ML добрался и до пожилых фортранщиков? Выглядит жутковато.

nezamudich ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.