程序员人工智能

无监督学习-线性方法|深度学习(李宏毅)(十七)

2021-01-20  本文已影响0人  酷酷的群

一、概述

无监督学习可以认为主要包括两种,一种是化繁为简(比如聚类和降维)和无中生有(比如生成)。化繁为简这种方式只有模型的输入,而无中生有这种方式只有模型的输出:

无监督学习

在本文中主要介绍一些聚类和降维的方法。

二、聚类

  1. K-means

K-means是一种无监督的聚类方法,通常我们有一些数据,需要分成多个类。这里有一个问题就是事先需要确定要聚成多少个类,类的个数不能太多也不能太少,极端地将数据聚成样本个数个类或者一个类都相当于没有进行聚类:

Clustering

假如我们有N个样本X=\left \{x^{1},\cdots ,x^{n},\cdots ,x^{N}\right \},需要聚成K个类,具体的算法如下:

①初始化聚类中心c^i,i=1,2,\cdots ,K(也就是从x^n中随机抽取K个样本)。
②重复如下步骤:
  for all x^n in X:b_{i}^{n}=\left\{\begin{matrix} 1,\; \; x^{n}\; is\; most\; close\; to\; c^{i}\\ 0,\; \; otherwise \end{matrix}\right.
  updating all c^{i}:c^{i}=\sum _{x^{n}}b_{i}^{n}x^{n}/\sum _{x^{n}}b_{i}^{n}

这里之所以使用从X抽取的K个样本来初始化聚类中心c^i,而不是随机初始化,是因为这样可以避免没有样本距离某聚类中心最近而导致更新c^i时分母为0

  1. Hierarchical Agglomerative Clustering(HAC)

HAC这种聚类方法首先根据样本相似度构建一棵二叉树,然后选择一个阈值来进行聚类。

如下图,首先在计算所有的样本pair的相似度,然后将相似度最高的两个样本合并起来(合并的方法可以是计算平均值),然后重复上述过程直至最终构建出整棵二叉树:

建树

构建出二叉树以后选择一个阈值,类似于在树上切一刀,下图展示了不同的阈值所对应的聚类结果:

聚类

三、降维

  1. 概述

在聚类的方法中每个样本必须被划分为一个类,而有时一个样本既可以属于这一类,也可能属于另一类,这种情况下我们需要样本的一个分布的表示,使用降维的方法可以做到这一点。

我们可以从另一个角度来考虑降维这种方法可能是有用的。如下图左边的3维的数据实际上可以使用2维的数据来表示(将左图螺旋状数据展平):

example

举另外一个例子,在MNIST数据集中每个数字用28\times 28的矩阵来表示,但是大多数28\times 28的图片都不是数字,也就是说使用28\times 28的矩阵是冗余的,随机初始化一张图片很难生成一个数字:

MNIST

在下图中的不同的3,事实上不需要使用28\times 28的矩阵的来表示,只需要记录其旋转的角度即可:

不同的3

上述例子说明将高维的样本降维到低维空间是有实际意义的。

如下图,降维的主要流程也就是找一个function来讲高维样本x降维到低维样本z

降维
  1. Feature Selection

降维的最简单的方法是Feature Selection。这种方法就是简单地删除某些维度,比如下图中可以把x_1这个维度拿掉:

Feature Selection

有时数据的任何一维都很重要,这时候Feature Selection的方法就不能用了,比如下面这种情况:

Feature Selection
  1. Principal Component Analysis

主成分分析(Principal Component Analysis,PCA)是一种降维的方法。PCA使用的降维function就是一个线性变换z=Wx。对于z的第一维z_{1}=w^{1}\cdot xw^{1}是矩阵W的第一行),可以认为z_{1}xw^{1}方向上的投影。这里要限制||w^{1}||_2=1,当w^{1}模为1w^{1}\cdot x就是投影的大小:

投影

以下图为例,如果要选择一个方向进行投影,我们需要选择投影后方差最大的方向(红色箭头的方向)进行投影,这样可以保留更多的数据的特征,也就是说我们希望z_{1}的方差越大越好:

数据

如果想要降维到二维,那么第二个维度z_{2}=w^{2}\cdot x,这里的w^{2}除了要限制||w^{2}||_2=1以外,还要使得w^{1}\cdot w^{2}=0。对x进行线性变换的过程其实也就是对坐标轴进行旋转的过程,w^{1}w^{2}的方向也就是旋转后的坐标轴的方向,坐标轴之间是正交的。最终得到的W=\begin{bmatrix} (w^{1})^{T}\\ (w^{2})^{T}\\ \vdots \end{bmatrix}是正交矩阵。

下面对w^{1}进行求解:

z_{1}=w^{1}\cdot x\\ \bar{z}_{1}=\frac{1}{N}\sum z_{1}=\frac{1}{N}\sum w^{1}\cdot x=w^{1}\cdot \frac{1}{N}\sum x=w^{1}\cdot \bar{x}\\ Var(z_{1})=\frac{1}{N}\sum _{z_{1}}(z_{1}-\bar{z}_{1})^{2}\\ =\frac{1}{N}\sum _{x}(w^{1}\cdot x-w^{1}\cdot \bar{x})^{2}\\ =\frac{1}{N}\sum _{x}(\underset{标量}{\underbrace{w^{1}\cdot (x-\bar{x})}})^{2}\\ =\frac{1}{N}\sum _{x}(w^{1})^{T}(x-\bar{x})(x-\bar{x})^{T}w^{1}\\ =(w^{1})^{T}[\frac{1}{N}\sum _{x}(x-\bar{x})(x-\bar{x})^{T}]w^{1}\\ =(w^{1})^{T}\underset{记作S}{\underbrace{Cov(x)}}w^{1}

也就是说求解w^{1}需要极大化(w^{1})^{T}Sw^{1},同时需要满足约束||w^{1}||_{2}=(w^{1})^{T}w^{1}=1,否则无解。协方差矩阵S是实对称矩阵,因此其是半正定的,特征值非负。

使用拉格朗日乘子法来求解上述约束优化问题,定义拉格朗日函数:

g(w^{1})=(w^{1})^{T}Sw^{1}-\alpha ((w^{1})^{T}w^{1}-1)

w^{1}求导并且令导数等于0可得:

Sw^{1}-\alpha w^{1}=0\\ \Rightarrow Sw^{1}=\alpha w^{1}\\ (因此\alpha 是特征值,w^{1}是特征向量)\\ \Rightarrow (w^{1})^{T}Sw^{1}=\alpha (w^{1})^{T}w^{1}=\alpha \\ (等式两边同时乘以(w^{1})^{T})

因此(w^{1})^{T}Sw^{1}的极大值就是S的特征值\alpha,选择S的最大的特征值(这个特征值记作\lambda _{1})对应的特征向量就得到w^{1}的解。

接下来求解w^{2},需要极大化(w^{2})^{T}Sw^{2},除了需要限制(w^{2})^{T}w^{2}=1以外,还需要满足(w^{2})^{T}w^{1}=0。因此构建拉格朗日函数如下:

g(w^{2})=(w^{2})^{T}Sw^{2}-\alpha ((w^{2})^{T}w^{2}-1)-\beta (2(w^{2})^{T}w^{1}-0)

w^{2}求导并且令导数等于0可得:

Sw^{2}-\alpha w^{2}-\beta w^{1}=0\\ (w^{1})^{T}Sw^{2}-\alpha \underset{=0}{\underbrace{(w^{1})^{T}w^{2}}}-\beta \underset{=1}{\underbrace{(w^{1})^{T}w^{1}}}=0

对于(w^{1})^{T}Sw^{2},可以做以下变换:

(w^{1})^{T}Sw^{2}=((w^{1})^{T}Sw^{2})^{T}\\ =(w^{2})^{T}S^{T}w^{1}\\ =(w^{2})^{T}Sw^{1}\\ =\lambda _{1}(w^{2})^{T}w^{1}\\ =0

代入结果可得\beta =0,因此w^{2}同样满足Sw^{2}=\alpha w^{2},所以w^{2}也是S的特征向量,但是w^{2}不能取最大特征值对应的特征向量,因为这样w^{2}就成了w^{1},不满足(w^{2})^{T}w^{1}=0,所以w^{2}只能取第二大特征值(记作\lambda _{2})对应的特征向量。

经过PCA处理后的数据z是去相关性的,也就是其不同的维度之间没有相关性,这可以体现在方差矩阵Cov(z)=D是对角矩阵上:

Cov(z)=\frac{1}{N}\sum (z-\bar{z})(z-\bar{z})^{T}\\ =WSW^{T}\\ =WS\begin{bmatrix} w^{1} & \cdots & w^{K} \end{bmatrix}\\ =W\begin{bmatrix} Sw^{1} & \cdots & Sw^{K} \end{bmatrix}\\ =W\begin{bmatrix} \lambda _{1}w^{1} & \cdots & \lambda _{K}w^{K} \end{bmatrix}\\ =\begin{bmatrix} \lambda _{1}Ww^{1} & \cdots & \lambda _{K}Ww^{K} \end{bmatrix}\\ =\begin{bmatrix} \lambda _{1}e_{1} & \cdots & \lambda _{K}e_{K} \end{bmatrix}\\ =D

一组数据中的每个样本可以看做由多个basic component u^{1},u^{2},u^{3},u^{4},u^{5},\cdots组成,这里我们假设总共有K个basic component ,也就是说要降维到K维。类似的就像一张数字图片可以由多种笔画组合而成:

数字的构成

这种想法用公式来表达就是x-\bar{x}\approx c_{1}u^{1}+c_{2}u^{2}+\cdots +c_{K}u^{K}=\hat{x},则\begin{bmatrix} c_{1}\\ c_{2}\\ \vdots \\ c_{K} \end{bmatrix}就可以来表示x,也就是x降维后的数据。

在求解时我们希望x-\bar{x}\hat{x}越接近越好,也就是要最小化重构代价||(x-\bar{x})-\hat{x}||_{2},具体的:

L=\underset{u^{1},\cdots ,u^{K}}{min}\sum \begin{Vmatrix} (x-\bar{x})-(\sum _{k=1}^{K}c_{k}u^{k}) \end{Vmatrix}_{2}

在PCA中有z=Wx,具体的:

\begin{bmatrix} z_{1}\\ z_{2}\\ \vdots \\ z_{K} \end{bmatrix}=\begin{bmatrix} (w^{1})^{T}\\ (w^{2})^{T}\\ \vdots \\ (w^{K})^{T} \end{bmatrix}x

最小化重构代价L得到的u^{1},u^{2},\cdots ,u^{K}就是这里的w^{1},w^{2},\cdots ,w^{K}

每一个样本都可以写成用u^{1},u^{2},\cdots ,u^{K}来表示的形式:

x^{1}-\bar{x}\approx c_{1}^{1}u^{1}+c_{2}^{1}u^{2}+\cdots +c_{K}^{1}u^{K}\\ x^{2}-\bar{x}\approx c_{1}^{2}u^{1}+c_{2}^{2}u^{2}+\cdots +c_{K}^{2}u^{K}\\ x^{3}-\bar{x}\approx c_{1}^{3}u^{1}+c_{2}^{3}u^{2}+\cdots +c_{K}^{3}u^{K}\\ \vdots

将所有的样本集合起来就可以写成矩阵相乘的形式:

矩阵形式

将上图中右边的两个矩阵改写成类似奇异值分解的形式,下图中U对应上图中等式右边第一个矩阵,\Sigma \times V对应上图中等式右边第二个矩阵:

奇异值分解的形式

然后进行极小化重构代价求解就可以解得u^{1},u^{2},\cdots ,u^{K}就是对XX^T进行特征值分解的前K个特征值对应的特征向量。也就是说对X进行奇异值分解,其左奇异向量就是我们要找的主成分。

另一篇有关PCA推导的文章:主成分分析|机器学习推导系列(五)

PCA求解的方式可以是最小化\hat{x}=\sum_{i=1}^{K}c_{k}w^{k}x- \bar{x}之间的重构代价,这里的c_{k}也就是x- \bar{x}w^{k}之间的内积,即c_{k}=(x- \bar{x})\cdot w^{k}。这个过程可以描述为以下神经网络(假设K=2):

AutoEncoder

这个神经网络训练的方式就是使得网络的输入x- \bar{x}\hat{x}越接近越好,使用梯度下降来求解。需要注意的是,PCA的方法是可以通过奇异值分解或者拉格朗日乘子法求得解析解的,所得解是一些彼此正交的向量,而神经网络使用梯度下降的方法求得的解一般不会正好是解析解,因此重构损失一般会比解析解对应的重构损失大一些。

首先PCA是无监督的,举例来说在下图中对数据进行PCA降维的话将会把数据投影到箭头所指的方向上:

PCA

而加入这些数据是两个类别,那么两个类别的数据就会混合到一起。对于多类别的数据,可以使用另一种降维方法,叫做线性判别分析(Linear Discriminant Analysis,LDA),参考链接:线性分类|机器学习推导系列(四)。这种方法会按照下图箭头方向进行投影:

LDA

另外一点是PCA是线性的,并非任何数据分布都能使用线性方法来处理,比如下图数据:

数据

这种类型的数据最好能够将其展开,如果使用PCA则会得到以下结果:

PCA

四、应用

  1. 使用PCA分析宝可梦数据

假设一只宝可梦的数据样本包含六个维度,现在要将所有的数据进行PCA的降维,降到多少个维度可以通过比较数据的方差矩阵的特征值来得到,首先计算每个特征值的占比:

\frac{\lambda _{i}}{\lambda _{1}+\lambda _{2}+\lambda _{3}+\lambda _{4}+\lambda _{5}+\lambda _{6}}

得到结果如下表:

占比

选择占比较大的前几个即可。降维后得到的主成分如下图:

主成分
  1. 对图片进行PCA

下面展示了分别对数字和人脸图片进行PCA的结果,都是提取了30个主成分:

数字 人脸

这里的数字的主成分看起来不像是笔画,人脸的主成分看起来也是完整的人脸,这是因为将这些主成分进行线性组合时的权重可能是正的也可能是负的。如果想让得到的主成分是笔画或者五官这样的图片,可以使用非负矩阵分解(Non-negative Matrix Factorization,NMF)这种方法,这种方法会限制权重和主成分都是非负的,最终得到的效果如下:

数字 人脸
  1. 矩阵分解

下图展示了A、B、C、D、E五个阿宅购买公仔的情况:

数据

下面使用矩阵分解(Matrix Factorization)来解释上面的数据。假设每个阿宅有一个隐向量来表示他对某种属性公仔的喜好(用r^{A},r^{B},r^{C},r^{D},r^{E}来表示),每个公仔也有一个隐向量来表示该公仔的属性(用r^{1},r^{2},r^{3},r^{4}来表示),这里假设这些隐向量维度是2,喜好隐向量与属性隐向量的点积代表了这个阿宅会购买这个公仔的数量:

隐向量

假设数据矩阵为XX是由隐变量的点积组成的:

数据

可以使用SVD的方式来求解:

SVD

如果X中某些位置的数据不知道,如下图:

缺失数据

可以使用梯度下降的方法来求解隐变量,损失函数如下:

L=\sum _{i,j}(r^{i}\cdot r^{j}-n_{ij})^{2}

根据结果可以分析隐变量代表的含义,比如通过下图结果可以认为隐变量第一维是天然呆属性,第二维是傲娇属性:

结果

可以使用解得的结果来填充数据:

填充数据

这个模型还可以更精致一点,比如我们可以考虑阿宅或者公仔的一些其他属性,现在做以下变动:

r^{A}\cdot r^{1}\approx 5\Rightarrow r^{A}\cdot r^{1}+b_{A}+b_{1}\approx 5

上式中b_{A}可以认为代表阿宅A购买公仔的意愿强度,而b_{1}可以代表公仔1的受欢迎程度,然后损失函数就可以使用:

L=\sum _{i,j}(r^{i}\cdot r^{j}+b_{i}+b_{j}-n_{ij})^{2}

也可以为上式添加正则项。

上述技术通常会被用在推荐系统中。

  1. 使用矩阵分析来做话题分析

将上述矩阵分析的技术用在话题分析上的话,就叫做潜在语义分析(Latent Semantic Analysis,LSA)。举例来说,下表表示了某些词在语料库的每个文档中的出现情况,表中的数据可以是词的tf(term frequency),也可以是词的tf-idf:

数据

将上述数据矩阵做分解,得到的隐变量的每一维度就代表一个话题,该维度的数值就表明该文章倾向于该话题的程度。

上一篇 下一篇

猜你喜欢

热点阅读