专栏首页Python与算法之美30分钟学会PCA主成分分析

30分钟学会PCA主成分分析

PCA主成分分析算法(Principal Components Analysis)是一种最常用的降维算法。能够以较低的信息损失(以样本间分布方差衡量)减少特征数量。

PCA算法可以帮助分析样本中分布差异最大的成分(主成分),有助于数据可视化(降低到2维或3维后可以用散点图可视化),有时候还可以起到降低样本中的噪声的作用(丢失的信息有部分是噪声)。

公众号后台回复关键词:源码。获取本文全部代码和对应插图。

一,PCA算法的直觉理解

从直觉上看,PCA主成分分析类似于依次寻找一群样本点的各个位置差异最大的方向长轴。

假定把一个人身上的所有细胞看成一个一个的样本点。这些样本点可以用3个坐标来表示,从左到右为x方向,从前到后为y方向,从下到上为z方向。

那么它们的第一个主成分是什么呢?第一个主成分对应的长轴是沿着人的脚到头的方向,也就是通常的上下方向,即z方向。这个方向是最主要的长轴。这些样本点的位置差异基本上70%以上来自于这个方向上的差异。

它们的第二个主成分是什么呢?第二个主成分对应的方向是沿着人的左臂到右臂的方向,也就通常的左右方向,即y方向。这个方向和第一个主成分长轴垂直,这些样本点的位置差异大概有20%左右来自这个方向上的差异。

它们的第三个主成分是什么呢?第三个主成分方向是沿着人的前胸到后背的方向,也就是通常的前后方向,即x方向。这个方向和前两个主成分长轴垂直,样本点的位置差异有一般只有不到10%来自这个方向的差异,当然,有些身材比较圆润的同学除外。

现在,如果要将这些样本点的坐标减少到用2个来表示,并尽可能多的保留样本点之间位置差异的信息,那么,显然,应该保留第一个主成分坐标和第二个主成分坐标。

现在,假定这个人躺在一个斜的躺椅上,那么现在这些样本点的第一主成分显然不再是从下到上的z方向。我们应该将我们的坐标系作一个旋转,让z轴和斜着的躺椅方向一致,这个新的z方向是这些样本点的第一主成分方向。类似地,也需要旋转x轴和y轴得到新的第二主成分方向和第三主成分方向。

这个旋转旧坐标系以找到主成分方向的过程就是PCA主成分分析。

二,PCA算法的数学说明

PCA主成分分析(Principal Components Analysis)是一种通过正交线性组合方式最大化保留样本间方差的降维方法。

用几何观点来看,PCA主成分分析方法可以看成通过正交变换,对坐标系进行旋转和平移,并保留样本点投影坐标方差最大的前几个新的坐标。

这里有几个关键词需要说明:

  • 降维:将样本原来的m维特征用更少的k个特征取代。降维算法可以理解成一种数据压缩方法,它可能会丢失一些信息。
  • 正交线性组合:k个新特征是通过对m个旧特征进行线性组合产生的,并且k个线性组合的系数向量为单位向量,且彼此相互正交。
  • 最大化保留样本间方差:第1个主成分特征最大化样本间特征方差,第2个主成分特征在满足与第1个主成分正交约束条件下最大化样本间特征方差,……

三,PCA算法的调包范例

下面的范例我们调用sklearn中的PCA降维算法接口,对波士顿房价数据集进行降维(13维降到7维)。

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
from sklearn import datasets

boston = datasets.load_boston()
dfdata = pd.DataFrame(boston.data,columns = boston.feature_names)
dfdata.head()
# 不同特征取值范围相差较大,我们首先进行标准正态归一化
# 归一化的结果作为 PCA降维的输入
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(dfdata.values)
X_input = scaler.transform(dfdata.values)

# 我们的输入有506个样本,13维特征
print(X_input.shape)

输出如下:

(506, 13)

# 应用PCA进行降维

from sklearn.decomposition import PCA
pca = PCA(n_components=7)
pca.fit(X_input)
X_output = pca.transform(X_input)

# 降维后,只有7维特征
print(X_output.shape)

输出如下:

(506, 7)

# 查看各个主成分对应的方差大小和占全部方差的比例
# 可以看到前7个主成分已经解释了样本分布的90%的差异了。

print("explained_variance:")
print(pca.explained_variance_)

print("explained_variance_ratio:")
print(pca.explained_variance_ratio_)

print("total explained variance ratio of first 7 principal components:")
print(sum(pca.explained_variance_ratio_))

输出如下:

#可视化各个主成分贡献的方差
%matplotlib inline
%config InlineBackend.figure_format = 'svg'

import matplotlib.pyplot as plt
plt.figure()
plt.plot(np.arange(1,8),pca.explained_variance_,linewidth=2)
plt.xlabel('components_n', fontsize=16)
plt.ylabel('explained_variance_', fontsize=16)
plt.show()
# 查看降维对应的正交变换矩阵,即各个投影向量
W = pca.components_
# 验证正交关系
np.round(np.dot(W,np.transpose(W)),6)
# 对降维后的数据的前两维进行散点图可视化

%matplotlib inline
%config InlineBackend.figure_format = 'svg'

plt.scatter(X_output[:,0],X_output[:,1])
plt.xlabel("components_1")
plt.ylabel("components_2")
plt.show()

四,PCA算法的数学推导

前方高数提醒。

下面进行PCA算法的数学原理推演,证明第k个主成分投影向量恰好是样本的协方差矩阵的第k大特征值对应的特征向量。

下面的推演会用到高等数学中的一些线性代数知识和微积分知识。

没有相关数学基础的同学可以跳过,在实践中只要掌握PCA算法的直觉概念和调包使用方法,基本就够用了。

本文分享自微信公众号 - Python与算法之美(Python_Ai_Road),作者:梁云1991

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 算法理论+实战之PCA降维

    如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法:

    lyhue1991
  • 8,循环结构

    下面主要介绍Python中实现循环结构的几种方式:for循环,while循环,生成式,高阶函数,向量化。

    lyhue1991
  • 3500 字算法刷题精华总结

    写出几种常见复杂度对应的算法,星友们给出的答案都很准确,在这里参考星友聂磊的答案:

    lyhue1991
  • AI组队玩Dota2战胜人类,AI之间也能团队合作 | 热点

    近日,马斯克和Sam Altman所创立的人工智能非营利组织OpenAI宣布:其开发的AI能够组队在5V5对战中战胜Dota2顶尖业余玩家,这些人类玩家的平均天...

    镁客网
  • 【强推】成为一名AI工程师,永远都不晚

    从年初起,几家国际大厂的开发者大会,无论是微软Build、Facebook F8还是稍后的Google I/O,莫不把“AI优先”的大旗扯上云霄。 如果这一波A...

    AI科技大本营
  • 我在 GitHub 上发现了一个 "狗屁不通" 的开源项目...

    GitHub 上,这个富有灵魂的项目名吸引了众人的目光。项目诞生一周,便冲上了趋势榜榜首。

    GitHubDaily
  • 2 个月的面试亲身经历告诉大家,如何进入 BAT 等大厂?

    只是因为今天在我的 Java开发交流微信群 里面分享了关于我整个面试过程的总结及经验,这些总结都已经整合到 github 去了,在短短的几天的时间里,githu...

    好好学java
  • “狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作

    GitHub上,这个富有灵魂的项目名吸引了众人的目光。项目诞生一周,便冲上了趋势榜榜首。

    磐创AI
  • 对话 | 专访AAAI主席Subbarao:不要忘了,曾经少有人看好神经网络

    AAAI协会主席、亚利桑那州立大学教授Subbarao Kambhampati是人工智能领域的大拿。他在7月7日由中国计算机学会(CCF)主办,雷锋网与香港中文...

    AI科技评论
  • 买买买:为什么说巨头正在用钱堆出 AI 史上最严峻的危机

    【新智元导读】开源机器学习公司 H2O.ai 产品市场总监 Vinod Iyengar 昨天在TechCrunch刊文,就人工智能市场并购频繁尤其是初创公司在未...

    新智元

扫码关注云+社区

领取腾讯云代金券