PCA也被叫做卡尔胡宁-勒夫转换(KLT),是一种用户在高维空间发现模式的技术。PCA常被用于探索和可视化高纬度数据集。PCA可以压缩数据,也就是所谓的数据降维。数据降维是指在保留重要信息的同时消除那些“无用信息量的信息”。PCA关注的是线性相关性,如果一个数据矩阵的列空间的秩小于特征总数,那么多数特征就是几个关键的特征的线性组合,这些多数的特征是对空间以及计算能力的浪费,因为它们包含的信息可以从关键的特征推导出来,所以为了避免这种情况,PCA就是试图将这些数据挤压到一个维度大大小于原空间的线性子空间。
PCA的核心思想是:使用一些新的特征代替冗余特征,这些新特征能恰当地总结初始空间中包含的信息。
关于矩阵列空间以及秩可以看这篇文章
https://www.jianshu.com/p/15572fa072cf
如图a,数据点均匀的分布在两个特征上,在这个例子,列空间是满秩的。而有些特征是其他特征的线性组合,如图b,特征f1可以由f2得到,它是f2和一个标量的乘积。在这里我们称点团的本征维数为1,因为一个特征可以得到另一个特征。
但是实际上,完全相关的特征是很少见的,几乎不会出现,更多的情况是像图C一样,特征之间非常接近但是又不完全相同,这时如果想要削减传递给模型的特征的数量,就得需要一个全新的特征,一个由f1和f2得到的特征,可以称之为f1.5。
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris # 导入数据集
data = load_iris()
y = data.target # 数据集为字典形式,这里将y分离出来
x = data.data
pca = PCA(n_components=2) # 降维为2维
reduce_x = pca.fit_transform(x)
red_x,red_y = [],[]
blue_x,blue_y = [],[]
green_x,green_y = [],[]
for i in range(len(reduce_x)):
if y[i] == 0:
red_x.append(reduce_x[i][0])
red_y.append(reduce_x[i][1])
elif y[i] == 1:
blue_x.append(reduce_x[i][0])
blue_y.append(reduce_x[i][1])
else:
green_x.append(reduce_x[i][0])
green_y.append(reduce_x[i][1])
plt.scatter(red_x,red_y,c='r',marker='*')
plt.scatter(blue_x,blue_y,c='b',marker='x')
plt.scatter(green_x,green_y,c='g',marker='.')
plt.show()
运行结果
鸢尾花数据集是一个拥有50个样本,每个样本有4个解释变量的数据集,根据这4个变量推断出鸢尾花的品种,这里使用PCA将数据集的4个特征降维到两个维度,这样子就可以在二维上观察到数据,这样子可以更直观的观察到数据,方便后续的分类模型选择。
class sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)
n_component: 指定降维后的特征数量,
copy: 是否复制原数据
whiten: 白化,白化是PCA转化乘以奇异值的倒数,白化后数据特征之间方差为1,通常不白化,除非后续有特殊处理。
svd_solver: 有四种选择{‘auto’,‘full’,‘arpack’,‘randomized’}
tol: 可选{float,0}默认0,当svd_solver == ‘arpack’奇异值的公差
iterated_power: 可选{int,auto}默认auto,当svd_solver == ‘randomized’时幂方法的迭代次数
random_state: 可选{int,None},默认None,当svd_solver == ‘randomized’或svd_solver == ‘arpack’时,如果为None,随机数生成是用numpy.random生成。如果输入int数据,则生成的随机数是输入的数
通常只需要n_component这个数据。