本文在主成分分析(PCA)原理总结用scikit-learn学习主成分分析(PCA)的内容基础上做了一些笔记和补充,强调了我认为重要的部分,其中一些细节不再赘述。

Jupiter notebook版本参见我的github: https://github.com/konatasick/machine_learning_note/blob/master/pca.ipynb

PCA的思想

PCA(Principal components analysis,主成分分析)是一种降维算法,它通过使样本间方差尽量大来尽可能保留原始数据的相关关系。

 

PCA的算法

1) 对所有的样本进行中心化

2) 计算样本的协方差矩阵

3) 对协方差矩阵进行特征值分解

4)取出最大的m个特征值对应的特征向量, 将所有的特征向量标准化后,组成特征向量矩阵W。

5)对样本集中的每一个样本转化为新的样本

scikit-learn的sklearn.decomposition.PCA参数介绍

官方文档:sklearn.decomposition.PCA

Parameters:

n_components:这个代表了需要降维的维度。当它是整数时,代表了保留的维度数量。当它是一个介于0~1之间的数时,代表了主成分的方差所占的最小比例,例如0.95代表取超过95%的量的维度。当它为‘mle’,同时svd_solver == ‘full’时,系统会根据MLE算法自动选择维度。(此时svd_solver == ‘auto’将会被解读为svd_solver == ‘full’)

svd_solver:默认是‘auto’,即在剩下的‘full’, ‘arpack’, ‘randomized’中根据情况选一个。‘full’是传统的PCA,‘arpack’, ‘randomized’适用于数据量大的场景,其区别在于前者是通过scipy.sparse.linalg.svds实现。

Attributes*:

components_ : 主成分的投影坐标,代表了数据的最大方差的方向,根据explainedvariance由大到小排列。维度是m*n,其中n是原始数据的维度,m是降维后的维度。

explainedvariance和explained_varianceratio:前者是每一维的方差,后者是所占比例:

explained_varianceratio=explained_variance/sum(explainedvariance

维度是m, 当m=n时,sum(explained_varianceratio)=1。

mean_:每个feature的平均值。在pca算法的第一步,需要对feature归一化,此时的平均值保留在这里。

ncomponents :模型实际的降维数,即m。

 

PCA实例

用scikit-learn学习主成分分析(PCA)中示范了降维的操作。

首先我们生成随机数据并可视化,代码如下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
from sklearn.datasets.samples_generator import make_blobs
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本3个特征,共4个簇
X, y = make_blobs(n_samples=10000, n_features=3, centers=[[3,3, 3], [0,0,0], [1,1,1], [2,2,2]], cluster_std=[0.2, 0.1, 0.2, 0.2],
random_state =9)
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
plt.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o')

输出如图:

现在我们来进行降维,从3维降到2维,代码如下:

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X)
X_new = pca.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o')
plt.show()

输出如图:

在很多应用中,当我们将数据降维并用于训练后,训练出来的模型之后的输出也是降维后的数据,需要还原回原始维度。这时候需要将pca算法进行逆运算:

X_old=np.dot(Xnew,pca.components)+pca.mean_

即将新数据和components_相乘并加上平均值。

使用上文的例子,代码如下:

X_old=np.dot(X_new,pca.components_)+pca.mean_
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
plt.scatter(X_old[:, 0], X_old[:, 1], X_old[:, 2],marker='o')

输出如图:

可以看到,数据即是投影到最大方差方向但并未进行降维时的样子。

*parameter的命名后面没有下划线,而attribute的命名后面都有下划线,以此区分。

最新文章

  1. mvc 重定向的几种方式
  2. Python 读写文件中数据
  3. EditPlus 3.7 中文版已经发布
  4. CCNA网络工程师学习进程(4)网络设备的基本配置和详细介绍
  5. iOS阶段学习第二天笔记(数据类型与进制)
  6. Qt 之 去除窗口部件被选中后的焦点虚线框(设置Qt::NoFocus即可)
  7. [ActionScript 3.0] AS3 拖拽混动效果之一
  8. Ajax的ActionLink方法(适用于异步加载)
  9. 在线CSS圆角生成器
  10. 纯js制作遮罩层对话框 -- g皓皓
  11. hdu4336压缩率大方的状态DP
  12. SOM网络聚类完整示例(利用python和java)
  13. kubernetes入门(09)kubernetes的命令
  14. 数组for循环查找范围
  15. PhotoShop常用的功能汇总
  16. CISCO静态路由配置
  17. JS对象、基本类型和字面量的区别
  18. 第二章 JavaScript案例(中)
  19. [视频]K8飞刀 HackIE\EXP测试\Post提交
  20. Linux实践一:问题及解决

热门文章

  1. ACM-SG函数之S-Nim——hdu1536 hdu1944 poj2960
  2. misc类设备
  3. 如何通过github上传项目并在readme.md中展示图片二维码
  4. select2 多选 排序(版本3.4.6)
  5. Kali之——解决物理机U盘安装Kali Linux2018.1,光驱无法加载问题
  6. 在node中使用jwt签发与验证token
  7. [修正] Firemonkey SpeedButton 鼠标移开按钮后 IsPressed 为 False 的问题
  8. stm32串口通信实验,一点笔记
  9. 浅析Vue.js 中的条件渲染指令
  10. 希尔伯特曲线——第八届蓝桥杯C语言B组(国赛)第三题