经典子空间学习——线性判别分析(Linear Discriminant Analysis,LDA)

线性判别分析(Linear Discriminant Analysis, LDA)是一种统计模式识别方法,用于寻找数据集中的线性组合,以最大化类别之间的差异,同时最小化类别内部的差异

LDA通常用于监督学习场景,例如分类任务,其中已知数据点属于不同的预定义类别,并且目标是 找到能够最好地区分这些类别的低维表示。

LDA的基本公式和参数

目标函数

LDA的目标是找到一个投影矩阵 W,使得投影后的数据在类别间具有最大的方差,在类别内具有最小的方差。这通过最大化下面的比率来实现:

J ( W ) = W T S B W W T S W W J(W) = \frac{W^TS_BW}{W^TS_WW} J(W)=WTSWWWTSBW

其中:

  • S B S_B SB 表示类间散度矩阵(Between-class scatter matrix),反映了类别间的差异。
  • S W S_W SW 表示类内散度矩阵(Within-class scatter matrix),反映了类别内的差异。
  • J ( W ) J(W) J(W)判别准则函数。
散度矩阵

类内散度矩阵 S W S_W SW 是所有类别内散度矩阵的加权和

S W = ∑ i = 1 C S i S_W=\sum_{i=1}^CS_i SW=i=1CSi
其中, S i S i Si 表示第 i i i 类的类内散度矩阵,计算方式为:

S i = ∑ x ∈ C i ( x − μ i ) ( x − μ i ) T S_i=\sum_{x\in C_i}(x-\mu_i)(x-\mu_i)^T Si=xCi(xμi)(xμi)T

μ i \mu_i μi 是第 i i i 类的均值向量 C i C_i Ci 是第 i i i 类的样本集合。


S W = ∑ i = 1 C ∑ x ∈ C i ( x − μ i ) ( x − μ i ) T S_W = \sum_{i=1}^C\sum_{x\in C_i}(x-\mu_i)(x-\mu_i)^T SW=i=1CxCi(xμi)(xμi)T

类间散度矩阵 S B S_B SB 描述了各类均值之间的差异:
S B = ∑ i = 1 c N i ( μ i − μ ) ( μ i − μ ) T S_B = \sum_{i=1}^{c}N_i(\mu_i - \mu)(\mu_i - \mu)^T SB=i=1cNi(μiμ)(μiμ)T
其中

  • μ i \mu_i μi 是第 i i i 类的样本均值向量
  • μ \mu μ整个数据集的样本均值向量。

样本协方差矩阵的公式是用来估计一组多维数据之间线性相关性的强度和方向的。对于一个由多个随机变量组成的样本数据集,样本协方差矩阵 S S S 可以通过以下公式计算:

设我们有一个包含 m m m 个样本的 n n n-维数据集 { x 1 , x 2 , … , x m } \{x_1, x_2, \ldots, x_m\} {x1,x2,,xm},其中每个样本 x i x_i xi 是一个 n n n-维向量。

样本均值向量为:
x ˉ = 1 m ∑ i = 1 m x i \bar{x} = \frac{1}{m} \sum_{i=1}^{m} x_i xˉ=m1i=1mxi

样本协方差矩阵 S S S 定义为:
S = 1 m − 1 ∑ i = 1 m ( x i − x ˉ ) ( x i − x ˉ ) T S = \frac{1}{m-1} \sum_{i=1}^{m} (x_i - \bar{x})(x_i - \bar{x})^T S=m11i=1m(xixˉ)(xixˉ)T

其中

  • ( x i − x ˉ ) (x_i - \bar{x}) (xixˉ) 是第 i i i 个样本与其均值的差
  • ( x i − x ˉ ) T (x_i - \bar{x})^T (xixˉ)T 是这个差的转置。

矩阵中的每个元素 S i j S_{ij} Sij 都代表了第 i i i 和第 j j j 个变量之间的样本协方差,计算公式为:
S i j = 1 m − 1 ∑ k = 1 m ( x k i − x ˉ i ) ( x k j − x ˉ j ) S_{ij} = \frac{1}{m-1} \sum_{k=1}^{m} (x_{ki} - \bar{x}_i)(x_{kj} - \bar{x}_j) Sij=m11k=1m(xkixˉi)(xkjxˉj)

其中

  • x k i x_{ki} xki x k j x_{kj} xkj 分别是第 k k k样本在第 i i i 和第 j j j 个维度上的值
  • x ˉ i \bar{x}_i xˉi x ˉ j \bar{x}_j xˉj 则是相应维度的样本平均值。

值得注意的是,分母 m − 1 m-1 m1 而不是 m m m 是为了得到无偏估计,这是因为样本均值 x ˉ \bar{x} xˉ 是基于同样的样本数据集计算出来的,从而导致了所谓的“自由度损失”。这种修正被称为 Bessel’s correction。

求解W

要最大化 J ( W ) J(W) J(W)需要求解以下广义特征值问题:
S B w = λ S W w S_Bw = \lambda S_Ww SBw=λSWw
这里的 w w w W W W列向量,而 λ \lambda λ相应的特征值。通常,选择那些具有最大特征值 w w w 作为 W W W 的列向量,因为它们提供了最大的类间可分离性。

解释

  • W W W投影矩阵,用于将原始数据映射到较低维度空间。
  • S B S_B SB:类间散度矩阵,量化了类别间的差异。
  • S W S_W SW:类内散度矩阵,量化了类别内的差异。
  • λ \lambda λ:特征值,决定了投影方向的重要性。
  • w w w:特征向量,指示了投影的方向。

通过LDA,可以找到一个或多个投影方向,使得数据在这些方向上的投影能最大限度地区分不同的类别,从而提高分类性能。在实际应用中,LDA经常用于降维,以便在保持类别信息的同时减少数据的复杂性。

python代码

# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib

matplotlib.use('TkAgg')  # 或者尝试 'Agg'

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 使用LDA进行特征提取
lda = LinearDiscriminantAnalysis(n_components=2)  # 我们将数据降到2维
X_train_lda = lda.fit_transform(X_train, y_train)
X_test_lda = lda.transform(X_test)

# 利用LDA结果进行分类
# 这里我们直接使用LDA的预测功能
y_pred = lda.predict(X_test)

# 评估模型性能
print("Classification Report:\n", classification_report(y_test, y_pred))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))

# 可视化LDA结果:
plt.figure()
colors = ['navy', 'turquoise', 'darkorange']
lw = 2

for color, i, target_name in zip(colors, [0, 1, 2], iris.target_names):
    plt.scatter(X_train_lda[y_train == i, 0], X_train_lda[y_train == i, 1], color=color, alpha=.8, lw=lw,
                label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('LDA of IRIS dataset')

plt.show()

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不易撞的网名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值