用于降维的线性判别分析(LDA)算法

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值