scikit-learn使用PCA降维小结
本文在主成分分析(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的命名后面都有下划线,以此区分。
scikit-learn使用PCA降维小结的更多相关文章
- 关于PCA降维中遇到的python问题小结
由于论文需要,开始逐渐的学习CNN关于文本抽取的问题,由于语言功底不好,所以在学习中难免会有很多函数不会用的情况..... ̄へ ̄ 主要是我自己的原因,但是我更多的把语言当成是一个工具,需要的时候查找就 ...
- Scikit Learn: 在python中机器学习
转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...
- 在SCIKIT中做PCA 逆运算 -- 新旧特征转换
PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...
- 一步步教你轻松学主成分分析PCA降维算法
一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...
- 在SCIKIT中做PCA 逆变换 -- 新旧特征转换
PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...
- [综] PCA降维
http://blog.json.tw/using-matlab-implementing-pca-dimension-reduction 設有m筆資料, 每筆資料皆為n維, 如此可將他們視為一個mx ...
- 机器学习公开课笔记(8):k-means聚类和PCA降维
K-Means算法 非监督式学习对一组无标签的数据试图发现其内在的结构,主要用途包括: 市场划分(Market Segmentation) 社交网络分析(Social Network Analysis ...
- scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)
scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...
- (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探
一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...
随机推荐
- font-failmly字体对应
- Datatable报错Uncaught TypeError: Cannot read property 'cell' of undefined
使用Datatables时,报出错误 仔细想想,是因为我在columns里加入了id,并设置visible:false 但是却没在下面的HTML部分多加一个 th 虽然我觉得因为id是隐藏的,不用加上 ...
- Apache 各启动方式的差别
apachectl 调用 $httpd -k 1. kill - TERM `cat /usr/local/apache/logs/http.pid` 2. /bin/httpd -k stop/s ...
- 纸质文稿如何生成PDF
步骤: (1) 将即将要转换的文稿单张向下放入打印机. (2) 将打印设备(打印机)连接至你的电脑. (3) 打开控制面板,点击"查看设备和打印机". (4) 找到你当前的打印设备 ...
- oracle 子查询的几个种类
1.where型子查询: select cat_id,good_id,good_name from goods where good_id in (selct max(good_id) from go ...
- c#使用emit方法DB,实体相互转换
网上有很多ORM框架和数据库转换方法. c#由EF控制,但是大家知道的是影响效率和底层控制. 因此最近几个月一直在研究.最后产出了Hikari数据库连接池. 但是该库只是定位在连接池,无法有效进行后续 ...
- GoogleTest初探(0)
单元测试是一种保证代码质量的手段.程序员可以通过写单元测试来保证自己写的代码的功能正确. 本人所在公司使用GoogleTest测试框架来进行单元测试.虽然现在在公司的工程代码中写单元测试已经驾轻就熟, ...
- thinkphp3.2 上传图片兼容小程序
第一步在配置文件中设置图片的大小和路径 return array( //'配置项'=>'配置值' 'img_save'=>[ 'size' =>[ 'app_gszc_Card'=& ...
- LVM的创建与管理
LVM的创建与管理1.创建物理分区 fdisk 或者 parted 工具分区. LVM分区的类型ID为8e2.创建物理卷 pvcreate 磁盘分区或整个磁盘3.创建卷组 vgcreate 卷组 ...
- case when 多个条件 以及case when 权重排序
1. case when 多个条件 语法: SELECT nickname,user_name,CASE WHEN user_rank = '5' THEN '经销商' WHEN user_rank ...