📄 train_set.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%% Training %%%%%%%%%%%%%%%%%%%%%%%%%%
function [Training]=Train_Set(TrainSet)
% 1.计算各类样本均值向量: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;
% 2.计算样本类内离散度矩阵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;
% 3.计算投影直线的斜率Training.W
Training.W=(Training.M1-Training.M2)*inv(Training.Sw);
% 4.计算阈值Training.y
%先计算均值ma1,ma2
y=[1:TrainSet.n];
ma1=0;
ma2=0;
N1=TrainSet.n1;
N2=TrainSet.n2;
for i=1:TrainSet.n
y(i)=Training.W*X(:,i);%投影
if TrainSet.CN(i)==1
ma1=ma1+y(i);
else
ma2=ma2+y(i);
end
end
ma1=ma1/N1;
ma2=ma2/N2;
% 方法一:Training.y1=(m1+m2)/2
Training.y1=(ma1+ma2)/2;
%方法二:Training.y2=[(ma1+ma2)/2-ln(Pc1/Pc2)/(N1+N2-2)]
Pc1=N1/(N1+N2);
Pc2=N2/(N1+N2);
Training.y2=[(ma1+ma2)/2-log(Pc1/Pc2)/(N1+N2-2)];
% 方法三: Training.y3=(N1*ma1+N2*ma2)/(N1+N2)
Training.y3=(N1*ma1+N2*ma2)/(N1+N2);
% 方法四:取两类边界点的中点为y4
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.y4=(maxy(2)+miny(1))/2;
else
Training.y4=(maxy(1)+miny(2))/2;
end
%%%%%%%%%%%%%%%%%%%%%%%% Training End %%%%%%%%%%%%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -