⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 train_set.m

📁 Fisher线性判别是线性分类算法中最基本的一种算法
💻 M
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%% Training %%%%%%%%%%%%%%%%%%%%%%%%%%
function [Training]=Train_Set(TrainSet)
% 计算各类样本均值向量:Training.M1,Training.M2
Training.M1=[1:TrainSet.tn]*0;
Training.M2=[1:TrainSet.tn]*0;
X=TrainSet.X';
for i=1:TrainSet.n
    if TrainSet.CN(i)==1
        Training.M1=Training.M1+X(:,i)';
    else
        Training.M2=Training.M2+X(:,i)';
    end
end
Training.M1=Training.M1/TrainSet.n1;
Training.M2=Training.M2/TrainSet.n2;

% 计算样本类内离散度矩阵Si 和 总类内离散度矩阵Training.Sw
S1=zeros(TrainSet.tn);
S2=zeros(TrainSet.tn);
for i=1:TrainSet.n
    if TrainSet.CN(i)==1
        S1=S1+(X(:,i)'-Training.M1)'*(X(:,i)'-Training.M1);
    else
        S2=S2+(X(:,i)'-Training.M2)'*(X(:,i)'-Training.M2);        
    end
end
Training.Sw=S1+S2;

% 计算投影直线的斜率Training.W
Training.W=(Training.M1-Training.M2)*inv(Training.Sw);

% 计算阈值Training.y
y=[1:TrainSet.n];
% 方法一:Training.y1=(m1+m2)/2
m1=0;
m2=0;
for i=1:TrainSet.n
    y(i)=Training.W*X(:,i);
    if TrainSet.CN(i)==1
        m1=m1+y(i);
    else
        m2=m2+y(i);
    end
end
m1=m1/TrainSet.n1;
m2=m2/TrainSet.n2;
Training.y1=(m1+m2)/2;

% 方法二:取全体样本的均值点为y2
Training.y2=(m1*TrainSet.n1+m2*TrainSet.n2)/TrainSet.n;

% 方法三:取两类边界点的中点为y3
maxy=[realmax*-1,realmax*-1];
miny=[realmax,realmax];
for i=1:TrainSet.n
    if TrainSet.CN(i)==1
        maxy(1)=max(maxy(1),y(i));
        miny(1)=min(miny(1),y(i));
    else
        maxy(2)=max(maxy(2),y(i));
        miny(2)=min(miny(2),y(i));
    end
end
if maxy(1)-miny(2)>maxy(2)-miny(1)
    Training.y3=(maxy(2)+miny(1))/2;
else
    Training.y3=(maxy(1)+miny(2))/2;
end

% 方法四:取两类边界点的比例中点为y4
n1=0;
n2=0;
if maxy(1)-miny(2)>maxy(2)-miny(1)
    for i=1:TrainSet.n
        if TrainSet.CN(i)==1 & y(i)-Training.y3<0
            n1=n1+1;       
        elseif TrainSet.CN(i)==-1 & y(i)-Training.y3>0
            n2=n2+1;
        end
    end
    if n1~=0 & n2~=0
        Training.y4=(maxy(2)*n2+miny(1)*n1)/(n1+n2);
    else
        Training.y4=(maxy(2)+miny(1))/2;   
    end
else
    for i=1:TrainSet.n
        if TrainSet.CN(i)==1 & y(i)>Training.y3
            n1=n1+1;       
        elseif TrainSet.CN(i)==-1 & y(i)<Training.y3
            n2=n2+1;
        end
    end
    if n1~=0 & n2~=0
        Training.y4=(miny(2)*n2+maxy(1)*n1)/(n1+n2);
    else
        Training.y4=(maxy(1)+miny(2))/2;
    end
end

%%%%%%%%%%%%%%%%%%%%%%%% Training End %%%%%%%%%%%%%%%%%%%%%%%%

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -