Engee 文档
Notebook

线性判别分析(LDA)

本案例研究将探讨线性判别分析(LDA)在费雪虹膜数据集中的应用,并与主成分分析(PCA)方法进行比较。

线性判别分析(LDA)是一种统计分析技术,它能找到特征的线性组合,将观察结果分为两类。

In [ ]:
Pkg.add(["MultivariateStats", "RDatasets"])
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`

假设正类和负类的样本具有平均值:

$\mu_p$ (正面类)、

$\mu_n$ (对于负类)、 以及协方差矩阵$C_p$ 和$C_n$ 。

根据费雪线性判别标准,最佳投影方向的公式为 $$w = \alpha \cdot (C_p + C_n)^{-1} (\mu_p - \mu_n),$$ 其中$\alpha$ 为任意非负系数。

安装和连接必要的库:

In [ ]:
using MultivariateStats, RDatasets

从 Iris Fischer 数据集加载数据:

In [ ]:
iris = dataset("datasets", "iris")
Out[0]:
150×5 DataFrame
125 rows omitted
RowSepalLengthSepalWidthPetalLengthPetalWidthSpecies
Float64Float64Float64Float64Cat…
15.13.51.40.2setosa
24.93.01.40.2setosa
34.73.21.30.2setosa
44.63.11.50.2setosa
55.03.61.40.2setosa
65.43.91.70.4setosa
74.63.41.40.3setosa
85.03.41.50.2setosa
94.42.91.40.2setosa
104.93.11.50.1setosa
115.43.71.50.2setosa
124.83.41.60.2setosa
134.83.01.40.1setosa
1396.03.04.81.8virginica
1406.93.15.42.1virginica
1416.73.15.62.4virginica
1426.93.15.12.3virginica
1435.82.75.11.9virginica
1446.83.25.92.3virginica
1456.73.35.72.5virginica
1466.73.05.22.3virginica
1476.32.55.01.9virginica
1486.53.05.22.0virginica
1496.23.45.42.3virginica
1505.93.05.11.8virginica

从数据集中提取带有特征的观察对象矩阵 -X 和这些对象的类别向量 -X_labels

In [ ]:
X = Matrix(iris[1:2:end,1:4])'
X_labels = Vector(iris[1:2:end,5])
Out[0]:
75-element Vector{CategoricalArrays.CategoricalValue{String, UInt8}}:
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 ⋮
 "virginica"
 "virginica"
 "virginica"
 "virginica"
 "virginica"
 "virginica"
 "virginica"
 "virginica"
 "virginica"
 "virginica"
 "virginica"
 "virginica"

让我们比较一下线性判别分析和 PCA 方法(主成分分析)。

训练 PCA 模型:

In [ ]:
pca = fit(PCA, X; maxoutdim=2)
Out[0]:
PCA(indim = 4, outdim = 2, principalratio = 0.9741445733283195)

Pattern matrix (unstandardized loadings):
────────────────────────
         PC1         PC2
────────────────────────
1   0.70954    0.344711
2  -0.227592   0.29865
3   1.77976   -0.0797511
4   0.764206  -0.0453779
────────────────────────

Importance of components:
──────────────────────────────────────────────
                                PC1        PC2
──────────────────────────────────────────────
SS Loadings (Eigenvalues)  4.3068    0.216437
Variance explained         0.927532  0.0466128
Cumulative variance        0.927532  0.974145
Proportion explained       0.95215   0.04785
Cumulative proportion      0.95215   1.0
──────────────────────────────────────────────

将 PCA 应用于数据:

In [ ]:
Ypca = predict(pca, X)
Out[0]:
2×75 Matrix{Float64}:
 2.71359    2.90321   2.75875   …  -2.39001   -1.51972   -1.87717
 0.238246  -0.233575  0.228345      0.333917  -0.297498   0.0985705

训练 LDA 模型

In [ ]:
lda = fit(MulticlassLDA, X, X_labels; outdim=2);

将 LDA 应用于数据:

In [ ]:
Ylda = predict(lda, X)
Out[0]:
2×75 Matrix{Float64}:
 -0.758539  -0.685016  -0.773267  …   0.976876   0.790049   0.84761
 -0.766144  -0.703192  -0.79546      -1.0143    -0.682331  -1.01696

结果可视化

In [ ]:
using Plots
p = plot(layout=(1,2), size=(800,300))

for s in ["setosa", "versicolor", "virginica"]

    points = Ypca[:,X_labels.==s]
    scatter!(p[1], points[1,:],points[2,:], label=s)
    points = Ylda[:,X_labels.==s]
    scatter!(p[2], points[1,:],points[2,:], label=false, legend=:bottomleft)

end
plot!(p[1], title="PCA")
plot!(p[2], title="LDA")
Out[0]:

结论

PCA 和 LDA 是具有不同目标的降维方法:PCA 最大化数据的全局方差,适用于不考虑类别标签的可视化,而 LDA 则利用标签信息优化类别分离,使其在分类任务中非常有效。在费舍尔虹膜的例子中,LDA 在投影中提供了明确的类别分离,而 PCA 保持了数据的整体结构,但有重叠的类别。方法的选择取决于任务:PCA 用于探索数据,而 LDA 则用于在有标签类别的情况下改进分类。