【机器学习|学习笔记】线性判别分析(linear discriminant analysis,LDA)详解,附代码。
【机器学习|学习笔记】线性判别分析(linear discriminant analysis,LDA)详解,附代码。
文章目录
欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通
”或参考学术信息专栏:https://blog.csdn.net/2401_89898861/article/details/147567533
前言
- 线性判别分析(Linear Discriminant Analysis,LDA)是一种经典的统计与机器学习方法,用于在保证类间可分性的前提下将高维数据投影到低维空间,从而既能降维又能进行分类。
- 其原理可归结为最大化类间散度与最小化类内散度之比,通过求解广义特征值问题得到最优投影方向。
- LDA 最早由 Ronald Fisher 于 1936 年提出,并在1948年由 C. R. Rao 推广到多类场景。
- 在随后的几十年中,LDA 被广泛应用于生物信息学、图像识别、金融风控等领域,并在 scikit‑learn、SPSS、MATLAB
等主流工具中得到高效实现
起源
Fisher 的二类判别(1936)
- 1936 年,Sir Ronald Fisher 在论文《The Use of Multiple Measurements in Taxonomic Problems》中提出了线性判别函数,用以在两类正态分布总体间寻找最佳投影方向,该方向使得两类样本的均值差在投影后最大化,而投影后类内方差最小。
- Fisher 的方法不同于同时预测连续因变量的 ANOVA 或 MANOVA,而是面向分类,通过线性组合实现对类别的判别。
Rao 的多类推广(1948)
-
1948 年,C. R. Rao 将 Fisher 的二类判别推广到多类情形,形成多重判别分析(Multiple Discriminant Analysis),即现代意义上的多类 LDA。
-
Rao 的工作基于同质协方差矩阵假设,构造类间散度矩阵与类内散度矩阵的广义特征值问题,以获得多条最优判别轴。
更早思想渊源
- 更早在1951年,Sokal 与 Sneath 在系统发育研究中提出 UPGMA(未加权算术平均法),虽与 LDA 不同,但体现了早期对群组分层与判别的量化探索;
- 而1932年 Driver 与 Kroeber 在人类学中进行的分类尝试亦为后续判别分析思想奠定了基础。
发展
经典算法与正则化
- 沃德法(Ward’s method):将每一步合并产生的组内平方和增量最小化,与 LDA 的目标具有相似性,常用于聚类分析,但与监督
LDA 共享最小化类内散度的思想。 - Shrinkage LDA(带收缩估计的 LDA):针对高维低样本场景下协方差矩阵不稳定问题,引入 Ledoit–Wolf 收缩估计,提高协方差矩阵估计的鲁棒性,并被
scikit‑learn
中的shrinkage='auto'
所支持。 - 正则化 LDA:通过在优化目标中增加 L 1 L_1 L1 或 L 2 L_2 L2 惩罚项,实现稀疏判别向量或防止过拟合,在基因选型和金融建模中得到应用。
核化扩展(Kernel LDA)
- 1999年,Mika 等人将核技巧(kernel trick)引入 Fisher 判别,提出 Kernel Fisher Discriminant Analysis,使得在高维特征空间中进行线性判别对应于输入空间的非线性决策边界,显著提升了对复杂模式的分类能力。
- 此后,核 LDA 在人脸识别、手写数字分类等领域取得大量成功。
软件与工具集成
- scikit‑learn 自 0.17 版起提供
LinearDiscriminantAnalysis
类,支持多种求解器(SVD、LSQR、Eigen)及收缩策略,可一行代码完成训练与投影。 - MATLAB、SPSS 和 SAS 均内置 LDA 功能,并在生物统计、社会科学等领域形成成熟工作流。
原理
类内与类间散度矩阵
- 定义数据集
{
x
i
,
y
i
}
\{x_i,y_i\}
{xi,yi},其中
y
i
∈
1
,
…
,
K
y_i∈{1,…,K}
yi∈1,…,K。类内散度矩阵:
- 类间散度矩阵:
- 其中 μ k μ_k μk 和 μ μ μ 分别为第 k k k 类与整体均值, N k N_k Nk 为第 k k k 类样本数。
广义特征值问题
- LDA 通过求解以下广义特征值问题获得投影矩阵
W
W
W:
- 取前 K − 1 K−1 K−1 个最大特征值对应的特征向量构成判别子空间,使得投影后类间距离被放大、类内方差被压缩。
判别与分类
- 在判别子空间中,常按最近均值原则或贝叶斯决策规则进行分类:
- 其中 z = W T x z=W^Tx z=WTx 为样本投影后的表示。
应用
Python 代码实现
- 下面展示如何使用 scikit‑learn 快速完成 LDA 的训练、降维与分类。
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis # :contentReference[oaicite:24]{index=24}
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载示例数据
X, y = load_iris(return_X_y=True)
# 划分训练/测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 构造 LDA 模型,保留最多 K-1=2 个判别方向
lda = LinearDiscriminantAnalysis(n_components=2)
# 训练并降维
X_train_lda = lda.fit_transform(X_train, y_train) # 拟合并转换训练集 :contentReference[oaicite:25]{index=25}
X_test_lda = lda.transform(X_test) # 仅转换测试集 :contentReference[oaicite:26]{index=26}
# 使用 LDA 作为分类器
y_pred = lda.predict(X_test) # 直接调用预测 :contentReference[oaicite:27]{index=27}
# 评估准确率
print("LDA 测试集准确率:", accuracy_score(y_test, y_pred))
- 以上代码一行导入,数行调用即可完成从训练到预测的全流程,实现了 LDA 的降维与分类双重功能。