机器学习中的降维
导言
降维是一组方法,旨在将多维特征空间转换为显着更小的维度空间,同时保持源数据的有意义结构。 这种方法广泛应用于多维信息数组的可视化任务,使我们能够识别相似对象的组并识别隐藏的模式。
降维方法的相关性归因于几个因素。 首先,它们提供了在二维或三维空间中以图形方式表示多维数据的能力,这极大地促进了分析结果的解释。 其次,这些方法有助于检测一组观测值的聚类结构,这些观测值在单独考虑初始特征时可能保持不可察觉。
在这个例子中,我们将看三种不同的算法。:
*PCA(主成分分析)是一种用于线性数据投影的主成分方法;
*t-SNE(t-distributed Stochastic Neighbor Embedding)是一种在保留局部关系的同时进行非线性降维的算法;
*UMAP(Uniform Manifold Approximation and Projection)是一种基于流形理论的非线性投影方法。
初始数据
我们将附加必要的库。
# EngeePkg.purge()
import Pkg
Pkg.add(["UMAP", "Makie", "XLSX", "VegaDatasets", "DataFrames", "MultivariateStats", "RDatasets", "StatsBase", "Statistics", "LinearAlgebra", "ScikitLearn", "MLBase", "Distances", "TSne", "PyCall"])
using UMAP, Makie, XLSX, VegaDatasets, DataFrames, MultivariateStats, RDatasets, StatsBase, Statistics, LinearAlgebra, ScikitLearn, MLBase, Distances, TSne, PyCall
对于分析,我们将使用来自VegaDatasets包的数据集,其中包括406种不同车型的参数。
C = DataFrame(VegaDatasets.dataset("cars"))
我们将删除缺少数据的行,并显示数据集的列名。
dropmissing!(C)
M = Matrix(C[:,2:7])
names(C)
主成分分析(PCA)
在第一阶段,我们将执行数据居中。
car_origin = C[:,:Origin]
carmap = labelmap(car_origin)
uniqueids = labelencode(carmap,car_origin)
data = M
data = (data .- mean(data,dims = 1))./ std(data,dims=1)
PCA算法将每列解释为单独的观测值,因此我们需要转置原始矩阵。
data'
让我们使用主成分方法构建一个模型。 参数 maxoutdim 设置数据的最终维度。 对于二维可视化,我们将其值设置为2。
p = fit(PCA, data', maxoutdim=2)
投影矩阵可以使用函数获得 projection.
P = projection(p)
具有投影矩阵 我们可以将其应用于单个汽车,如下所示:
P'*(data[1,:]-mean(p))
您还可以使用函数转换整个数据 transform.
Yte = MultivariateStats.transform(p, data')
我们还可以使用函数执行从二维空间到原始六维空间的反向转换 reconstruct. 然而,这一次的复苏将接近。
Xr = reconstruct(p, Yte)
我们来估计一下反向转换后数据恢复的误差。
norm(Xr-data')
我们使用点图可视化结果。:
p1 = Plots.scatter(Yte[1,car_origin.=="USA"],Yte[2,car_origin.=="USA"],color=1,label="美国")
Plots.xlabel!(p1,"第一个标志")
Plots.ylabel!(p1,"第二个标志")
Plots.scatter!(p1,Yte[1,car_origin.=="Japan"],Yte[2,car_origin.=="Japan"],color=2,label="日本")
Plots.scatter!(p1,Yte[1,car_origin.=="Europe"],Yte[2,car_origin.=="Europe"],color=3,label="欧洲")
display(p1)
可视化显示了三个不同的集群。
让我们训练PCA模型,将数据投影到三维空间,执行转换,并在三维图上可视化结果。
p = fit(PCA,data',maxoutdim=3)
Yte = MultivariateStats.transform(p, data')
p2 = scatter3d(Yte[1,:],Yte[2,:],Yte[3,:],color=uniqueids,legend=false)
display(p2)
非线性降维同时保持局部关系(t-SNE)
让我们应用t-SNE算法将数据维度减少到两个分量,并在散点图上可视化结果。
Y2 = tsne(data, 2, 30, 1000, verbose=false, eta=200.0)
p3 = Plots.scatter(Y2[:,1], Y2[:,2],
color=uniqueids, legend=false, size=(400, 300),
markersize=3, title="t-SNE可视化")
Plots.xlabel!(p3,"第一个标志")
Plots.ylabel!(p3,"第二个标志")
display(p3)
这里观察到相同的数据结构,尽管由于t-SNE算法的特殊性,图本身看起来不同。
基于流形理论的非线性投影方法(UMAP)
让我们计算特征的相关矩阵,并应用UMAP将维度降低到两个分量。
L = cor(data,data,dims=2)
emb = umap(L, 2)
我们在点图上可视化获得的UMAP投影。
p4 = Plots.scatter(emb[1,:],emb[2,:],color=uniqueids,legend=false)
Plots.xlabel!(p4,"第一个标志")
Plots.ylabel!(p4,"第二个标志")
display(p4)
UMAP算法允许使用替代方法来计算对象之间的两两距离。 让我们计算所有观测值对之间的欧几里德距离,并将UMAP应用于相似性矩阵。
L = pairwise(Euclidean(), data, data,dims=1)
emb = umap(-L, 2)
我们在点图上可视化UMAP投影。
p5 = Plots.scatter(emb[1,:],emb[2,:],color=uniqueids, legend=false)
Plots.xlabel!(p5,"第一个标志")
Plots.ylabel!(p5,"第二个标志")
display(p5)
结论
在这个例子中,当应用于一组关于车辆规格的数据时,考虑了三种降维方法。 每种算法都可以将原始多维特征空间投影到平面上,以便对数据结构进行可视化分析。
所获得的结果表明不同方法之间的高度一致性。 三个集群在所有可视化中都清晰可见,美国制造的汽车形成了两个大集群,而日本和欧洲的车型形成了单独的混合组。
这种模式表明,美国汽车的技术特征更加多变,分为几种不同的类型,而本报告所述期间的日本和欧洲车型的特征在于参数的更大均匀性。
因此,降维是一种有效的数据分析工具,允许您识别在直接检查初始要素时无法访问的对象之间的隐藏结构和关系。 通过各种方法获得的结果的一致性证实了所识别的模式的稳定性和得出的结论的可靠性。