关于机器学习:图解机器学习-降维算法详解

10次阅读

共计 9209 个字符,预计需要花费 24 分钟才能阅读完成。

作者:韩信子 @ShowMeAI
教程地址:http://www.showmeai.tech/tutorials/34
本文地址:http://www.showmeai.tech/article-detail/198
申明:版权所有,转载请分割平台与作者并注明出处

引言

在互联网大数据场景下,咱们常常须要面对高维数据,在对这些数据做剖析和可视化的时候,咱们通常会面对「高维」这个阻碍。在数据挖掘和建模的过程中,高维数据也同样带来大的计算量,占据更多的资源,而且许多变量之间可能存在相关性,从而减少了剖析与建模的复杂性。

咱们心愿找到一种办法,在对数据实现降维「压缩」的同时,尽量减少信息损失。因为各变量之间存在肯定的相干关系,因而能够思考将关系严密的变量变成尽可能少的新变量,使这些新变量是两两不相干的,那么就能够用较少的综合指标别离代表存在于各个变量中的各类信息。机器学习中的降维算法就是这样的一类算法。

主成分剖析(Principal Components Analysis,简称 PCA)是最重要的数据降维办法之一。在数据压缩打消冗余和数据乐音打消等畛域都有宽泛的利用。本篇咱们来开展解说一下这个算法。

(本篇降维算法局部内容波及到机器学习基础知识,没有先序常识储备的宝宝能够查看 ShowMeAI 的文章 图解机器学习 | 机器学习基础知识。

1.PCA 与最大可分性

对于 \(X = \begin {bmatrix} x_1 \ x_2 \ … \ x_n \end{bmatrix}\),\(X \in R^n\)。咱们心愿 \(X\) 从 \(n\) 维降到 \(n^{‘}\) 维,同时心愿信息损失起码。比方,从 \(n = 2\) 维降到 \(n^{‘} = 1\)。

左图为一个典型的例子,如果咱们要对一系列人的样本进行数据降维(每个样本蕴含「身高」「体重」两个维度)。右图咱们既能够降维到第一主成分轴,也能够降维到第二主成分轴。

哪个主成分轴更优呢?从直观感觉上,咱们会认为「第一主成分轴」优于「第二主成分轴」,因为它比拟大程度保留了数据之间的辨别性(保留大部分信息)。

对 PCA 算法而言,咱们心愿找到小于原数据维度的若干个投影坐标方向,把数据投影在这些方向,取得压缩的信息示意。上面咱们就一步一步来推导一下 PCA 算法原理。

2. 基变换

先来温习一点点数学知识。咱们晓得要取得原始数据 \(X\) 新的示意空间 \(Y\),最简略的办法是对原始数据进行线性变换(也叫做基变换)\(Y = PX\)。其中,\(X\) 是原始样本,\(P\) 是基向量,\(Y\) 是新表白。

数学表白为:

$$
\begin{bmatrix} p_1 \\ p_2 \\ \vdots \\ p_r \end{bmatrix}_{r \times n}
\begin{bmatrix} x_1 & x_2 & \cdots & x_m \end{bmatrix}_{n \times m} =
\begin{bmatrix} p_1 x_1 & p_1 x_2 & \cdots & p_1 x_m \\ p_2 x_1 & p_2 x_2 & \cdots & p_2 x_m \\ \vdots & \vdots & \ddots & \vdots \\ p_r x_1 & p_r x_2 & \cdots & p_r x_m\end{bmatrix}_{r\times m}
$$

  • 其中 \(p_i\) 是行向量,示意第 \(i\) 个基;
  • \(x_j\) 是一个列向量,示意第 \(j\) 个原始数据记录。

当 \(r < n\) 时,即「基的维度 < 数据维度」时,可达到降维的目标,即 \(X \in R^{n \times m} \rightarrow Y \in R^{r \times m}\)。

以直角坐标系下的点 \((3,2)\) 为例,要把点 \((3,2)\) 变换为新基上的坐标,就是用 \((3,2)\) 与第一个基做内积运算,作为第一个新的坐标重量,而后用 \((3,2)\) 与第二个基做内积运算,作为第二个新坐标的重量。

上述变动,在线性代数里,咱们能够用矩阵相乘的模式简洁的来示意:

$$
\begin{bmatrix}\frac{1}{\sqrt 2} & \frac{1}{\sqrt 2} \\ -\frac{1}{\sqrt 2} & \frac{1}{\sqrt 2} \end{bmatrix} \begin{bmatrix} 3 \\ 2\end{bmatrix} = \begin{bmatrix} \frac{5}{\sqrt 2} \\ – \frac{1}{\sqrt 2} \end{bmatrix}
$$

再略微推广一下,如果咱们有 m 个二维向量,只有将二维向量按列排成一个两行 m 列矩阵,而后用「基矩阵」乘以这个矩阵,就失去了所有这些向量在新基下的值。例如(1,1)、(2,2)、(3,3),想变换到方才那组基上,能够如下这样示意:

$$
\begin{bmatrix}\frac{1}{\sqrt 2} & \frac{1}{\sqrt 2} \\ -\frac{1}{\sqrt 2} & \frac{1}{\sqrt 2} \end{bmatrix} \begin{bmatrix} 1 & 2 & 3 \\ 1 & 2 & 3\end{bmatrix} = \begin{bmatrix} 2\sqrt 2 & 4\sqrt2 & 6\sqrt2 \\ 0 & 0 & 0 \end{bmatrix}
$$

3. 方差

在本文的开始局部,咱们提到了,降维的目标是心愿压缩数据但信息损失起码,也就是说,咱们心愿投影后的数据尽可能扩散开。在数学上,这种扩散水平咱们用「方差」来表白,方差越大,数据越扩散。

  • 定义方差 \(Var\):对于繁多随机变量 \(a\),\(Var(a) = \frac{1}{m} \sum_{i = 1}^m (a_i – \mu)^2\)
  • 对数据做去中心化(不便前面操作):\(Var(a) = \frac{1}{m} \sum_{i = 1}^m a_i ^2\)

    \(Var(a)\) 示意 \(a\) 的取值与其数学冀望之间的偏离水平。若 \(Var(a)\) 较小,意味着 \(a\) 的取值次要集中在冀望 \(\mu\) 也就是 \(E(a)\) )的左近;反之,若 \(Var(a)\) 较大,意味着 \(a\) 的取值比拟扩散。

咱们来看一个具体的例子。假如咱们 5 个样本数据,别离是 \(x_1 = \begin{bmatrix} 1 \ 1 \end{bmatrix}\)、\(x_2 = \begin{bmatrix} 1 \ 3\end{bmatrix}\)、\(x_3 = \begin{bmatrix} 2 \ 3\end{bmatrix}\)、\(x_4 = \begin{bmatrix} 4 \ 4\end{bmatrix}\)、\(x_5 = \begin{bmatrix} 2 \ 4 \end{bmatrix}\),将它们示意成矩阵模式:\(X = \begin{bmatrix} 1 & 1 & 2 & 4 & 2 \ 1 & 3 & 3 & 4 & 4 \end {bmatrix}\)。

为了后续解决不便,咱们首先将每个字段内所有值都减去字段均值,其后果是将每个字段都变为均值为 0。

咱们看下面的数据,设第一个特色为 \(a\),第二个特色为 \(b\),则某个样本能够写作 \(x_i = \begin{bmatrix} a \ b \end {bmatrix}\)
且特色 \(a\) 的均值为 2,特色 \(b\) 的均值为 3。所以,变换后

$$
X = \begin{bmatrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{bmatrix}
$$

$$
Var(a) = \frac{\sqrt 6} {5}
$$

$$
Var(b) = \frac{\sqrt 6} {5}
$$

4. 协方差

协方差(Covariance)在概率和统计学中用于掂量两个变量的总体误差。比方对于二维随机变量 \(x_i = \begin{bmatrix} a \ b \end{bmatrix}\),特色 \(a、b\) 除了本身的数学冀望和方差,还须要探讨 \(a、b\) 之间相互关系的数学特色。

定义协方差 \(Cov\):

$$
Cov(a, b) = \frac{1}{m}\sum_{i = 1}^m a_i b_i
$$

当 \(Cov(a, b) = 0\) 时,变量 \(a、b\) 齐全独立,这也是咱们心愿达到的优化指标。方差是协方差的一种非凡状况,即当两个变量是雷同的状况 \(Cov(a, a) = Var(a)\)。

5. 协方差矩阵

对于二维随机变量 \(x_i = \begin{bmatrix} a \ b \end {bmatrix}\),定义协方差矩阵 \(C = \begin{bmatrix} Var(a) & Cov(a, b) \ Cov(b, a) &Var(b)\end{bmatrix}\)。

对于 \(n\) 维随机变量

$$
x_{i}=\left[\begin{array}{c}
x_{1} \\
x_{2} \\
\vdots \\
x_{n}
\end{array}\right]
$$

$$
C = \begin{bmatrix} Var(x_1) & Cov(x_1, x_2) &\cdots & Cov(x_1, x_n)\\ Cov(x_2, x_1)& Var(x_2) & \cdots & Cov(x_1, x_n)\\ \vdots & \vdots & \ddots & \vdots \\ Cov(x_n, x_1) & Cov(x_n, x_2) & \cdots &Var(x_n) \end{bmatrix}
$$

咱们能够看到,协方差矩阵是 \(n\) 行 \(n\) 列的对称矩阵,主对角线上是方差,而协对角线上是协方差。

咱们再来用一个示例对应解说一下。还是同样的 5 个样本数据

  • \(x_1 = \begin{bmatrix} 1 \ 1 \end{bmatrix}\)
  • \(x_2 = \begin{bmatrix} 1 \ 3\end{bmatrix}\)
  • \(x_3 = \begin{bmatrix} 2 \ 3\end{bmatrix}\)
  • \(x_4 = \begin{bmatrix} 4 \ 4\end{bmatrix}\)
  • \(x_5 = \begin{bmatrix} 2 \ 4 \end{bmatrix}\)

去中心化后示意成矩阵

$$
X = \begin{bmatrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{bmatrix}
$$

那如果有 \(m\) 个样本的话,\(X =\begin{bmatrix} a_1 & a_2 & \cdots &a_m \ b_1 & b_2 & \cdots & b_m\end{bmatrix}\)。对 \(X\) 做一些变换,用 \(X\) 乘以 \(X\) 的转置,并乘上系数 \(1/m\):

$$
\frac{1}{m}XX^T = \frac{1}{m}\begin{bmatrix} a_1 & a_2 & \cdots &a_m \\ b_1 & b_2 & \cdots & b_m\end{bmatrix}\begin{bmatrix} a_1 & b_1 \\ a_2 & b_2 \\ \vdots & \vdots \\ a_m &b_m \end{bmatrix}== \begin{bmatrix} \frac{1}{m} \sum_{i = 1}^m a_i ^2 & \frac{1}{m}\sum_{i = 1}^m a_i b_i \\ \frac{1}{m}\sum_{i = 1}^m a_i b_i& \frac{1}{m} \sum_{i = 1}^m b_i^2 \end{bmatrix}
$$

这正是协方差矩阵!咱们演绎失去:设咱们有 \(m\) 个 \(n\) 维数据记录,将其按列排成 \(n\) 乘 \(m\) 的矩阵 \(X\),设 \(C = \frac{1}{m}XX^T\),则 \(C\) 是一个对称矩阵,其对角线别离个各个特色的方差,而第 \(i\) 行 \(j\) 列和 \(j\) 行 \(i\) 列元素雷同,示意 \(i\) 和 \(j\) 两个特色之间的协方差。

6. 协方差矩阵对角化

再回到咱们的场景和指标:

  • 当初咱们有 \(m\) 个样本数据,每个样本有 \(n\) 个特色,那么设这些原始数据为 \(X\),\(X\) 为 \(n\) 行 \(m\) 列的矩阵。
  • 想要找到一个基 \(P\),使 \(Y_{r \times m} = P_{r \times n}X_{n \times m}\),其中 \(r<n \),达到降维的目标。

设 \(X\) 的协方差矩阵为 \(C\),\(Y\) 的协方差矩阵为 \(D\),且 \(Y = PX\)。

  • 咱们的目标变为:对原始数据 \(X\) 做 PCA 后,失去的 \(Y\) 的协方差矩阵 \(D\) 的各个方向方差最大,协方差为 0。

那么 \(C\) 与 \(D\) 是什么关系呢?

$$
\begin{aligned}
D & =\frac{1}{m} Y Y^{T} \\
& =\frac{1}{m}(P X)(P X)^{T} \\
& =\frac{1}{m} P X X^{T} P^{T} \\
& =\frac{1}{m} P\left(X X^{T}\right) P^{T} \\
& =P C P^{T} \\
& =P\left[\begin{array}{cc}
\frac{1}{m} \sum_{i=1}^{m} a_{i}^{2} & \frac{1}{m} \sum_{i=1}^{m} a_{i} b_{i} \\
\frac{1}{m} \sum_{i=1}^{m} a_{i} b_{i} & \frac{1}{m} \sum_{i=1}^{m} b_{i}^{2}
\end{array}\right] P^{T}
\end{aligned}
$$

咱们发现,要找的 \(P\) 不是别的,而是能让原始协方差矩阵对角化的 \(P\)。

换句话说,优化指标变成了寻找一个矩阵 \(P\),满足 \(PCP^𝖳\) 是一个对角矩阵,并且对角元素按从大到小顺次排列,那么 P 的前 K 行就是要寻找的基,用 P 的前 K 行组成的矩阵乘以 X 就使得 X 从 N 维降到了 K 维并满足上述优化条件。

最终咱们聚焦在协方差矩阵对角化这个问题上。

由上文晓得,协方差矩阵 \(C\) 是一个是对称矩阵,在线性代数上,实对称矩阵有一系列十分好的性质:

1)实对称矩阵不同特征值对应的特征向量必然正交。

2)设特征向量 \(\lambda\) 重数为 \(r\),则必然存在 \(r\) 个线性无关的特征向量对应于 \(\lambda\),因而能够将这 \(r\) 个特征向量单位正交化。

由下面两条可知,一个 \(n\) 行 \(n\) 列的实对称矩阵肯定能够找到 \(n\) 个单位正交特征向量,设这 \(n\) 个特征向量为 \(e_1,e_2,⋯,e_n\),咱们将其按列组成矩阵:

$$
E = \begin{bmatrix} e_1 & e_2 & \cdots \ e_n\end{bmatrix}
$$

则对协方差矩阵 \(C\) 有如下结论:

$$
E^T C E = \Lambda = \begin{bmatrix} \lambda_1 \\ & \lambda_2 \\ &&\ddots \\ &&&\lambda_n\end {bmatrix}
$$

其中 \(\Lambda\) 为对角矩阵,其对角元素为各特征向量对应的特征值(可能有反复)。
联合下面的公式:

$$
D = PCP^T
$$

其中,\(D\) 为对角矩阵,咱们能够失去:

$$
P = E^T
$$

\(P\) 是协方差矩阵 $C$ 的特征向量单位化后按行排列出的矩阵,其中每一行都是 \(C\) 的一个特征向量。如果设 \(P\) 依照 \(\Lambda\) 中特征值的从大到小,将特征向量从上到下排列,则用 \(P\) 的前 \(K\) $K$ 行组成的矩阵乘以原始数据矩阵 \(X\),就失去了咱们须要的降维后的数据矩阵 \(Y\)。

7.PCA 算法

总结一下 PCA 的算法步骤:

设有 \(m\) 条 \(n\) 维数据。

1)将原始数据按列组成 \(n\) 行 \(m\) 列矩阵 \(X\)

2)将 \(X\) 的每一行(代表一个特色)进行零均值化,即减去这一行的均值

3)求出协方差矩阵 \(C=\frac{1}{m}XX^𝖳\)

4)求出协方差矩阵 \(C\) 的特征值及对应的特征向量

5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 \(k\) 行组成矩阵 \(P\)

6)\(Y=PX\) 即为降维到 \(k\) 维后的数据

8.PCA 代码实际

咱们这里间接应用 python 机器学习工具库 scikit-learn 来给大家演示 PCA 算法利用(相干常识速查能够查看 ShowMeAI 文章 AI 建模工具速查 |Scikit-learn 使用指南),sklearn 工具库中与 PCA 相干的类都在 sklearn.decomposition 包里,最罕用的 PCA 类就是 sklearn.decomposition.PCA。

1)参数介绍

sklearn 中的 PCA 类应用简略,根本无需调参,个别只须要指定须要降维到的维度,或者降维后的主成分的方差和占原始维度所有特色方差和的比例阈值就能够了。

上面是 sklearn.decomposition.PCA 的主要参数介绍:

  • n_components:PCA 降维后的特色维度数目。
  • whiten:是否进行白化。所谓白化,就是对降维后的数据的每个特色进行归一化,让方差都为 1,默认值是 False,即不进行白化。
  • svd_solver:奇怪值合成 SVD 的办法,有 4 个能够抉择的值:{‘auto’,‘full’,‘arpack’,‘randomized’}。

除上述输出参数,还有两个 PCA 类的成员属性也很重要:

  • explained_variance_,它代表降维后的各主成分的方差值。
  • explained_variance_ratio_,它代表降维后的各主成分的方差值占总方差值的比例。

2)代码实例

# 构建数据样本并可视化

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
from sklearn.datasets 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='x')

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

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.78521638 0.03272613 0.03202212]

能够看出投影后三个特色维度的方差比例大概为 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.78521638 0.03272613]

这个后果其实能够意料,因为下面三个投影后的特色维度的方差别离为:[3.78521638 0.03272613],投影到二维后抉择的必定是前两个特色,而摈弃第三个特色。为了有个直观的意识,咱们看看此时转化后的数据分布,代码如下:

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

从上图能够看出,降维后的数据仍然分明可见之前三维图中的 4 个簇。当初咱们不间接指定降维的维度,而指定降维后的主成分方差和比例,来试验一下。

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

咱们指定了主成分至多占 90%,输入如下:

[0.98318212]
[3.78521638]
1

可见只有第一个投影特色被保留。这也很好了解,咱们的第一个主成分占投影特色的方差比例高达 98%。只抉择这一个特色维度便能够满足 90% 的阈值。咱们当初抉择阈值 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.78521638 0.03272613]
2

这个后果也很好了解,因为咱们第一个主成分占了 98.3% 的方差比例,第二个主成分占了 0.8% 的方差比例,两者一起能够满足咱们的阈值。最初咱们看看让 MLE 算法本人抉择降维维度的成果,代码如下:

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

输入后果如下:

[0.98318212]
[3.78521638]
1

可见因为咱们的数据的第一个投影特色的方差占比高达 98.3%,MLE 算法只保留了咱们的第一个特色。

更多无监督学习的算法模型总结能够查看 ShowMeAI 的文章 AI 常识技能速查 | 机器学习 - 无监督学习。

参考链接

  • 用 scikit-learn 学习主成分剖析(PCA)
  • 机器学习之 PCA(主成分剖析)

ShowMeAI 相干文章举荐

  • 1. 机器学习基础知识
  • 2. 模型评估办法与准则
  • 3.KNN 算法及其利用
  • 4. 逻辑回归算法详解
  • 5. 奢侈贝叶斯算法详解
  • 6. 决策树模型详解
  • 7. 随机森林分类模型详解
  • 8. 回归树模型详解
  • 9.GBDT 模型详解
  • 10.XGBoost 模型最全解析
  • 11.LightGBM 模型详解
  • 12. 反对向量机模型详解
  • 13. 聚类算法详解
  • 14.PCA 降维算法详解

ShowMeAI 系列教程举荐

  • 图解 Python 编程:从入门到精通系列教程
  • 图解数据分析:从入门到精通系列教程
  • 图解 AI 数学根底:从入门到精通系列教程
  • 图解大数据技术:从入门到精通系列教程
  • 图解机器学习算法:从入门到精通系列教程

正文完
 0