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

智能推荐

ESP-IDF + Vscode ESP32 开发环境搭建以及开发入门_esp32 idf vscode-程序员宅基地

文章浏览阅读7.8k次,点赞35次,收藏93次。本文采用的方法称之为:ESP-IDF + Vscode开发方法,此方法成功的将 `ESP-IDF` 工具与编译工具分离,因此可以单独维护,关于ESP-IDF的版本切换可直接使用git切换即可,十分的方便,同时编辑器还是采用Vscode,编写代码还是很方便此外,本文除了阐述如何搭建开发环境之外,还记载了博主关于ESP32开发过程中的相关笔记,主要介绍了如何采用ESP32的开发风格开始搭建我们自己的工程进行开发。_esp32 idf vscode

【Java】智慧工地云管理平台源码_智慧工地信息管理平台源码-程序员宅基地

文章浏览阅读275次,点赞3次,收藏5次。一、智慧工地监管端功能1.数据统计分析:工地数据分析、项目人员分析、危大工程分析、环境监测分析、安全隐患分析。2.项目人员监管:项目管理、班组管理、劳务人员管理、证件管理、考勤管理、考勤明细、考勤日期设置、工资管理、疫情进出场统计、在岗履职统计、教育培训、企业良好行为、企业不良行为、个人不良行为、个人良好行为、项目授权。3.视频监控监管:视频监控查看、智能视频AI分析、视频执法记录。4.危大工程监管:实时监测报警、机械设备司机识别、塔机监测、升降机监测、高支模监测、基坑监测。_智慧工地信息管理平台源码

电脑技巧:电脑卡顿的4个优化小技巧,太有用了-程序员宅基地

文章浏览阅读9.9k次,点赞3次,收藏38次。电脑经常卡顿,就会严重影响了大家的工作效率,其实你的电脑可以开启“加速”优化设置来提升电脑的性能,今天小编就来给大家分享四个能减少电脑卡顿的实用小技巧,让电脑焕然一新,还不赶紧来试一试?一、调整电脑处理器性能首先,在桌面中右击「此电脑」,选择「属性」,进入页面后选择「高级系统设置」,在性能选项中进入「设置」,然后我们在视觉效果中选择「调整为最佳性能」。随后回到性能选项页面...

深度学习模型参数量与训练数据量的平衡对泛化性能的影响_训练数据量和模型性能-程序员宅基地

文章浏览阅读2.1k次。在深度学习中,选择合适的模型复杂度和训练数据量对于获得具有良好泛化性能的模型至关重要。本文讨论了模型参数量与训练数据量之间的关系,以及如何在实际应用中找到合适的平衡。通过采用交叉验证、学习曲线等方法评估模型泛化性能,并使用数据增强和正则化技术优化模型,可以有效提高模型在未知数据上的表现。_训练数据量和模型性能

NET MVC接口服务如何运行在容器中-程序员宅基地

文章浏览阅读289次。有些公司内部存在一些NET项目,而公司服务器后期都换成了Linux,若单纯为这一个项目占用一台Windows服务器显得极其浪费,因此需要将NET项目嵌入到Linux服务器中,为了后期方便迁移和运维最好是Docker容器中运行。新的.net core都已经支持docker,手头有一些原来开发的asp.net旧项目,用的asp.netmvc开发的,跑在.net formwork 4.6上。我们的web项目要想运行,需要有一个像IIS一种的服务器组件,在这里有两层意思:1.Net。

python 抢红包 不越狱_这个Python脚本牛逼了,秒抢红包and无视撤回消息-程序员宅基地

文章浏览阅读249次。我想很多的朋友都遇到过这样的问题,特别是在亲友群里面,很多时候别人发了红包自己却不知道!很难受........还有一种情况:当自己一直喜欢的女神发给自己一个消息的时候,还没来得及看,就撤回了。是不是自己在心中"YY",她是不是发了什么,然后你问她的时候,她却说没什么。但是!!!!!强大的Python以及强大的程序员可以帮你解决这个问题!!!!!用Python开发一个微信小助手主要包括以下功能:1....

随便推点

算筹-程序员宅基地

文章浏览阅读851次。算筹简述(相关链接:http://hi.hnjs.org/t/2993235)  中国春秋时代就出现了”算筹”根据史书的记载和考古材料的发现,古代的算筹实际上是一根根同样长短和粗细的小棍子,一般长为13--14cm,径粗0.2~0.3cm,多用竹子制成,也有用木头、兽骨、象牙、金属等材料制成的,大约二百七十几枚为一束,放在一个布袋里,系在腰部随身携带。把算筹装在袋子里或笔筒中随身携带,这就是古..._中国算筹

JSON.stringify()、JSON.parse()、Object.toJSON()_jsonobject.parse(doposttojson);-程序员宅基地

文章浏览阅读2k次。什么是JSON JSON(javascript object nanotion,js对象标记)是轻量级的数据交换格式,采用独立于语言的文本格式来存储和表示数据。JSON采用键值对保存数据,数据使用逗号分隔,花括号保存对象,方括号保存数组,键名使用双引号,键值间使用冒号分隔。如:{"name":[{"cnt":"张三","country":"中国"},{"cnt":"san zhan_jsonobject.parse(doposttojson);

最小采样频率计算公式_速度采样频率-程序员宅基地

文章浏览阅读4k次。卓老师,我有一个信号与系统的问题想请教。按照时域采样定理,采样频率≥2倍的信号频率,才能得到信号全部信息。而以智能车中的编码器测速为例。我们知道测速周期在可接受范围内越小越利于控速,比如2ms。但2ms采样一次速度,究竟能不能得到速度信号的全部信息我们却不得而知,归根结底是因为不知道速度信号的频率是多少。那么智能车速度信号的频率要如何得知呢?速度光电编码盘(回复)提问中的问题包括有三个子..._信号与系统最低采样频率

详解 MySQL 基准测试和 sysbench 工具_sysbench mysql基准测试-程序员宅基地

文章浏览阅读448次。前 言作为一名后台开发,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的。本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法。文章有疏漏之处,欢迎批评指正。一、基准测试简介1、什么是基准测试数据库的基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。基准测试与压力测试基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑,更加简单、直接、易于测试,数据可以由工具生成,不要求真实;而压力测试一般考虑业务逻辑(如购物_sysbench mysql基准测试

ffmpeg_function: av_sample_get_buffer_size_av_samples_get_buffer_size-程序员宅基地

文章浏览阅读5.2k次,点赞3次,收藏2次。音频一般是采用成PCM格式,而计算PCM格式音频尺寸,就需要如下几个参数。通道数,采样频率,采用格式。通道数:个人理解,就是同时有个几个设备在进行音频的采样,最少为1,一般通道数越多,音质越好。采样频率:(也称为采样速度或者采样频率)定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采用位数:既然采样频率表示每秒采样的个数,那么如何描述每个_av_samples_get_buffer_size

【Mac + Appium + Python3.6学习(二)】之Android自动化测试,appium-desktop配置和简易自动化测试脚本...-程序员宅基地

文章浏览阅读151次。上一篇文章介绍安装appium测试环境,这一片研究介绍如何测试Android自动化。上一篇地址:《【Mac + Appium学习(一)】之安装Appium环境》这一篇参考:《Mac 下 appium 自动化测试 Android 测试配置和脚本编写(四)》配置环境:Appium version :1.9.1Appium-desktop:后改为1.7.1Android:6..._appium和appium-desktop哪个做自动化测试好

推荐文章

热门文章

相关标签