什么是 LDA 算法?
LDA(线性判别分析,Linear Discriminant Analysis)是一种有监督学习算法,主要用于模式识别和机器学习中的分类问题。它旨在寻找能最大程度区分不同类别的特征子空间。LDA的基本思想是将高维数据投影到低维空间,同时使得不同类别之间的距离最大化,以提高分类性能。
LDA的核心思想可以概括为两个方面:
- 类内距离最小化:使得同类样本在投影后的低维空间内尽可能地接近。
- 类间距离最大化:使得不同类别的样本在投影后的低维空间内尽可能地远离。
LDA 算法有以下几个重要的理论基础
1)类内散度矩阵(Within-class Scatter Matrix):衡量同类别数据之间的距离。LDA 旨在使类内散度矩阵最小化,即同类别数据之间的距离尽量小。
2)类间散度矩阵(Between-class Scatter Matrix):衡量不同类别数据之间的距离。LDA旨在使类间散度矩阵最大化,即不同类别数据之间的距离尽量大。
3)Fisher准则:LDA的目标是寻找一个线性变换方向,使得投影后的数据满足类间散度最大,类内散度最小。Fisher准则定义了一个目标函数,即类间散度和类内散度的比值,LDA通过优化该目标函数来寻找最佳的投影方向,实现高维数据的降维,同时保留数据的类别信息。
4)特征值和特征向量:LDA的求解过程涉及到求解特征值和特征向量问题。具体来说,需要求解类间散度矩阵与类内散度矩阵的逆的乘积的特征值和特征向量。选择最大的 k 个特征值对应的特征向量,就可以构建出一个投影矩阵,将高维数据投影到k维空间。
5)投影和降维:通过特征向量构建的投影矩阵,可以将原始高维数据投影到低维空间,实现降维。在低维空间中,数据的类别信息得到保留,便于进行分类任务。
LDA 算法过程
-
数据预处理
-
对数据进行标准化处理,使得每个特征的均值为0,标准差为1。
-
确保每个数据点都有一个与之对应的类别标记。
-
计算类内散度矩阵 \(S_W\)
- 计算每个类别的均值向量 \(μ_i\)
对于第 i 个类别,其类均值向量 \(μ_i\) 计算公式为:
\[\mu_i = \frac{1}{N_i} \sum_{x \in D_i} x\]其中,\(N_i\) 是第 i 类的样本数量,\(D_i\) 是第 i 类的样本集合。
-
对于每个类别,计算其协方差矩阵
\[S_i = \sum_{x \in D_i} (x - \mu_i)(x - \mu_i)^T\] -
计算类内散度矩阵 \(S_W\)
\[S_W = \sum_{i=1}^{c} S_i\]其中 c 是类别的数量,\(S_i\) 是第 i 个类的散度矩阵。
-
计算类间散度矩阵\(S_B\)
类间散度矩阵衡量的是不同类别中心(均值向量)之间的差异:
\(\(S_B = \sum_{i=1}^{c} N_i (\mu_i - \mu)(\mu_i - \mu)^T\)\)
其中 \(μ\) 是所有样本的总体均值
\(\(\mu = \frac{1}{N} \sum_{i=1}^{N} x_i\)\)
N 是总样本数量
-
计算广义特征值得到判别向量
广义特征值问题的求解即为求 $S_W^{-1} S_B $ 的特征向量问题,首先计算矩阵\(S_W\)的逆矩阵与矩阵\(S_B\)的乘积,得到一个新的矩阵;然后再对新矩阵进行特征值分解,得到一组特征值和对应的特征向量。
-
选择最大的 k 个特征值对应的特征向量
从上一步得到的特征值中选择最大的 k 个特征值,然后取对应的特征向量。这 k 个特征向量构成了一个投影矩阵。
-
对原始数据进行投影
将原始数据与投影矩阵相乘,得到降维后的数据。
案例分享
以下是一个使用 Python 实现线性判别分析(LDA)的案例代码,这个例子使用的是 scikit-learn 库中的 LinearDiscriminantAnalysis 类。
# 导入必要的库
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report
# 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
# 创建LDA实例
lda = LinearDiscriminantAnalysis()
# 在训练集上训练LDA模型
lda.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = lda.predict(X_test)
# 打印混淆矩阵和分类报告
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
这段代码首先导入了必要的库和函数。然后,它加载了鸢尾花(Iris)数据集,并将其分为训练和测试集。接着创建一个 LinearDiscriminantAnalysis 对象,并在训练数据上拟合模型。最后,代码在测试集上进行预测,并打印出混淆矩阵和一个详细的分类报告,以评估模型的性能。
LDA 是如何进行预测的?
以下是 LDA 进行分类的步骤
- 训练阶段
- 首先,LDA 在训练阶段计算每个类别的均值向量和整体的类内散度矩阵 \(S_W\) 以及类间散度矩阵 \(S_B\)。
- 接着,LDA 求解特征值问题,寻找最佳的线性组合(也就是投影矩阵 W),以最大化类间散度和最小化类内散度。
- 计算得到的特征向量(也称为线性判别向量)定义了一个新的空间,其中数据的类别间差异最大。
- 投影数据
- 在得到投影矩阵 W 后,LDA 将训练数据投影到由线性判别向量定义的新空间中,这个空间通常是低维的。
- 分类决策
- 当新的观测值(测试数据)来到时,LDA 将这些观测值投影到相同的线性判别空间中。
- 然后计算新投影点到每个类别中心的距离。这通常涉及计算点到每个类别均值的欧氏距离或马氏距离。
- LDA 使用决策规则,通常是最小距离准则,来判断新的数据点属于哪个类别。具体地,它将新数据点分配给距离它最近的类别中心。
LDA 算法和 PCA 算法的区别与联系?
区别:
-
算法目标: PCA的目标是将高维数据投影到低维空间中,使得投影后的新特征数据具有最大的方差,即保留原始数据的最大信息。 LDA的目标是将高维数据投影到低维空间中,使得同类别数据的距离尽可能小,不同类别数据的距离尽可能大,以便于分类。
-
降维原理
PCA是一种无监督学习方法,它通过计算数据的协方差矩阵,然后对协方差矩阵进行特征值分解,得到特征值和特征向量。最后选择最大的 k 个特征值对应的特征向量作为投影矩阵,实现降维。
LDA 是一种有监督学习方法,它通过计算类内散度矩阵和类间散度矩阵,然后求解类内散度矩阵的逆矩阵与类间散度矩阵的乘积。最后对该乘积进行特征值分解,选择最大的 k 个特征值对应的特征向量作为投影矩阵,实现降维。
- 应用场景
PCA 通常用于数据压缩、可视化和预处理等无监督学习任务,不需要使用类别标签信息。 LDA 主要用于分类任务,需要利用类别标签信息来计算类内散度矩阵和类间散度矩阵。
联系
- 尽管 LDA和PCA的目标和原理不同,但它们都是线性降维方法,通过将高维数据投影到低维空间来实现降维。另外,LDA和PCA都可以通过特征值分解来求解投影矩阵。
LDA 算法的优缺点?
线性判别分析(LDA)作为一种经典的统计方法和机器学习算法,有其明确的优缺点。
优点
- 效率,LDA 在计算上相对高效,特别是与其他分类方法相比,它可以更快地得到结果。
- 降维,LDA 不仅可以用于分类,还能有效地将数据降维到更低的维度,同时保持类别之间的区分度。
- 简化分类器,在 LDA 投影后的空间中,使用简单的分类器(如最近邻分类器)通常就足够了,因为类别已被LDA分得较开。
缺点
- 正态分布假设:LDA 假设数据是正态分布的,这在现实世界的数据集中可能不总是成立。
- 对噪声和异常值敏感:由于 LDA 依赖类内和类间散度,噪声和异常值可能会对结果造成负面影响。
- 线性边界限制:作为一种线性方法,LDA可能无法很好地处理具有复杂边界的数据。