上面是PCA的一篇比较详细的博客,我将其贴在这里,感兴趣的同学可以深入了解一下,我们这里说的比较浅层。
介绍
主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维技术,广泛应用于统计学、机器学习和数据科学等领域。它的主要目标是通过将数据从高维空间映射到低维空间,以保留数据的主要特征,并减少数据的维度。
其典型的应用场景包括:
- 数据降维:提取主要特征,减少算法的计算量
- 高维数据可视化:将高维数据通过PCA降维为2或3维,便于进行可视化。
- ...
原理
对于PCA算法而言,可以分为五个基本的步骤。下面我们一个步骤一个步骤的进行说明。注意,这里不涉及太多的数学计算,感兴趣看最上面的卡片链接。主要还是思路以及sklearn应用。
注意:下面所有图均来自于卡片链接中博客的原图,我这里属于搬运。
数据标准化
首先我们需要知道,PCA其中的如何判断一个坐标轴上的信息多不多呢?其是这么认为的,以一个二维的点集为例子,我们进行轴的旋转,那么将点投影到轴上,然后计算方差。而PCA则是认为方差越大代表该轴能表达的信息量越多。因此,若不对于所有坐标轴进行标准化操作,那么方差的计算将会明显收到范围大的某一维的数据的影响。所以,PCA的第一步就是对于数据集中的每一维的特征进行一个标准化。
计算协方差矩阵
这里其实我们直接简单的理解,就是计算数据集中不同维度之间的相关性,并且我们还要利用协方差矩阵计算第三步中的特征向量与特征值。比如说,如果我的点坐标有(x, y, z)三个维度,那么我就会得到一个 3 * 3 的协方差矩阵,其中对角线代表其本身的方差。
哦对,其中所有的估计都是无偏估计。这里需要提醒一下。
大家如果不熟悉协方差的计算的话,可以自己去搜一下,解释很多,而且说实话在这里并不重要,这主要是一个计算的中间量。我们写代码的时候也并不会考虑到这五个步骤,人家封装好了,我们直接调用就好了。
计算特征矩阵与特征值
我们利用协方差矩阵计算特征向量与特征值。这里同样过程我们不详细介绍,感兴趣的去搜索一下相关博客,很多。我们直接从结果分析,以一个二维的点集为例子,我们可以得到这样一个值。
然后这里的理解就很重要了!!!关于v1和v2,λ1 和 λ2怎么算出来的,不重要,人家很多函数都封装好了,写代码我们基础完全不用考虑这个。但是如何理解,就非常重要了!
就按照图片中的例子来说,我们得到了v1和v2两个特征向量,而且每个特征向量对应的有一个特征值λ。在PCA中,这个λ就直接可以理解为信息量,而特征向量则代表每个原始坐标轴的比例。这么说或许还是很模糊,那么我就以一个例子来说,上面的点集不是(x, y)二维的,那么我们利用v1得到的新坐标轴则是: 0.67 * x + 0.73 * y (要将x和y标准化先哈)。因此这样我们就可以理解了为什么大家说:PCA得到的新特征是以往特征的线性组合,可读性差,没有真实的物理意义,其原因就在这里。
当然,在PCA计算中,我们要将λ按照值把特征值和特征向量进行一个降序排序,让λ大,信息含量多的特征向量放在前面作为最主要成分。所以PCA中信息量的可视化大概就是这样的:
得到特征向量
这个就很简单,我们不是在前一步把特征向量进行降序排序了吗,我们看我们需要几个维度的数据,那么我们就进行特征向量的列方向上的拼接,以第三步中的数据如下,若我们需要2个维度的数据,那么我们的特征向量即为:
映射
就是跟第三步我说的线性组合一样的,只不过是矩阵的计算方式。代码里效率更快。
代码
PCA代码集成在了sklearn中,主要是dimentional reduction中,我把网页链接分享给大家。有兴趣的可以自己去看。还是建议大家要养成看文档的习惯。SKLearn-PCA简介与基本使用https://scikit-learn.org/stable/modules/decomposition.html 这里以高维数据的可视化作为案例,将高维数据降维为2维,并可视化在坐标中。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
from sklearn.decomposition import PCA
# load wine datasets
data = load_wine()
features = data.data # (178, 13), which feature has 13 dims
label = data.target[:, np.newaxis] # (178, ) -> (178, 1)
# use PCA to reduce feature dims to 2
pca = PCA(n_components=2)
cor = pca.fit_transform(features) # (178, 2)
# plot points
plt.scatter(cor[:, 0], cor[:, 1], c=label)
结果如下:
可以看见,相同种类的点还是差不多在一块的。
参数:
用kimi总结了一下,还是建议大家看原文档。
-
n_components
:- 类型:
int
或None
,默认为None
。 - 意义:指定要保留的主成分数量。如果设置为
None
,则保留所有成分。
- 类型:
-
copy
:- 类型:
bool
,默认为True
。 - 意义:如果设置为
True
,则数据矩阵的副本将被计算,原始数据不会被修改。如果设置为False
,算法会尝试修改数据矩阵,这可能会提高性能,但会改变原始数据。
- 类型:
-
whiten
:- 类型:
bool
,默认为False
。 - 意义:如果设置为
True
,则数据将被白化(即转换后的主成分将具有单位方差,并且彼此不相关)。这通常用于数据预处理。
- 类型:
-
svd_solver
:- 类型:
{'auto', 'full', 'arpack', 'randomized'}
,默认为'auto'
。 - 意义:指定用于计算奇异值分解(SVD)的算法。
'auto'
会根据数据的大小和特征自动选择最合适的方法。
- 类型:
-
tol
:- 类型:
float
,默认为0.0
。 - 意义:当使用 ARPACK 或随机化方法时,这个参数定义了奇异值截断的容忍度。
- 类型:
-
iterated_power
:- 类型:
int
或'auto'
,默认为'auto'
。 - 意义:当使用随机化方法时,这个参数定义了迭代次数。
'auto'
会根据数据的大小自动选择迭代次数。
- 类型:
-
n_oversamples
:- 类型:
int
,默认为10
。 - 意义:当使用随机化方法时,这个参数定义了过采样的数量,即在随机化算法中使用的额外特征数量。
- 类型:
-
power_iteration_normalizer
:- 类型:
{'auto', 'QR', 'LU', 'none'}
,默认为'auto'
。 - 意义:定义了在随机化方法中使用的归一化策略,用于加速奇异值分解。
- 类型:
-
random_state
:- 类型:
int
、RandomState
实例或None
,默认为None
。 - 意义:当
svd_solver
为'arpack'
或'randomized'
时,这个参数用于控制随机数生成器的状态,以确保结果的可重复性。
- 类型: