本文在主成分分析(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. 二叉查找树(二叉排序树)(C语言)

    #include<stdio.h> #include "fatal.h" struct TreeNode; typedef struct TreeNode *Posit ...

  2. Oracle ddl 和 dml 操作

      ddl 操作 窗口设置用户权限的方法  Oracle的数据类型  按住Ctrl点击表名 ,可以鼠标操作  插入的数据需要满足创建表的检查  主表clazz删除数据从表设置级联也会一同删除 有约束也 ...

  3. JavaIO流(输入输出操作)

    Java中执行输出和输入操作,需要通过IO流.例如最常见的System.out.println()就是一个输出流.IO流的类比较多,但核心体系就是由File. InputStream .OutputS ...

  4. 如何通过github上传项目并在readme.md中展示图片二维码

    将本地项目上传至github   第一步:git init (创建仓库)   第二步:git add README.md (添加项目)git add *   第三步:git commit -m &qu ...

  5. 【Linux】管理文件系统

    文件系统概念: 文件系统是指文件的组织与管理结构,是一个有关于磁盘中各种有用信息的记录——即是保存以下信息的结构记录表 当前所使用磁盘的容量信息 磁盘的可用信息,包括已占用和剩余的空间: 文件与目录的 ...

  6. 如何提交代码到git仓库

    首先连接远程仓库 git remote add origin 仓库地址 然后拉取分支 git pull origin master 随后可查看本地增删改的文件 git status 增加本地的更改 g ...

  7. [转]Python爬虫html解析工具beautifulSoup在pycharm中安装及失败的解决办法

    原文地址:https://www.cnblogs.com/yysbolg/p/9040649.html 刚开始学习一门技术最麻烦的问题就是搞定IDE环境,直接在PyCharm里安装BeautifulS ...

  8. C语言简易三子棋

    这是本人依据现学知识写的简易三子棋,也不是那么简洁明了,望大佬指点 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include&l ...

  9. linux通过命令查找大文件

    一:如果linux根分区使用量达到100%,会造成如下现象: root不能登录 系统不能正常启动 二:通过命令查找根分区内的大文件 1.du -sh /* 2>/dev/null | sort ...

  10. 核密度估计 Kernel Density Estimation (KDE) MATLAB

    对于已经得到的样本集,核密度估计是一种可以求得样本的分布的概率密度函数的方法: 通过选取核函数和合适的带宽,可以得到样本的distribution probability,在这里核函数选取标准正态分布 ...