数据降维解析:常见方法Python实操与案例
一文带您了解数据降维:常见降维方法及Python示例
数据降维是机器学习和数据分析中的重要工具,其目的是在保留关键信息的同时,通过减少特征数量来简化数据。在处理高维数据的问题中,降维可以提高计算效率和模型性能。
它就像一个复杂物体的简化投影,保留了关键信息,以便于分析和比较。
我们通过Python例子来探索几种常见的数据降维方法。
以Kaggle的红酒数据集为例,首先需要进行零值检查和标准化预处理。
主成分分析(PCA)等线性方法通过在低维空间中查找数据的表示来捕获数据中的线性模式,从而最大化变化。
PCA的Python代码演示了这个过程。
立成分分析(ICA)侧重于独立的信号源,假设原始数据是独立的,例如三种不同的葡萄酒口味。
ICA代码用于将这些独立分量分离为数据的降维表示。
截断奇异值分解(截断SVD)在处理大规模数据时效率很高,尤其擅长处理稀疏矩阵。
MDS(多维缩放)和t-SNE(t分布随机邻域嵌入)等非线性方法侧重于数据点之间的相似性,有助于捕获复杂的非线性关系。
t-SNE的作为改进版本,UMAP更擅长维护全局结构。
选择哪种方法取决于数据的特点和问题的要求。
这不是一个通用的解决方案。
通过上面的Python示例,我们可以看到这些工具如何帮助处理和理解复杂的数据集。
PCA(主成分分析)python实现
回顾了PCA的步骤并用python实现了它。
我深刻地发现,当时所学的特征值和特征向量是如此强大。
PCA是一种无监督学习方法,也是一种非常常见的降维方法。
在数据信息损失最小的情况下,通过映射到另一个空间,将数据特征的数量从n变为k(k
这里我们用二维数据来说明,选择的二维数据是因为二维数据更容易绘制。
下面是数据:
画个图看看分布:
协方差的定义是:
假设n是数据中特征的数量,那么协方差矩阵M是第n个矩阵,其中Mij是第i个和第j个特征的协方差,对角线是每个特征的方差。
在我们的数据中,n=2,所以协方差矩阵为22。
我们可以通过numpy轻松得到:
得到cov的结果是:array([[0.61655556,0.61544444.],[0.61544444,0.71655556]])
既然我们之前已经标准化了,对于我们来说,这个矩阵是data*data的转置矩阵。
得到结果:matrix([[5.549,5.539],[5.539,6.449]])
我们发现,其实协方差矩阵和散度矩阵是密切相关的,散度矩阵是协方差矩阵乘以(数据总和-1)。
因此它们的特征根和特征向量是相同的。
这里值得一提的是,散度矩阵是SVD特定值分解的一个步骤,因此PCA和SVD密切相关,我会尽快详细写出来。
用numpy计算特征根和特征向量非常简,
红线就是特征向量。有几点值得一提:
蓝色三角形是坐标变换后得到的新点,其实就是将红色原点投影到红蓝线上形成的。
得到特征值和特征向量后,我们可以根据特征值的大小,从大到小选择特征值K对应的特征向量。
这个Python实现也非常简单:
只需从eig_pairs中选择前k个特征向量即可。
这里我们只有两个特征向量,选择较大的一个。
将原始数据与滤波后的特征向量组成的特征矩阵相乘即可得到新的数据。
输出:
数据真正变成了一维数据。
最后我们画一张图来了解一下PCA之后的数据会发生什么变化。
五角星是经过PCA处理后得到的一维数据,用来和前面的图进行比较,其实就是红点投影到蓝线上后形成的点。
这就是PCA,通过选择特征的根向量,形成一个新的坐标系,然后将数据投影到这个新的坐标系上,以在尽可能少的信息损失的情况下实现降维。
通过上面的步骤,我们刚刚实现了PCA的第一个2维数据处理,但是原理是一样的,基于此我们可以轻松实现多维数据。
使用sklearn的PCA与我们的计算机进行比较:
获取结果:
尝试使用我们的PCA
获取结果:
完全一致,完美~值得注意的是,sklearn中的PCA实现使用了一些SVD结果,而且确实是密切相关的。