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

📄 kfisher.m

📁 introduction of kfisher
💻 M
字号:
clear all
num_class=79;                                      % 类别数
num_inclass=3;                                     % 每一类的样本数
num_all=num_class*num_inclass;                     % 所有样本数
m=100;                                             % 期望的行数 
n=60;                                             % 期望的列数
M=m*n;

min=1;
resultofratio=zeros(1,15);

%load K;                                  % 读入训练样本的核函数(核函数为K)
%load K_new;                               % 读入训练样本的核函数(核函数为K_new)
load K_rbf_minus;                        % 读入训练样本的核函数(核函数为K_rbf_minus)

%load K_test;                             % 读入测试样本的核函数(核函数为K_test)
%load K_test_new;                          % 读入测试样本的核函数(核函数为K_test_new)
load K_test_rbf_minus;                   % 读入测试样本的核函数(核函数为K_test_rbf_minus)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% PCA降维

K_one=ones(num_all,num_all);

% tempfait=K-(1/num_all*K*K_one)-(1/num_all*K_one*K)+(1/(num_all*num_all)*K_one*K*K_one);
%tempfait=K_new-(1/num_all*K_new*K_one)-(1/num_all*K_one*K_new)+(1/(num_all*num_all)*K_one*K_new*K_one);
tempfait=K_rbf_minus-(1/num_all*K_rbf_minus*K_one)-(1/num_all*K_one*K_rbf_minus)+(1/(num_all*num_all)*K_one*K_rbf_minus*K_one);

[V_tempfait,D_tempfait]=eig(tempfait);

Vtempst=zeros(num_all,(num_all-num_class));

for i=1:num_all-1
    k=i;
    for j=(i+1):num_all
        if(D_tempfait(k,k)<D_tempfait(j,j))           % 从大到小排
            k=j;
        end
        if(k~=i)
        
            temp_d=D_tempfait(i,i);
            temp_v=V_tempfait(:,i);
            
            D_tempfait(i,i)=D_tempfait(k,k);
            V_tempfait(:,i)=V_tempfait(:,k);
            
            D_tempfait(k,k)=temp_d;
            V_tempfait(:,k)=temp_v;
            
        end
    end
end
        

for i=1:(num_all-num_class)
    Vtempst(:,i)=V_tempfait(:,i);
end


% Y=K-(1/num_all*K_one*K);
%Y=K_new-(1/num_all*K_one*K_new);
Y=K_rbf_minus-(1/num_all*K_one*K_rbf_minus);
 
Z=Vtempst'*Y;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

sum_Z=zeros((num_all-num_class),1);

fai_b=zeros((num_all-num_class),num_class);
fai_w=zeros((num_all-num_class),num_all);

sum_inclass=zeros((num_all-num_class),num_class);
mean_inclass=zeros((num_all-num_class),num_class);


for i=1:num_all
   sum_Z=sum_Z+Z(:,i);                                                          % 所有训练样本的和 
end
mean_Z=sum_Z/num_all;                                                           % 计算所有样本的平均值mean_Z

for i=1:num_class
    for j=1:num_inclass
        sum_inclass(:,i)=sum_inclass(:,i)+Z(:,(i-1)*num_inclass+j);
    end
    mean_inclass(:,i)=sum_inclass(:,i)/num_inclass;                             % 计算类内样本的平均值mean_inclass
end


for i=1:num_class    
   fai_b(:,i)=mean_inclass(:,i)-mean_Z;                                          % 计算类间离散度sb的简单算法                   
end

sb=fai_b*(fai_b');    

for i=1:num_class
    for j=1:num_inclass
       fai_w(:,(i-1)*num_inclass+j)=Z(:,(i-1)*num_inclass+j)-mean_inclass(:,i);   % 计算类内离散度sw的简单算法
    end
end

sw=fai_w*(fai_w');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[V,D]=eig(inv(sw)*sb);       % 计算在sw的非零空间下,类内距离最小,类间距离最大的投影空间。 D降序排列

% dim_fisher=num_class-1;
dim_fisher_g=[10:10:150];

for index=1:15
    dim_fisher=dim_fisher_g(index);

project_fisher=zeros((num_all-num_class),dim_fisher);

for i=1:dim_fisher
    project_fisher(:,i)=V(:,i);
end

X_trainvector=project_fisher'*Z;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

K_test_one=ones(num_all,num_all);

% Y_test=K_test-(1/num_all*K_test_one*K_test);                          
%Y_test=K_test_new-(1/num_all*K_test_one*K_test_new);
Y_test=K_test_rbf_minus-(1/num_all*K_test_one*K_test_rbf_minus);
 
Z_test=Vtempst'*Y_test;

X_testvector=project_fisher'*Z_test;                              % 计算测试样本的特征向量

for i=1:num_class
      
    for j=1:num_all
        temp=(X_testvector(:,i)-X_trainvector(:,j))'*(X_testvector(:,i)-X_trainvector(:,j));    % 计算测试样本与训练样本的最近邻距离
        distance(1,j)=sqrt(temp);
    end
    
    for j=1:num_all
        if  distance(1,j)<distance(1,min)
            min=j;                                                          % 找到与测试样本距离最近的训练样本的编号
        end
    end
    
    remember(1,i)=min;                                                      % 将与相应的测试样本距离最近的训练样本的编号存入remember一维行向量中
    
end

result_class=zeros(1,num_class);
num_recognition=0;

for i=1:num_class
    
    remainder=mod(remember(1,i),num_inclass);                               % 与相应的测试样本距离最近的训练样本的编号除以每一类的样本数的余数       
    quotient=fix(remember(1,i)/num_inclass);                                % 与相应的测试样本距离最近的训练样本的编号除以每一类的样本数的商       
    
    if(remainder==0)
        result_class(1,i)=quotient;                                         % 计算测试样本的类别 (余数为零)
    else
        result_class(1,i)=quotient+1;                                       % 计算测试样本的类别 (余数不为零)
    end
    
    if(result_class(1,i)==i)
        num_recognition=num_recognition+1;                                  % 计算识别正确的个数
    end
    
end

ratio_recognition(index)=100*num_recognition/num_class;                                % 计算识别率
end
ratio_recognition;
plot(10:10:150,ratio_recognition(1:15))
axis([0 150 0 100])
hold on

⌨️ 快捷键说明

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