1.PCA简介
PCA全称是Principal component analysis,中文名是主成分分析。是对数据进行降维处理的一种常用方法。
PCA的原理可以理解为寻找超平面对样本进行表达,从而使得属性自身的方差尽可能大,而属性之间的协方差尽可能小。具体的数学原理可以去参考这位大神的文章:https://zhuanlan.zhihu.com/p/21580949
这篇文章从数学的角度出发,解释了矩阵相乘的意义等对于理解PCA原理很重要的概念。比西瓜书的解释更通俗易懂。
2.sklearn库PCA函数使用
本次使用的数字图片有0, 1, 2, 3, 4五种不同数字。每个图片由28×28=764个像素点组成,每个像素点的值在0-255之间。因此我们的数据集一共有764个属性。这不能说是一个相当大的数字,但是如果想观察数据或者处理数据,这个维度数也是不好处理的。因此我们对其进行降维。
可以通过两种不同的方法获取降维后的数据。其中pca.components_代表数据集的特征向量,而pca.explained_variance_即特征值。
#读取dataset
df = pd.read_csv('DataB.csv',index_col=0)
output = df['gnd']
df = df.drop('gnd',axis=1)
df = df-df.mean()
#对dataset进行降维
#比如我们想将数据将至二维,可以进行如下操作。
#方法1:定义PCA函数时不定义n_components,计算时通过特征向量进行计算
from sklearn.decomposition import PCA
pca = PCA()
pca.fit(df.values)
eigenvector = pca.components_
1_2_component = pd.DataFrame(np.dot(df.values,eigenvector[0:2].T))
#方法2:定义PCA函数时定义n_components,然后直接转换。
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
1_2_component = pca.fit_transform(df.values)
我们利用降至二维之后的数据进行作图从而观察数据。
import seaborn as sns
pca_1_2 = pd.DataFrame(np.dot(df.values,eigenvector[0:2].T))
pca_1_2['categories'] = output.values
sns.set(rc={'figure.figsize':(11,8)})
ax = sns.scatterplot(data=pca_1_2,x=0,y=1,hue='categories',s=40,palette={0:'r',1:'b',2:'g',3:'purple',4:'orange'})
可以看到不同数字图片降维后的数据分布是有规律的。数字1, 2, 4的数据互相并没有太多的重合,而数字2和数字3的数据因为2和3本身长得类似,因为图片数据在一定程度上是重合的,因此点的分布也会重合。
降维之后的数据保留有原先数据的许多信息,让我们能够通过作图去了解数据本身的信息。相当实用。
如果想利用降维后的数据进行图片重构的话,利用以下代码即可。
pca_n = PCA(n_components=2)
data_n = pca_n.fit_transform(df.values)
reconstruct = np.dot(data_n,eigenvector[:2])