本文在主成分分析(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降维小结的更多相关文章

  1. 关于PCA降维中遇到的python问题小结

    由于论文需要,开始逐渐的学习CNN关于文本抽取的问题,由于语言功底不好,所以在学习中难免会有很多函数不会用的情况..... ̄へ ̄ 主要是我自己的原因,但是我更多的把语言当成是一个工具,需要的时候查找就 ...

  2. Scikit Learn: 在python中机器学习

    转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...

  3. 在SCIKIT中做PCA 逆运算 -- 新旧特征转换

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

  4. 一步步教你轻松学主成分分析PCA降维算法

    一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...

  5. 在SCIKIT中做PCA 逆变换 -- 新旧特征转换

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

  6. [综] PCA降维

    http://blog.json.tw/using-matlab-implementing-pca-dimension-reduction 設有m筆資料, 每筆資料皆為n維, 如此可將他們視為一個mx ...

  7. 机器学习公开课笔记(8):k-means聚类和PCA降维

    K-Means算法 非监督式学习对一组无标签的数据试图发现其内在的结构,主要用途包括: 市场划分(Market Segmentation) 社交网络分析(Social Network Analysis ...

  8. scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)

    scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...

  9. (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探

    一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...

随机推荐

  1. font-failmly字体对应

  2. Datatable报错Uncaught TypeError: Cannot read property 'cell' of undefined

    使用Datatables时,报出错误 仔细想想,是因为我在columns里加入了id,并设置visible:false 但是却没在下面的HTML部分多加一个 th 虽然我觉得因为id是隐藏的,不用加上 ...

  3. Apache 各启动方式的差别

    apachectl 调用 $httpd -k 1. kill - TERM `cat /usr/local/apache/logs/http.pid` 2. /bin/httpd -k  stop/s ...

  4. 纸质文稿如何生成PDF

    步骤: (1) 将即将要转换的文稿单张向下放入打印机. (2) 将打印设备(打印机)连接至你的电脑. (3) 打开控制面板,点击"查看设备和打印机". (4) 找到你当前的打印设备 ...

  5. oracle 子查询的几个种类

    1.where型子查询: select cat_id,good_id,good_name from goods where good_id in (selct max(good_id) from go ...

  6. c#使用emit方法DB,实体相互转换

    网上有很多ORM框架和数据库转换方法. c#由EF控制,但是大家知道的是影响效率和底层控制. 因此最近几个月一直在研究.最后产出了Hikari数据库连接池. 但是该库只是定位在连接池,无法有效进行后续 ...

  7. GoogleTest初探(0)

    单元测试是一种保证代码质量的手段.程序员可以通过写单元测试来保证自己写的代码的功能正确. 本人所在公司使用GoogleTest测试框架来进行单元测试.虽然现在在公司的工程代码中写单元测试已经驾轻就熟, ...

  8. thinkphp3.2 上传图片兼容小程序

    第一步在配置文件中设置图片的大小和路径 return array( //'配置项'=>'配置值' 'img_save'=>[ 'size' =>[ 'app_gszc_Card'=& ...

  9. LVM的创建与管理

    LVM的创建与管理1.创建物理分区  fdisk 或者 parted 工具分区. LVM分区的类型ID为8e2.创建物理卷  pvcreate 磁盘分区或整个磁盘3.创建卷组  vgcreate 卷组 ...

  10. case when 多个条件 以及case when 权重排序

    1. case when 多个条件 语法: SELECT nickname,user_name,CASE WHEN user_rank = '5' THEN '经销商' WHEN user_rank ...