LDA (Linear Discriminate Analysis)Fisher Criteria

本文探讨了PCA(主成分分析)和LDA(线性判别分析)这两种常用的数据降维方法。PCA旨在寻找数据方差最大的方向以减少数据维度,而LDA则专注于最大化不同类别间数据的分离程度。文章详细介绍了LDA的成本函数及其实现过程,并通过Matlab示例展示了如何使用LDA进行分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前说到的PCA,它主要的目的是寻找数据variance变化最大的轴。通过删去数据中variance变化不大的轴来压缩数据的维数。PCA没有办法很好的解决数据分类的问题(classification

LDA or Fisher Discriminate Analysis 是一种用于分类数据的分析方法。他的目的是寻找到一条直线,当把所有数据点投影到直线上之后,尽可能的分开不同类别的训练数据。

新宇教你机器学习之 <wbr>LDA(Linear <wbr>Discriminate <wbr>Analysis)Fisher <wbr>Criteria

很容易想到,每个类别训练数据投影到直线后的平均数的差可以做为衡量这条直线好坏的一个标准。

再考虑到不同类数据的variance之后,最终的cost function被定义为:

新宇教你机器学习之 <wbr>LDA(Linear <wbr>Discriminate <wbr>Analysis)Fisher <wbr>Criteria

Scatter就是variance乘以nn是这个类数据的个数。

 

我们可以定义Within the class matrix

Sw = S1 + S2;(这里的s1s2是投影前的scatter

定义between class matrix为:

SB = (u1-u2)(u1-u2)t


定义V为我们要找的直线的unit vector

重新整理cost function后,得到:(这里就不细讲了)

新宇教你机器学习之 <wbr>LDA(Linear <wbr>Discriminate <wbr>Analysis)Fisher <wbr>Criteria

我们的目标就是最大化Jv)。

同样的,我们取Jv)的微分:

新宇教你机器学习之 <wbr>LDA(Linear <wbr>Discriminate <wbr>Analysis)Fisher <wbr>Criteria

又是一个eigenvector的问题。

 

已知:

新宇教你机器学习之 <wbr>LDA(Linear <wbr>Discriminate <wbr>Analysis)Fisher <wbr>Criteria

所以:

Swfull rank的时候,


新宇教你机器学习之 <wbr>LDA(Linear <wbr>Discriminate <wbr>Analysis)Fisher <wbr>Criteria

下面是matlab测试结果:

新宇教你机器学习之 <wbr>LDA(Linear <wbr>Discriminate <wbr>Analysis)Fisher <wbr>Criteria

上下两个绿色的点就是两团数据在直线上投影的点的平均数,LDA就是找出一条线,尽量让投影的平均数的差(除以scatter)最大化。中间的绿点是上下两个绿点的平均数。过中间绿点垂直于LDA line的线就可以做为separating line,用来对test sample进行分类。

抱歉,您提到的是LDALinear Discriminant Analysis),这与上文提到的文本主题建模(Latent Dirichlet Allocation)不同。LDA是用于自然语言处理中的主题模型,而Linear Discriminant Analysis(线性判别分析)则是一种统计学方法,用于二分类或多分类问题,通过最大化类别间的方差和最小化类别内的方差来进行特征转换。 下面是一个简单的C++代码示例,展示了如何实现基于高斯分布的LDA: ```cpp #include <iostream> #include <Eigen/Dense> // 假设我们有观测矩阵 X 和类别标签 y MatrixXd X; // 观测值矩阵 VectorXd y; // 类别标签向量 // 按类别划分数据 std::vector<MatrixXd> X_train; std::vector<MatrixXd> X_test; std::vector<VectorXd> y_train; std::vector<VectorXd> y_test; // Linear Discriminant Analysis 函数 MatrixXd computelda() { int d = X.cols(); // 特征维度 int n = X.rows(); // 样本总数 int k = unique(y).size(); // 类别数目 // 计算先验概率 VectorXd pi(n, 0); for (int i = 0; i < n; ++i) { pi(i) = count(y.begin(), y.end(), y[i]) / static_cast<double>(n); } // 计算均值和协方差矩阵 MatrixXd mu(k, d), Sigma(k, d, d); for (int c = 0; c < k; ++c) { MatrixXd X_c = X.rowwise().select(y == c); mu(c, :) = X_c.colwise().mean(); Sigma(c, :, :) = X_c.colwise().cov(); } // 解线性组合 MatrixXd W = (Sigma.fullPivLu().solveDiagonal().asDiagonal() - inv(pi)).inverse(); return W; } int main() { // 对数据进行预处理 // ... // 计算W MatrixXd W = computelda(); // 应用到新样本上 MatrixXd transformed_data = X * W; // 使用transformed_data进行后续分类 return 0; } ``` 请注意,这个例子非常基础,实际应用中可能需要处理缺失值、正则化等问题,并且可能需要依赖更专业的机器学习库如MLPack或Shogun等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值