Python数据分析之主成分分析(PCA)
主成分分析(Principal Component Analysis,PCA)是最常用的一种降维方法,通常用于高维数据集的探索与可视化,还可以用作数据压缩和预处理等。矩阵的主成分就是其协方差矩阵对应的特征向量,按照对应的特征值大小进行排序,最大的特征值就是第一主成分,其次是第二主成分,以此类推。总的来说,就是在数据信息损失最小的情况下,将数据的特征数量由n,通过映射到另一个空间的方式,变为k(k<n)。PCA主要分为三个部分。(1)生成协方差矩阵;(2)计算特征值和特征向量,并选取主成分;(3)将原始数据投影到降维的子空间中。为便于理解,本文将以二维数据为例。
import numpy as np
import matplotlib.pyplot as plt
x=np.array([1.5,1.5,2.4,2,3.3,2.3,2,1,1.5,1.5])
y=np.array([2.1,1.7,2.9,2.2,3,2.7,1.6,1.1,1.6,0.9])
#数据规范化
mean_x=np.mean(x)
mean_y=np.mean(y)
scaled_x=x-mean_x
scaled_y=y-mean_y
data=np.matrix([[scaled_x[i],scaled_y[i]] for i in range(len(scaled_x))])
#规范化后的数据分布情况
plt.plot(scaled_x,scaled_y,'o',color='red')
协方差矩阵
协方差的定义:
方差的定义:
假设n为数据的特征数,那么协方差矩阵C, 为一个n*n的矩阵,其中Mij为第i和第j个特征的协方差,对角线是各个特征的方差。以三维数据为例,协方差矩阵如下:
#求协方差
cov=np.cov(scaled_x,scaled_y)
print (cov)
#[[0.42666667 0.4 ]
# [0.4 0.53066667]]计算特征值和特征向量,选取主成分
Numpy中计算特征值和特征向量的函数主要有两个,eig()和eigh()。一个计算的特征值为复数形式,一个为实数形式。本文中使用eig()。得到特征值和特征向量之后,我们可以根据特征值的大小,从大到小的选择K个特征值对应的特征向量。从eig_pairs选取前k个特征向量就行。这里,我们只有两个特征向量,选一个最大的。
#特征排序
#eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(len(eig_val))]
#eig_pairs.sort(reverse=True)
feature=eig_pairs[0][1]
print (feature)
#[-0.65995635 -0.75130394]原数据投影降维
将规范化的原数据与最大的k个特征值对应的特征向量点乘,得到降维后的新数据。在本例子中,原数据变成了一维的新数据。
new_data_reduced=np.transpose(np.dot(feature,np.transpose(data)))
print (new_data_reduced)
#[[ 0.17382607]
# [ 0.47434764]
# [-1.0211778 ]
# [-0.2312825 ]
# [-1.69026891]
# [-0.80492138]
# [ 0.21949986]
# [ 1.25510819]
# [ 0.54947804]
# [ 1.0753908 ]]用matplotlib画图表现二维数据在PCA之后如何降为1维。
new_data=np.transpose(np.dot(eig_vec,np.transpose(data)))
plt.plot(scaled_x,scaled_y,'o',color='red')
plt.plot([eig_vec[:,0][0],0],[eig_vec[:,0][1],0],color='red')
plt.plot([eig_vec[:,1][0],0],[eig_vec[:,1][1],0],color='blue')
plt.plot(new_data[:,0],new_data[:,1],'^',color='blue')
plt.plot(new_data_reduced[:,0],[1.5]*10,'*',color='green')蓝色的三角形是红色原点投影到红线、蓝线形成的,是经过坐标变换后得到的新点。绿色的五角星是PCA处理过后得到的一维数据,为了能跟以前的图对比,将他们的高度定位1.5,其实就是红色圆点投影到蓝色线之后形成的点。
结语
由上,PCA就是通过选择特征根向量,形成新的坐标系,然后数据投影到这个新的坐标系,在尽可能少的丢失信息的基础上实现降维。