吾本轻狂|PCA 主成分分析( 四 )


选择的成分的方差的大小 , 确定的是对应的方向上的大小 , 也就是上图中两个黑色箭头的长短 , 排序是S中方差从大到小的排序 。
Pca.mean_:array, shape(n_feature)
Per-feature empirical mean, estimated from the training set.Equal to X.mean,
计算出整个训练集中点群的中间点位置 , 即上图中两个黑色箭头的交叉点(箭头的起点) 。
因为我们给定的n_components=2 , 所以上图中有两个向量 , V确定了这两个矢量的方向 , 在计算时我们使用了sqrt(explained_variance_) , 对explained_variance开了根号 , 而explained_variance是由S的平方除以(n_samples-1)得到的 , 所以这里的结果和S是线性的关系 , 从而确定了这两个矢量的大小 , 由此画出了上图中两个黑色的既有长度 , 又有大小的箭头 。 箭头越长说明图上的散点在这个方向上越分散 , 不同的点在这个方向上更能有较大的区别 , 而sigma值更小的 , 表现出来箭头也更短 , 所以长箭头表示的方向比短箭头表示的方向在这组数据中更为主要 , 图中两个黑色箭头互相垂直 。
画箭头的function:
Ax.annotate(self, text, xy, *args, **kwargs)
Annotate the point xy with text text,
ax.annotate('',v1,v0,arrowprops=arrowprops)
直线是点xy 到xytext之间 , 即v1和v0这两个点连成一条直线 , 箭头的样式定义在arrowprops这个dictionary里面 。
arrowprops=dict(arrowstyle='<-', linewidth=2, shrinkA=0, shrinkB=0, color='Black')arrowstyle箭头的类型 , arrowstyle变成’->’时 , 方向就会反过来 。 Linwidth:线条宽度 , shrink:就是要不要缩短箭头 , 我们这里就不需要了 , color:箭头颜色 。
下面看看当我们把维度降下来 , 变成一个component的时候:此时需要把n_components=1 , 之前的S里面有两个基础向量 , 现在把n_components设置为1后变成了一个 。 在S矩阵里面 , 从左上角到右下角 , 取出第一个sigma 。
pca=PCA(n_components=1)pca.fit(X)X_pca=pca.transform(X)print("original shape: ",X.shape)print("transformed shape: ",X_pca.shape)
吾本轻狂|PCA 主成分分析X_new=pca.inverse_transform(X_pca)plt.scatter(X[:,0],X[:,1],alpha=0.3)plt.scatter(X_new[:,0],X_new[:,1],alpha=0.8)plt.axis('equal')Pca.fit(X): fit the model.
Pca.transform(X) : Apply dimensionality reduction to X.
给原来的矩阵降维 , 这里设置的n_components=1 , 最终维度为1 。
Pca.inverse_transform(X_pca): transform data back to its original space.
把降维后的数据还原到原来的空间中 , 这边是把二维降维到一维后的数据还原到二维空间中 , 还原到二维空间后 , 其中一个维度的信息被丢失就不能展示出来 。
吾本轻狂|PCA 主成分分析画出来的图像如上图 , 橘色部分的点 , 组成一条线条 , 和之前的较长边的向量(黑色箭头)具有相同的倾斜角度 , 并且蓝色的每一个点做垂线垂直于橘色点组成的直线的话 , 在垂足的地方有与蓝色点对应的橘色点 , 也就是蓝色点在这条直线上的投影 。 这里面在另外一个方向上 , 也就是较短的那个向量方向上的信息我们就丢掉了 , inverse_transform之后的结果只有一个component inverse transform的结果 , 而在另外那个方向上 , 由于它的variance更小 , 我们选择丢掉它 。