scikit-learn学习主成分分析(PCA)_sklearn中的pca 为什么不用kom检验-程序员宅基地

技术标签: python  机器学习  pca  

1. scikit-learn PCA类介绍

    在scikit-learn中,与PCA相关的类都在sklearn.decomposition包中。最常用的PCA类就是sklearn.decomposition.PCA,我们下面主要也会讲解基于这个类的使用的方法。

    除了PCA类以外,最常用的PCA相关类还有KernelPCA类,在原理篇我们也讲到了,它主要用于非线性数据的降维,需要用到核技巧。因此在使用的时候需要选择合适的核函数并对核函数的参数进行调参。

    另外一个常用的PCA相关类是IncrementalPCA类,它主要是为了解决单机内存限制的。有时候我们的样本量可能是上百万+,维度可能也是上千,直接去拟合数据可能会让内存爆掉, 此时我们可以用IncrementalPCA类来解决这个问题。IncrementalPCA先将数据分成多个batch,然后对每个batch依次递增调用partial_fit函数,这样一步步的得到最终的样本最优降维。

    此外还有SparsePCA和MiniBatchSparsePCA。他们和上面讲到的PCA类的区别主要是使用了L1的正则化,这样可以将很多非主要成分的影响度降为0,这样在PCA降维的时候我们仅仅需要对那些相对比较主要的成分进行PCA降维,避免了一些噪声之类的因素对我们PCA降维的影响。SparsePCA和MiniBatchSparsePCA之间的区别则是MiniBatchSparsePCA通过使用一部分样本特征和给定的迭代次数来进行PCA降维,以解决在大样本时特征分解过慢的问题,当然,代价就是PCA降维的精确度可能会降低。使用SparsePCA和MiniBatchSparsePCA需要对L1正则化参数进行调参。

2. sklearn.decomposition.PCA参数介绍

    下面我们主要基于sklearn.decomposition.PCA来讲解如何使用scikit-learn进行PCA降维。PCA类基本不需要调参,一般来说,我们只需要指定我们需要降维到的维度,或者我们希望降维后的主成分的方差和占原始维度所有特征方差和的比例阈值就可以了。

    现在我们对sklearn.decomposition.PCA的主要参数做一个介绍:

    1)n_components:这个参数可以帮我们指定希望PCA降维后的特征维度数目。最常用的做法是直接指定降维到的维度数目,此时n_components是一个大于等于1的整数。当然,我们也可以指定主成分的方差和所占的最小比例阈值,让PCA类自己去根据样本特征方差来决定降维到的维度数,此时n_components是一个(0,1]之间的数。当然,我们还可以将参数设置为"mle", 此时PCA类会用MLE算法根据特征的方差分布情况自己去选择一定数量的主成分特征来降维。我们也可以用默认值,即不输入n_components,此时n_components=min(样本数,特征数)。

    2)whiten :判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1.对于PCA降维本身来说,一般不需要白化。如果你PCA降维后有后续的数据处理动作,可以考虑白化。默认值是False,即不进行白化。

    3)svd_solver:即指定奇异值分解SVD的方法,由于特征分解是奇异值分解SVD的一个特例,一般的PCA库都是基于SVD实现的。有4个可以选择的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。 full则是传统意义上的SVD,使用了scipy库对应的实现。arpack和randomized的适用场景类似,区别是randomized使用的是scikit-learn自己的SVD实现,而arpack直接使用了scipy库的sparse SVD实现。默认是auto,即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。一般来说,使用默认值就够了。

    除了这些输入参数外,有两个PCA类的成员值得关注。第一个是explained_variance_,它代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。第二个是explained_variance_ratio_,它代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。

3. PCA实例

    下面我们用一个实例来学习下scikit-learn中的PCA类使用。为了方便的可视化让大家有一个直观的认识,我们这里使用了三维的数据来降维。

    完整代码参见我的github: https://github.com/ljpzzz/machinelearning/blob/master/classic-machine-learning/pca.ipynb

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

复制代码

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')

复制代码

    三维数据的分布图如下:

    我们先不降维,只对数据进行投影,看看投影后的三个维度的方差分布,代码如下:

from sklearn.decomposition import PCA
pca = PCA(n_components=3)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_

    输出如下:

[ 0.98318212  0.00850037  0.00831751]
[ 3.78483785  0.03272285  0.03201892]

    可以看出投影后三个特征维度的方差比例大约为98.3%:0.8%:0.8%。投影后第一个特征占了绝大多数的主成分比例。

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

pca = PCA(n_components=2)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_

    输出如下:

[ 0.98318212  0.00850037]
[ 3.78483785  0.03272285]

    这个结果其实可以预料,因为上面三个投影后的特征维度的方差分别为:[ 3.78483785  0.03272285  0.03201892],投影到二维后选择的肯定是前两个特征,而抛弃第三个特征。

    为了有个直观的认识,我们看看此时转化后的数据分布,代码如下:

X_new = pca.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o')
plt.show()

    输出的图如下:

    可见降维后的数据依然可以很清楚的看到我们之前三维图中的4个簇。

    现在我们看看不直接指定降维的维度,而指定降维后的主成分方差和比例。

pca = PCA(n_components=0.95)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
print pca.n_components_

    我们指定了主成分至少占95%,输出如下:

[ 0.98318212]
[ 3.78483785]
1

    可见只有第一个投影特征被保留。这也很好理解,我们的第一个主成分占投影特征的方差比例高达98%。只选择这一个特征维度便可以满足95%的阈值。我们现在选择阈值99%看看,代码如下:

pca = PCA(n_components=0.99)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
print pca.n_components_

    此时的输出如下:

[ 0.98318212  0.00850037]
[ 3.78483785  0.03272285]
2

    这个结果也很好理解,因为我们第一个主成分占了98.3%的方差比例,第二个主成分占了0.8%的方差比例,两者一起可以满足我们的阈值。

    最后我们看看让MLE算法自己选择降维维度的效果,代码如下:

pca = PCA(n_components='mle')
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
print pca.n_components_

    输出结果如下:

[ 0.98318212]
[ 3.78483785]
1

    可见由于我们的数据的第一个投影特征的方差占比高达98.3%,MLE算法只保留了我们的第一个特征。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44430175/article/details/107675297

智能推荐

C++回声服务器_1-简单版本-程序员宅基地

文章浏览阅读82次。C++网络编程离不开socket编程。我们现在使用socket编写简单的回声服务器。流程这里所说的流程包括两部分:socket函数调用流程。服务器与客户端交互流程。socket函数调用流程服务器与客户端交互流程回声服务器主要功能:服务器将接收到来自客户端的数据传回客户端。服务器的功能:服务器在同一时刻只能与一个客..._回声客户端多次调用write会使数据一次性到达服务器

CICS入门-程序员宅基地

文章浏览阅读294次。最近在学习CICS的时候,没人指点,走了不少弯路。在大机和CICS中,很多概念和x86和linux、windows等通用平台以及J2EE架构中的一些概念不尽相同。这里列举出一些对初学者特别重要的概念,并且以通用平台的概念作为类比,希望对新了解大机和CICS的朋友有些帮助。预备首先说说CICS和Mainframe(大机)的关系。通常对CICS的定义,都是说:CICS是运行在..._cics学习

python2 python3选择哪个_Anaconda使用总结暨部署python2和python3共存-程序员宅基地

文章浏览阅读180次。Anaconda概述Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windows系统,提供了包管理与环境管理的功能,可以很方便地解决多版本python并存、切换以及各种第三方包安装问题。Anaconda利用工具/命令conda来进行package和environment的管理,并且已经包含了Python和相关的配套工具。这里先解释下conda、anacond..._anaconda2和3哪个好

JAVA本地读取文件,解决中文乱码问题_java new file 中文-程序员宅基地

文章浏览阅读1.8w次。package com.te;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileNotF_java new file 中文

oracle roseha 配置,RoseHA8.5 for Windows Oracle11g配置文档-程序员宅基地

文章浏览阅读294次。RoseHA8.5 for Windows Oracle11g配置文档目录一 文档说明 .................................................................................................................1 二 安装Oracle..............................._oracle rose ha

C语言:快速排序_c语言生成100000个随机数进行快速排序-程序员宅基地

文章浏览阅读219次。#include <stdio.h>#include <string.h>#include <strings.h>#include <stdlib.h>#include <stdbool.h>int swap(int *a, int *b){ int c; c = *a; *a = *b; *..._c语言生成100000个随机数进行快速排序

随便推点

r语言导出文件为xlxs_R语言学习——R读取txt、csv、xls和xlsx格式文件-程序员宅基地

文章浏览阅读2.8k次。最近项目中运用到了R读取文件数据,所以把相关好用的、经过验证的方法总结了一下,有效避免下次入坑。1. R读取txt文件使用R读取txt文件直接使用read.table()方法进行读取即可,不需要加载额外的包。read.table("/home/slave/test.txt",header=T,na.strings = c("NA"))1注意,此处的na.strings = c("NA") 的意思是..._r语言输出txt文件

浙江义乌机场开通义乌-首尔国际货机航线-程序员宅基地

文章浏览阅读213次。义乌机场开通义乌-首尔国际货机航线 义乌提供义乌机场开通义乌-首尔国际货机航线 义乌提供中新网义乌1月22日电 (记者 奚金燕)1月22日早晨7时30分,随着一架载有6吨货物从首尔飞往义乌的货机缓缓驶入机坪,标志着浙江义乌机场货机航线正式开通。地处浙江省中部的义乌,坐拥全球最大的小商品市场,有180万种商品销往全球200个国家和地区。近年来,义乌正致力于“买全球、卖全球”,加快打造世界“小商品之都..._近期坐飞机去义乌要隔离吗?

ROS全覆盖规划算法逻辑整理笔记_ros2覆盖规划-程序员宅基地

文章浏览阅读1.5w次,点赞29次,收藏235次。ROS提供了计算生成全覆盖路径的代码,在经历了一段时间的代码研究与优化后,决定将部分思路整理成笔记,方便以后查看。_ros2覆盖规划

SpringBoot中拦截器的基本使用_handlerinterceptor内使用bean-程序员宅基地

文章浏览阅读712次。【拦截器的介绍】拦截器是类似于Servlet的Filter,对一次请求进行拦截,然后可以处理一些校验之类的工作,作用还是挺大的。【SpringBoot中拦截器的使用】在SpringBoot中使用拦截器非常简单。总的来讲就只有以下两个步骤:1.让一个Bean继承HandlerInterceptorAdapter类,里面有两个常用的方法preHandle, postHandle。一般将它们两个..._handlerinterceptor内使用bean

python比赛评分计算代码_Python实现半自动评分卡建模(附代码)-程序员宅基地

文章浏览阅读1.2k次。作者:Summer Memories个人公众号:风控汪的数据分析之路知乎专栏:小鑫的数据分析笔记这次分享一个自己写的python脚本,可以实现半自动化的评分卡建模。运行脚本时需要input已经预处理好的训练集和测试集数据,所以建模前期的EDA,数据清洗,缺失值填充等需要人工完成。Github链接:taenggu0309/Semi-auto-modeling​github.com使用方法:直接调用 ..._python 的tree.tree_.threshold

画图神器:在IntelliJ IDEA中使用PlantUML插件实现各种图绘制(UML,类图,时序图等)_plantuml预览当前位置没有找到图表-程序员宅基地

文章浏览阅读8.1k次,点赞3次,收藏16次。当PlantUML integration插件安装完成后,您可以利用IntelliJ IDEA的强大功能来创建、编辑和预览PlantUML图表。在本篇博客文章中,我们将介绍如何使用该插件。_plantuml预览当前位置没有找到图表

推荐文章

热门文章

相关标签