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

📄 hddc_classif.m

📁 高维数据分类程序!数据挖掘及图像分析利器!matlab版!
💻 M
字号:
function [cls,P] = hdda_classif2_faster(prms,Y,varargin);
% High Dimensionality Discriminant Analysis (classification)
%
% Usage: (1) [cls,P] = hdda_classif(prms,Y);
%       
% Input: 
%       - prms: parameters of classes
%       - Y: data to classify
%
% Output:
%       - cls: label of test data Y.data,
%       - P: a posteriori probabilities
%
% Authors: C. Bouveyron <charles.bouveyron@inrialpes.fr> - 2004-2006
% 
% Reference: C. Bouveyron, S. Girard and C. Schmid, "High Dimensional Discriminant Analysis",
% 		 Communications in Statistics, Theory and methods, in press, 2007.

% Initialization %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if isstruct(Y), 
	data = Y.data; 
	if isfield(Y,'cls'), 
        class = Y.cls; 
    else class = [];
    end
else data = Y; class = []; 
end

[nt,pt] = size(data);
model = prms.model;
k = prms.k; p = prms.p;
a = prms.a; b = prms.b;
d = prms.d; prop = prms.prop; 
m = prms.m; Q = prms.Q; 

% Cost function computing %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:k
    % Projection of test data in the eigenspace Ei
    Pa = ((data - repmat(m(i,:),nt,1)) * Q{i}) * Q{i}';
    Pb = Pa + repmat(m(i,:),nt,1) - data;

    % Compute cost function K_i(x)
    switch model
        case {'AijBiQiDi','AijBiQiD','AijBQiDi','AijBQiD','AjBiQiD','AjBQiD','AjBQD'}
            ai = a(1:d(i),i)';
            K(:,i) = diag(Pa * Q{i} * diag(1./ai) * Q{i}' * Pa') ...
                + (1/b(i) * sum(Pb.^2,2)) + sum(log(ai)) ...
                + (p-d(i)) * log(b(i)) - 2 * log(prop(i)) + p * log(2*pi);

        otherwise
            K(:,i) = 1/a(i) * sum(Pa.^2,2) + (1/b(i) * sum(Pb.^2,2)) + d(i) * log(a(i)) ...
                + (p-d(i)) * log(b(i)) - 2 * log(prop(i)) + p * log(2*pi);
    end
end

% a posteriori probabilities %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
P = exp(-0.5*K) ./ repmat(sum(exp(-0.5*K),2),1,k);

if length(find(isnan(P)))~=0 | length(find(isinf(P)))~=0
  fprintf('--> overflow switching to O(k*k) mode\n');
  clear P;
  eksp = zeros(nt,k);
  for i=1:k
    for l=1:k
      eksps(:,l) = exp(0.5*(K(:,i) - K(:,l)));
    end
    P(:,i) = 1./sum(eksps,2);
  end
end

% Classification %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[val,cls] = max(P,[],2);

% Classification results %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if ~isempty(class),
	tx = sum(cls == class) / length(cls);
	fprintf('--> Correct classification rate: %g \n',tx);
end 

⌨️ 快捷键说明

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