线性判别分析(lda)
在这个例子中,我们将考虑将线性判别分析(lda)应用于"Fischer的虹膜"数据集。还将进行与主成分分析(PCA)的比较。
线性判别分析(lda)是一种统计分析方法,可让您找到线性特征组合,将观测值分成两类。
In [ ]:
Pkg.add(["MultivariateStats", "RDatasets"])
让我们假设正类和负类的样本具有平均值:
(对于正类),
(对于负面类),
以及协方差矩阵 和 .
根据线性判别的Fisher准则,由公式给出最优投影方向:
哪里 -任意非负系数。
安装和连接必要的库:
In [ ]:
using MultivariateStats, RDatasets
从Fischer的Irises数据集下载数据:
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使用标签信息优化类分离,这使得它对分类任务有效。 在使用Fischer虹膜的示例中,LDA提供了投影中类的清晰分离,而PCA保留了一般数据结构,但具有重叠类。 方法的选择取决于任务:PCA-用于数据分析,LDA-用于在存在标记类的情况下改进分类。
