📄 definite.m
字号:
%整个程序是用Matlab编写的,执行过程是将definite与indata文件在Matlab下work录下,运行definite命令
%第一个结果是普通的K近邻法,第二个结果是首先对数据进行预处理,其方法如下:取出已判样本类的最大值与最小值,
%然后按照(x-min)/(max-min)进行简单的线形处理,使得样品在值在(0~1)区间。第三个结果是fisher判别分析的结果。
%程序缺点就是首先要对数据进行处理,在indata文件中,data是已判样本,indefinite是待判样本。且data文件必须将
%样品类别放在最后一列,indefinite数据比data数据少一列(因为indefinite数据缺少判别归类号)。
%程序优点是无须输入已判样品组号、数据行数、列数且提示输入方法与输入数字等。
%由于时间有限,暂时不对程序编写过程做解释行语言,可读性不高。
clear;
clc
indata;
disp('本算法是跟据 K-近邻法 对 indefinite 样本做的分段线性判别模型。')
disp('此模型需要 已判样本 最后一列为 样本类号。这需要做一定的数据处理。')
disp('参考书目: <<模式识别>>')
disp('××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××')
[line,row]=size(data);
[uline,urow]=size(indefinite);
fprintf('请输入待判样本的前几个样本归类 ( 小于等于 %d): ',uline);
p=input('');
if p>uline
return;
disp('输入错误,请重新输入!');
end
fprintf('请输入K值,K值的选取对结果影响较大( K 值小于等于 %d): ',line);
u=input('');
if u>line
disp('输入错误,请重新输入!');
return;
end
for w=1:p
for i=1:line
temp=0;
for j=1:(row-1)
temp=temp+(data(i,j)-indefinite(w,j))^2;
end
near(i,1)=temp;near(i,2)=data(i,16);
end
[Ascend,Ind]=sort(near);
syncretic=zeros(4,1);
for i=1:u
switch near(Ind(i,1),2)
case 1
syncretic(1)=syncretic(1)+1;
case 2
syncretic(2)=syncretic(2)+1;
case 3
syncretic(3)=syncretic(3)+1;
case 4
syncretic(4)=syncretic(4)+1;
end
end
[Ascend,Ind]=sort(syncretic);
fprintf('第 %d 个样本属于第 %d 类。\n',w,Ind(4));
end
disp('××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××')
disp('由于所研究的各个变量的量纲往往不一致,即使统一了量纲有时原始数据的大小也有悬殊,')
disp('为了避免有些特征变量受到压抑,在分类前,我们首先对原始数据进行预处理。')
disp('所得判别如下所示:')
mindata=min(data);
maxdata=max(data);
for w=1:p
for i=1:line
temp=0;
for j=1:(row-1)
temp=temp+((data(i,j)-mindata(j))/(maxdata(j)-mindata(j))-(indefinite(w,j)-mindata(j))/(maxdata(j)-mindata(j)))^2;
end
near(i,1)=temp;near(i,2)=data(i,16);
end
[Ascend,Ind]=sort(near);
syncretic=zeros(4,1);
for i=1:u
switch near(Ind(i,1),2)
case 1
syncretic(1)=syncretic(1)+1;
case 2
syncretic(2)=syncretic(2)+1;
case 3
syncretic(3)=syncretic(3)+1;
case 4
syncretic(4)=syncretic(4)+1;
end
end
[Ascend,Ind]=sort(syncretic);
fprintf('第 %d 个样本属于第 %d 类。\n',w,Ind(4));
end
disp('××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××')
disp('Fisher线性判别分析所得结果如下(取前两种类别进行判别):');
[line,row]=size(data);
j=1;k=1;
for i=1:line
if data(i,row)==1,
adata(j,1:row-1)=data(i,1:row-1);j=j+1;
else if data(i,row)==2,
bdata(k,1:row-1)=data(i,1:row-1);k=k+1;
end
end
end
aaverage=mean(adata);
baverage=mean(bdata);
diff=aaverage-baverage;
[aline,arow]=size(adata);
[bline,brow]=size(bdata);
for i=1:aline
leave(i,:)=adata(i,:)-aaverage;
end
for j=1:bline
leave(i+1,:)=bdata(j,:)-baverage;i=i+1;
end
scatter=inv((leave')*leave);
modulus=scatter*diff';
agravity=aaverage*modulus;
bgravity=baverage*modulus;
yaverage=(aline*agravity+bline*bgravity)/(aline+bline);
if agravity>=bgravity
for i=1:p
if indefinite(i,:)*modulus>=yaverage
fprintf('第 %d 个样本属于第 1 类。\n',i);
else fprintf('第 %d 个样本属于第 2 类。\n',i);
end
end
else
for i=1:p
if indefinite(i,:)*modulus<=yaverage
fprintf('第 %d 个样本属于第 1 类。\n',i);
else fprintf('第 %d 个样本属于第 2 类。\n',i);
end
end
end
disp('××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××')
disp('完成判别!')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -