线性判别分析(LDA)¶
本案例研究将探讨线性判别分析(LDA)在费雪虹膜数据集中的应用,并与主成分分析(PCA)方法进行比较。
线性判别分析(LDA)是一种统计分析技术,它能找到特征的线性组合,将观察结果分为两类。
In [ ]:
Pkg.add(["MultivariateStats", "RDatasets"])
假设正类和负类的样本具有平均值:
$\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]:
从数据集中提取带有特征的观察对象矩阵 -X
和这些对象的类别向量 -X_labels
:
In [ ]:
X = Matrix(iris[1:2:end,1:4])'
X_labels = Vector(iris[1:2:end,5])
Out[0]:
让我们比较一下线性判别分析和 PCA 方法(主成分分析)。
训练 PCA 模型:
In [ ]:
pca = fit(PCA, X; maxoutdim=2)
Out[0]:
将 PCA 应用于数据:
In [ ]:
Ypca = predict(pca, X)
Out[0]:
训练 LDA 模型
In [ ]:
lda = fit(MulticlassLDA, X, X_labels; outdim=2);
将 LDA 应用于数据:
In [ ]:
Ylda = predict(lda, X)
Out[0]:
结果可视化¶
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 则用于在有标签类别的情况下改进分类。