> For the complete documentation index, see [llms.txt](https://varyshare.gitbook.io/easy-machine-leaning/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://varyshare.gitbook.io/easy-machine-leaning/untitled-1.md).

# 5分钟理解PCA主成分分析

> 知道IEEE这个国际学术机构和工业标准制定机构禁止部分国内985高校教授和受华为资助的教授和学生审稿和参与编辑后。除了愤怒还是愤怒，除了图强还是图强。说正事。\
> PCA用来可以[降维](https://link.zhihu.com/?target=https%3A//baike.baidu.com/item/%25E9%2599%258D%25E7%25BB%25B4)。降低数据维度既可以减少计算量，也可以降低噪声。最后本文使用了Python对PCA进行实现。\
> 初学者机器学习资料分享Q群(718566626)

## 1. 直观理解PCA主成分分析是什么？

[**Principal Component Analysis(PCA)**](https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Principal_component_analysis)**主成分分析它本质是把数据视作一个**[**椭球**](https://link.zhihu.com/?target=https%3A//baike.baidu.com/item/%25E6%25A4%25AD%25E7%2590%2583)。二维的话就是一个椭圆。我们知道椭球它有长轴和短轴。**如果3维的椭球某个**[**短轴**](https://link.zhihu.com/?target=https%3A//baike.baidu.com/item/%25E7%259F%25AD%25E8%25BD%25B4)**非常短，那么我们是不是可以把这个短轴视作没有？这样一个椭球就降维成了一个2维的**[**椭圆**](https://link.zhihu.com/?target=https%3A//baike.baidu.com/item/%25E6%25A4%25AD%25E5%259C%2586)。这就是PCA的原理。为了方便计算。首先需要对数据进行[归一化](https://www.zhihu.com/question/20467170)，让椭圆的圆心在原点\*\*。那么我们怎么知道哪个短轴非常短呢？看这个轴方向数据的方差。方差越小轴越短。也就是说方差越大证明这个维度的数据越重要即是主成分。\*\*方差越小这个维度越不重要（对应椭圆轴越短），那么这个维度可以舍弃。**方差最大的那个数据投影到第一个坐标（也叫做第一主成分），第二大投影到第二个维度的坐标，以此类推**。**看下面这张图，粉红色那条线就是第一主成分。可以看到当坐标轴转到与粉红色重合时，各点在第一坐标轴上投影点分布式最分散的（方差越大波动越大）**。注意：第二主成分必须要和第一主成分垂直（第二主成分是原先的点在第二坐标轴上投影后的点），而且它要占用下一个最大方差。当然下面这个图是二维的，将它降维当然只有一维。所以只有第一主成分，没有其他主成分。![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg'%20width='800'%20height='320'></svg>)

## 2. 逐步理解PCA的执行过程

## 2.1 归一化（让椭圆圆心移动到原点）

![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg'%20width='198'%20height='46'></svg>)

## 2.2 计算协方差矩阵

如果是一维的话[协方差](https://link.zhihu.com/?target=https%3A//baike.baidu.com/item/%25E5%258D%258F%25E6%2596%25B9%25E5%25B7%25AE)就是方差（不是矩阵）。多维的话就是协方差矩阵了。如果是一维的话协方差就是方差。协方差就是用来分析两个维度之间的相关性。协方差大于0则两个维度正相关，小于0则是负相关。等于0则是不相干。下面是三维的情况下协方差矩阵。注意Cov（a，b）= Cov（b，a），所以下面这个协方差矩阵是一个对称矩阵。**大致理解方差是协方差矩阵在一维情况下的特殊情况就可以了。然后可以看后面的了**。![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg'%20width='406'%20height='94'></svg>)![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg'%20width='825'%20height='61'></svg>)

## 2.3 计算协方差矩阵的特征值，将特征值从高到低排序，然后每个特征值对应一个特征向量。第k个特征向量与原先数据内积就是对应的第k个主成分

**假如原数据一共有10维，如果我想降到4维。那么就取前4大的特征值对应的特征向量。这4个特征向量每个特征向量都是10维的。然后用这个4个特征向量与原先数据点内积，得到4个数。所有的原数据点都这样计算后就得到了第一第二第三第四主成分**。这样就把10维降低到4维。（当然前面这个过程一般是用矩阵批量运算）

**那么怎么计算我保留了多少信息，扔掉了多少信息**？答：“计算保留的那4个特征值，占10个总特征值的比例即是保留了百分之几的信息”

**你的赞是我分享的动力**。

## 3. Python编程实践，2维降到1维

**学习算法建议最好不要逐行敲书上或者博客的代码，一定要自己把原理悟出来算法每一步做什么后按自己的思路去编程实现（这样学得最快）。**

**下面是两个效果图**![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg'%20width='557'%20height='420'></svg>)![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg'%20width='581'%20height='424'></svg>)

代码如下所示：

```
# -*- coding: utf-8 -*-
"""
@author: @Ai酱
"""
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,10,200) + np.random.rand(200)/5
y = 0.233 * x + np.random.rand(200)/3
# 归一化
x = (x - np.mean(x))/np.std(x)
y = (y - np.mean(y))/np.std(y)
#plt.scatter(x,y)
# 1. 计算协方差矩阵
cov_mat = np.cov(x,y)
# 2. 计算协方差矩阵的特征值
eigenvalues,eigenvectors = np.linalg.eig(cov_mat)
k = 1 # 降维后的目标维度
# 对特征值进行排序,取前k个
topk = np.argsort(eigenvalues)[0:k]
# 前k个最大的特征值对应的特征向量与原矩阵相乘
data = np.stack((x,y),axis=-1)
result = np.matmul(data,eigenvectors[topk].T)
plt.plot(result[:,0],result[:,0].shape[0]*[1],'.')#绘制一维图
```

**相关文章**：

[Ai酱：机器学习算法之k-means(k均值)Python代码实现](https://zhuanlan.zhihu.com/p/67042130)

[Ai酱：\[易懂机器学习\]KNN，k-Nearest Neighbor (k近邻算法）\[分类算法\]](https://zhuanlan.zhihu.com/p/66360783)

[Ai酱：\[易懂\]如何理解论文中的那些评估方法性能指标概念名词{召回率 ROC AUC 交叉验证}](https://zhuanlan.zhihu.com/p/65239221)

[Ai酱：{高中生能看懂的}再见香农，决策树的本质是什么，ID3决策树Python实实现逻辑异或功能](https://zhuanlan.zhihu.com/p/65161704)

[Ai酱：2个规则弄懂numpy的broadcast广播机制](https://zhuanlan.zhihu.com/p/60365398)

本文首发于：[挖掘商品关联性(2): FP-growth算法](https://link.zhihu.com/?target=https%3A//blog.csdn.net/varyshare/article/details/90636354)

[Ai酱：挖掘商品关联性(2): FP-growth算法](https://zhuanlan.zhihu.com/p/67378088)

参考文献：

\[1] [A step by step explanation of Principal Component Analysis](https://link.zhihu.com/?target=https%3A//towardsdatascience.com/a-step-by-step-explanation-of-principal-component-analysis-b836fb9c97e2)

首发于CSDN ：[通俗解释如何理解主成分分析PCA，Python实现PCA主成分分析2维降到1维](https://link.zhihu.com/?target=https%3A//blog.csdn.net/varyshare/article/details/90676580)
