LDA降维原理
1. 数学模型
">
C:类别数量
Nc:每个类别的样本数量
μc:每个类别的均值向量
μ:总体均值向量
2. 降维维度限制
k ≤ C - 1
最大的降维维度取决于类别的数量。
MATLAB实现方案
1. 基础实现(使用内置函数)
% 加载示例数据集(鸢尾花数据集)
load fisheriris
X = meas;
Y = species;
% 执行线性判别分析降维
ldaModel = fitcdiscr(X, Y, 'DiscrimType', 'linear');
X_lda = predict(ldaModel, X);
% 结果可视化
figure;
gscatter(X_lda(:,1), X_lda(:,2), Y);
xlabel('LD1');
ylabel('LD2');
title('LDA降维结果(使用内置函数)');
2. 手动实现(完整流程)
function [W, X_lda] = manual_LDA(X, Y, num_components)
% 输入参数:
% X: 原始数据矩阵 (样本数 x 特征数)
% Y: 标签 (样本数 x 1)
% num_components: 降维后的维度
% 计算类别信息
classes = unique(Y);
n_classes = length(classes);
n_features = size(X, 2);
% 计算全局均值
mu = mean(X);
% 初始化散度矩阵
Sw = zeros(n_features, n_features);
Sb = zeros(n_features, n_features);
% 计算类内/类间散度矩阵
for i = 1:n_classes
Xi = X(Y == classes(i), :);
Ni = size(Xi, 1);
mu_i = mean(Xi);
% 类内散度矩阵
Sw = Sw + (Xi - mu_i)' * (Xi - mu_i);
% 类间散度矩阵
Sb = Sb + Ni * (mu_i - mu)' * (mu_i - mu);
end
% 解决广义特征值问题
[V, D] = eig(Sb, Sw);
% 对特征值进行排序
[~, idx] = sort(diag(D), 'descend');
V = V(:, idx);
% 选择前num_components个特征向量
W = V(:, 1:num_components);
% 数据投影
X_lda = X * W;
end
3. 调用示例
% 生成示例数据
rng(0);
X = [randn(50,2)+1; randn(50,2)-1];
Y = [ones(50,1); 2*ones(50,1)];
% 执行手动LDA
[X_lda, W] = manual_LDA(X, Y, 1);
% 可视化
figure;
scatter(X_lda(Y==1), zeros(sum(Y==1),1), 'r', 'filled');
hold on;
scatter(X_lda(Y==2), zeros(sum(Y==2),1), 'b', 'filled');
xlabel('投影值');
title('手动实现LDA降维');
应用场景
1. 人脸识别(ORL数据库)
% 加载ORL人脸数据集
[X, labels] = load_orl_database();
% LDA降维
X_lda = manual_LDA(X, labels, 2);
% 分类准确率验证
cv = cvpartition(labels, 'KFold', 5);
accuracy = crossval(@(Xtrain,Ytrain,Xtest,Ytest) ...
sum(predict(manual_LDA(Xtrain,Ytrain), Xtest) == Ytest)/numel(Ytest), ...
X, labels, 'partition', cv);
disp(['平均分类准确率: ', num2str(accuracy*100), '%']);
2. 高光谱图像分类
% 加载Indian Pines数据集
[X, ground_truth] = load_indian_pines();
% LDA降维预处理
X_lda = manual_LDA(X, ground_truth, 10);
% SVM分类
svmModel = fitcsvm(X_lda, ground_truth);
predicted = predict(svmModel, X_lda);
accuracy = sum(predicted == ground_truth)/numel(ground_truth);disp(['分类准确率: ', num2str(accuracy*100), '%']);
四、常见问题解决
维度不足错误
% 当类别数量不足以支持所需组件数时,自动减少组件数量
num_components = min(num_components, length(classes)-1);
非数值型标签处理
% 将类别标签从非数值类型转换为数值类型
Y = grp2idx(Y);
数据不平衡处理
% 在训练模型时,通过设置样本权重来平衡不同类别的样本量差异
model = fitcdiscr(X, Y, 'DiscrimType', 'linear', 'Prior', 'uniform');
参考代码:利用LDA算法进行数据降维
www.youwenfan.com/contentcnl/79531.html
五、工具包对比
| 工具特性 | 内置fitcdiscr | 手动实现 | 优化版本 |
|---|---|---|---|
| 开发效率 | 高 | 中 | 低 |
| 计算性能 | 中等 | 低 | 高 |
| 功能扩展性 | 有限 | 完全可控 | 高度可定制 |
| 适用场景 | 快速验证 | 算法研究 | 工业级应用 |


雷达卡


京公网安备 11010802022788号







