LDA降维算法分为简单两类情况和多类通用情况

只有两类样本的简单情况:

输入:两类样本特征


目的:将两类样本的特征投影至同类距离小,异类距离大的低维空间上,使得数据量减少的同时不损失分类信息


步骤:


1,计算两类样本的均值u0和u1,协方差矩阵sigma0,sigma1


2,假设投影空间w,两类样本投影到w后,均值为w'*u0和w'*u1,协方差矩阵为w'*sigma0*w和w'*sigma1*w


3,根据使投影后样本的均值差大,协方差矩阵小的目的,引出最大化优化公式J = ||w'u0 - w'u1|| / (w'*sigma0*w + w'*sigma1*w) = w'*(u0 - u1)*(u0 - u1)'*w / w'*(sigma0 + sigma1)*w


4,定义类内散度矩阵Sw = sigma0 + sigma1


5,定义类间散度矩阵Sb = (u0 - u1) * (u0 - u1)'


6,根据类内散度矩阵和类间散度矩阵,简化优化公式J = w'*Sb*w / w'*Sw"w5,该式与广义瑞利熵具有相同形式


7,根据求解广义瑞利熵的方法,对Sw进行SVD分解,即Sw = U*sigma*V',再得inv(Sw) = V*inv(sigma)*U'


8,由拉格朗日乘子法可得,w = inv(Sw)*(u0 - u1)


9,对数据x以w'*x进行投影即可完成降维



对多类样本的通用情况:


输入:N类样本特征


目的:将多类样本的特征投影至同类距离小,异类距离大的低维空间上,使得数据量减少的同时不损失分类信息


1,计算所有样本特征的均值u,与第i类的类内均值ui,样本数mi


2,与两类样本情况一样


3,定义全局散度矩阵St = Sb+Sw = Σ(xi - u) * (xi - u)',Σ是对所有样本累加操作


4,定义Swi = Σ(x - ui) * (x - ui)',Σ是对第i类的所有样本进行累加操作


5,定义类内散度矩阵Sw = ΣSwi,Σ是对所有类进行累加操作


6,由Sb = St - Sw得,Sb = Σmi * (ui - u) * (ui - u)',Σ是对所有类进行累加操作


7,假设投影空间W,引出最大化的优化公式tr(W'*Sb*W) / tr(W'*Sw*W)


8,设想要降低到d'维,对inv(Sw) * Sb进行SVD分解,从大到小的前d'个特征值对应的特征变量组成的W即为投影空间W


9,将数据按照W'*x的方式投影,即可降维


Matlab代码:

function [deX, W, deDim]  = LDA( X, Y) 

%% 函数功能:LDA降维实现,只保留特征值大于1的维度 

%   输入:样本X,标签Y 

%   输出:降维后样本deX,降维后的维数deDim,降维后的子空间W 

%% 初始化参数 

t0 = tic; 

uT = mean(X,2); %全局均值 

nLab = unique(Y); % 具体标签值 

numC = length(nLab'); % 类别个数 

mC = zeros(1,numC); % 每类的样本个数 

dim = size(X, 1); 

sWi = zeros(dim, dim, numC); % 每类的协方差矩阵 

uW = zeros(dim, numC); % 每类的均值 

sW = zeros(dim, dim);  % 类内协方差矩阵 

sBi = zeros(dim,dim,numC); % 每类的类间矩阵 

sB = zeros(dim, dim); % 类间协方差矩阵 

fprintf(' finish LDA initialization \n'); 

fprintf(' time cost : %.3g seconds\n\n', toc(t0)); 

t0 = tic; 



%% 求全局协方差矩阵和类内协方差矩阵 

for nC = 1:numC 

    [index, ~] = find(Y == nLab(nC)); 

    trainC = X(:,index); 

    uW(:,nC) = mean(trainC, 2); 

    mC(nC) = length(index); 

    trainC = trainC - repmat(uW(:,nC),1 ,mC(nC)); 

    sWi(:,:,nC) = trainC * trainC'; 

    sBi(:,:,nC) = mC(nC) * ((uW(:,nC) - uT) * (uW(:,nC) - uT)'); 

end 

sW = sum(sWi, 3); 

sB = sum(sBi, 3); 



%% 正则化 

lambda = 0.001; 

sW = sW + lambda * eye(dim); 

sB = sB + lambda * eye(dim); 



%% 得到特征值大于1的降维空间 

[W, S] = svd(sW \ sB); 

latent = diag(S); 

deDim = sum(latent>=1); 

W = W(:,1:deDim); 

fprintf(' finish build the subspace, dim of the subspace is %d \n', deDim); 

fprintf(' time cost : %.3g seconds\n\n', toc(t0)); 

t0 = tic; 



%% 将样本进行投影 

deX = W' * X; 

fprintf(' finish reflect in the subspace\n'); 

fprintf(' time cost : %.3g seconds\n\n', toc(t0)); 

end