全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 MATLAB等数学软件专版
45 0
2025-11-19

LDA降维原理

1. 数学模型

图片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 手动实现 优化版本
开发效率
计算性能 中等
功能扩展性 有限 完全可控 高度可定制
适用场景 快速验证 算法研究 工业级应用
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群