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

📄 definite.m

📁 模式识别贝叶斯程序
💻 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 + -