本文在主成分分析(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. 无法加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项

    未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项.找到的程序集清单定义与程序集引用不匹配. (异常来自 HRESULT:0x80131040). 有时候我们创建了一个类库,我们 ...

  2. SSIS中出现数据流数据源假死状态的解决办法

    相信开发过Sql Server SSIS的人都遇到过在数据流中数据源假死的问题,特别是Excel Source特别容易假死,当job执行到数据流中的Excel Source时,既不报错也不执行,也没有 ...

  3. Failed to read artifact descriptor for org.apache.maven.plugins:maven-jar-plugin

    在更新maven项目的时候出现许多jar包找不到的问题,但是在本地仓库中查找的时候包含这些jar包. 解决办法: 把所有报错缺少的jar包所在的文件夹删掉,重新更新maven项目,重新下载完成后错误解 ...

  4. 【Linux资源管理】iotop命令监控磁盘使用情况

    一.iotop工具介绍 I/O可谓是数据库\服务器的最大瓶颈问题了,在使用top.nmon.zabbix.sar等工具监控I/O时,要么没有I/O监控(如top.zabbix),要么仅仅监控到磁盘层面 ...

  5. transfrom、transition、animation区别

    transfrom transform是静态属性,非动画属性,和margin-left.margin-top类似. translate:平移,类似position:relative;translate ...

  6. Oracle之子程序(存储过程、方法、包)

    .过程[存储过程] CREATE [OR REPLACE] PROCEDURE <procedure name> [(<parameter list>)] IS|AS < ...

  7. spring boot2整合dubbox全注解

    前题 dubbox是dubbo的一个升级版,简单说就是本来dubbo是阿里开发的,现在阿里不维护了,当当网拿过去继续开发.本来阿里的dubbo维护到2.6版本,而再高版本的都是当当网维护的就叫成dub ...

  8. 旁听<基因编辑与精准医疗>(北京大学)

    昨天去北大生命科学院听了一场魏文胜教授关于基因方面的讲座.会场人不算太多,比起上次听城市规划,场面略显冷清.也能从一个侧面反映,关注基础科学领域的人虽然有,但是不是很多. 开场魏教授用了宣传海报作为导 ...

  9. Oracle入门第五天(下)——数据库其他对象

    一.概述 其他数据库对象 主要掌握的为序列 二.序列 1.什么是序列 序列: 可供多个用户用来产生唯一数值的数据库对象 自动提供唯一的数值 共享对象 主要用于提供主键值 将序列值装入内存可以提高访问效 ...

  10. 20155233 《Java程序设计》第十二周课堂练习总结

    20155233 <Java程序设计> 第十二周课堂练习总结 测试题目 1.修改教材P98 Score2.java, 让执行结果数组填充是自己的学号:提交在IDEA或命令行中运行结查截图, ...