用scikit-learn学习主成分分析(PCA)

在主成分分析(PCA)原理总结中,我们对主成分分析(以下简称PCA)的原理做了总结,下面我们就总结下如何使用scikit-learn工具来进行PCA降维。

一、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正则化参数进行调参。

二、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_,它代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。

三、PCA实例

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

    完整代码参见我的github: https://github.com/nickchen121/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算法只保留了我们的第一个特征。

 

(欢迎转载,转载请注明出处。欢迎沟通交流: 微信:nickchen121)

转载于:https://www.cnblogs.com/nickchen121/p/11214894.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开始即结束,Meta元宇宙OS要黄?

来源:七月在线实验室出师未捷身先死,Meta元宇宙操作系统要凉凉了?团队解散,负责人跳槽!副总裁亲自发推「辟谣」,但……Facebook进军元宇宙决心,如今要泡汤了?发布元宇宙产品不过瘾&a…

3.1_ 1_ 内存的基础知识

3.1_ 1_ 内存的基础知识 文章目录1.知识总览2.什么是内存,有什么作用进程的运行原理-指令逻辑地址vs物理地址从写程序到程序运行装入模块装入内存装入的三种方式--绝对装入装入的三种方式一静态重定位装入的三种方式- -动态重定位进程运行的基本原理链接的三种方式知…

为什么说黎曼猜想是最重要的数学猜想?

来源:卢老师网站: www.changhai.org作者: 卢昌海老师, 科学人黎曼猜想是一位名叫黎曼 (Bernhard Riemann) 的数学家提出的。黎曼是一位英年早逝的德国数学家, 出生于 1826 年, 去世于 1866 年, 享年还不到 40 岁。黎曼的一生虽然短…

【广搜】Keyboarding

题目描述 给定一个r行c列的在电视上的“虚拟键盘”,通过“上,下,左,右,选择”共5个控制键,你可以移动电视屏幕上的光标来打印文本。一开始,光标在键盘的左上角,每次按方向键&#xf…

3.1_ _2_ 内存管理的概念

知识总览 内存空间的分配和回收 内存空间的扩展 地址转换 内存保护 知识回顾

Yann LeCun:发现智能原理是AI的终极问题 | 独家对话

来源:智源社区对话整理:李梦佳 周致毅导读:在《科学之路:人,机器与未来》一书中,图灵奖得主,卷积网络之父杨立昆(Yann LeCun)提出,在科学史上,技术…

4.1.2电路交换、报文交换与分组交换

1.网络的掌中宝 2.为什么要进行数据交换 3.数据交换方式 3.1 电话交换 3.2报文交换 3.3分组交换 3.4 报文交换和分组交换 3.5三种数据交换比较总结

leetcode-187-重复的DNA序列

题目描述: 方法一: class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n 10d {}for i in range(len(s)-9):if s[i:i10] in d:d[s[i:i10]] Trueelse:d[s[i:i10]] Falsereturn [i for i in d if d[i]] 方法二: c…

机器人视觉三维成像技术全解析

来源:卢荣胜,史艳琼,胡海兵. 机器人视觉三维成像技术综述[J]链接:http://www.opticsjournal.net/Articles/Abstract/lop/57/4/040001.cshtml原题:机器人视觉三维成像技术综述摘要本文针对智能制造领域机器人视觉感知中的三维视觉成像技术进行…

4.1.3数据报与虚电路

4.1.3数据报与虚电路 文章目录4.1.3数据报与虚电路1.三种数据交换方式比较总结2.数据报方式&虚电路方式3.几种传输单元名词解析4.数据报5.虚电路数据报&虚电路 对比总结1.三种数据交换方式比较总结 2.数据报方式&虚电路方式 3.几种传输单元名词解析 4.数据报 5.虚电…

MIT物理学家观察超冷原子形成量子龙卷风晶体

来源:诸平科学网博客链接地址:https://blog.sciencenet.cn/blog-212210-1319857.htmlJust like the formation of weather patterns on Earth, here a spinning fluid of quantum particles breaks up into a crystal formed from swirling, tornado-lik…

4.2路由算法与路由协议概述

4.2路由算法与路由协议概述 文章目录4.2路由算法与路由协议概述1.路由算法2.路由算法的分类3.分层次的路由选择协议1.路由算法 2.路由算法的分类 3.分层次的路由选择协议

北大200页元宇宙报告!六大板块,看20家巨头的元宇宙布局 | 智东西内参

来源 北京大学汇丰商学院 安信证券作者:魏炜 等原标题:《元宇宙2022——蓄积的力量》如何看待元宇宙这一新事物?有人说元宇宙是未来互联网的发展目标,是人类信息技术的另一场革命,也有人说元宇宙概念只是“割韭菜”的套…

4.3.1 IP数据报格式

4.3.1 IP数据报格式 文章目录4.3.1 IP数据报格式1.TCP/IP协议栈2.IP数据报格式1.TCP/IP协议栈 2.IP数据报格式

人工智能可以发现数据中隐藏的物理规律

来源:ScienceAI编辑:萝卜皮神户大学和大阪大学的研究人员成功开发了人工智能技术,可以从常规观测数据中提取隐藏的运动方程,并创建一个遵循物理定律的模型。这项技术可以让研究人员发现现象背后隐藏的运动方程,而这些方…

4.3.2 IP数据报分片

4.3.2 IP数据报分片 文章目录4.3.2 IP数据报分片1.最大传输单元2.IP数据报格式3.IP数据报分片例题4.IP数据报格式1.最大传输单元 2.IP数据报格式 3.IP数据报分片例题 4.IP数据报格式

Nature:AI 引导人类直觉,帮助发现数学定理

来源:集智俱乐部作者:Alex Davies, Petar Veličković, Lars Buesing等译者:赵雨亭 审校:潘佳栋 编辑:邓一雪导语我们通常认为,数学家的世界充满了直觉和想象力,他们发现模型、提出猜想、证明定…

4.3.3 IPv4地址

4.3.3 IPv4地址 文章目录4.3.3 IPv4地址1.ip地址2. IP编址的历史阶段2.分类的IP地址3.互联网中的IP地址4.分类的ip地址5.特殊ip地址6.私有ip地址7.分类的ip地址1.ip地址 2. IP编址的历史阶段 2.分类的IP地址 3.互联网中的IP地址 4.分类的ip地址 5.特殊ip地址 6.私有ip地址 7.分…

8大趋势已现,未来传感器将彻底改变你的生活!

来源:传感器专家网 现代信息技术发展到2022年,传感器的重要性越来越高,物联网、元宇宙、人工智能、自动驾驶……无不离不开传感器。2022年,传感器更伴随着这些技术的发展,进一步改变我们的生活,同时传感器本…