机器学习笔记3
Note:字母说明
-
m表示数据集的大小;
-
n表示参数\(\theta\)的个数;
-
\(X_i^j\)表示第i个数据的第j个参数;
16. Clustering
16.1 Unsupervised learning introduction
无监督学习其实已经在[前面](#3. Unsupervised Learning(无监督学习))简单地讲过了,其实无监督学习还是需要与监督学习进行对比来作为了解。
监督学习是将数据进行标记,也就是我们常说的打标签:
但是unsupervised learning的数据集是没有标签的,目标就是在这些数据集中找到规律能够分类。
unsupervised learning的一种代表算法就是——clustering。
聚类的应用有:
16.2 K-means algorithm
k聚类算法是现在应用最广泛的非监督学习算法的代表。
那么接下来就大体上讲一讲如何k-means是如何实现的。
- 假设我们要对下面的数据划分为2个cluster:
- 那么先随机取两个点(至于是怎么随机先不用考虑),用于表示两个cluster的中心点:
- 具体来说就是对于整个数据,靠近我们随机选择的两个数据中心点(红色的叉号和蓝色的叉号),就会被认为是同一个cluster ,那么在图像上表示的效果就是颜色变成一致的:

因为两个中心点是我们随机选取的,并非是真正的中心点,因此需要用到迭代操作,我们取所有当前属于同一个cluster的平均值(这里所说的平均值是表示每个数据所属中心点的平均值,具体会再下面用伪代码表示)作为新的cluster的中心坐标。那么更新的效果如下:

那么这样就算完成了一次更新,接下来就是重复这样的操作:

此时便可以说是完成了聚类所要实现的效果。
那么用代码来说明就是:
其中\(x^i\)是一个n维向量,且不包含\(x_0=1\)这一项。

下面这一步,可以称为k-means的第一步——簇分配部分:

其中\(c^i\)存储的是当前\(x^i\)的距离最近的\(u_k\)的下标,即\(c^i = min||x^i-u_k||^2\);
下面这一步成为k-means的第二步——移动簇类中心部分:

\(u_k\)需要更新,假设\(u_2\)包含了\(x^1,x^2,x^5,x^9\)这几个点,其中\(c^1=2,c^2=2,c^5=2,c^9=2\),那么\(u_2=\frac{1}{4}(2+2+2+2)=2\).
以上就是k-means算法的主要过程。
当然我们给出的例子太过于理想化,就是说,很容易可以看出有几个cluster,比如下图明显就是可以分为3个cluster:
但是实际情况下要更加复杂,比如要根据身高height和weight来划分三个衣服的尺寸,那么效果就是如下:
16.3 Optimization objective
在监督学习中,有需要优化的目标函数,比如cost function,同样地在unsupervised learning中也有需要优化的目标函数,通过了解这个目标函数可以让我们很好地了解在debug的过程中确保K-means的正常运行,同时,也是最重要的一点就是知道该怎么运用k-means来实现更好地cluster的分类。
这次需要引入3个变量(前两个已经在上一节中讲到了),这里再重申一次:

- \(c^{(i)}\)表示\(x^{(i)}\)所属于哪个簇的下标;
- \(u_k\)表示第k个中心簇类的中心位置;
- \(u_{c^{(i)}}\)表示\(x^{(i)}\)所属于哪个簇的中心坐标;
其实这三个参数之间的关系就是\(u_{c^{(i)}}=u_k,c^{(i)}=k\);
那么就可以得出优化目标optimization objective(这个代价函数有时也称为distortion cost function失真函数):
接下来就是简单讲讲这个东西是怎么用的,还是回到我们一开始定义的K-means伪代码中:
下图这一部分称为簇分配部分——具体来说就是将每一个数据点分配给适合它的簇中心,那么何谓”合适“呢?
就是最小化我们定义的\(J(c^{(1)},...,c^{m};u_1,...,u_k)\)中的\(c^{(i)}\)部分,具体来说就是\(u_k\)是固定的,因此只需要考虑\(c^i\)是属于哪一个簇的。

下图这一部分称为移动簇中心——具体来说就是最小化我们定义的\(J(c^{(1)},...,c^{m};u_1,...,u_k)\)中的\(u_i\)部分(其实本质上是用了平均值来更新的,只是在逻辑上表示的时候是看起来最小化了\(u_i\))。
16.4 Random initialization
这一节主要是来讲解如何选择k,才能避免陷入局部最优的情况:
有一种使用很多值得推荐的方法, 方法如下:
- Should have K < m;
- Randomly pick K training examples;
- Set u1,..., uk equal to these K examples;
假设在下面的例子中,取k=2,那么最好的效果如下图所示:

但是呢,因为是随机的原因,肯定会导致不确定的结果,便如下图所示:

因此不同的随机化结果,就有可能导致不同的分类结果,具体来说就是k-means会落在局部最优的位置。
所谓的局部最优解就是失真函数不能很好的进行最小化。
那么如何解决这个问题呢?——多次随机化k的位置;
16.5 Choosing the number of cluster
对于这个问题,目前来说是没有什么有效或者说是自动化的方法来确定k的准确值的,通常的方式就是通过图像的观察或者损失函数的输出来优化确定的。算是一种手动调整的方法。
为什么说很难确定k的值呢,因为现实情况下数据会表现出ambiguous情况,比如下面这个:


你可以认为是4个cluster,也可以认为是2个cluster,因此很难定夺。
当人们讨论k值的选择时候,会引入一个讲到一个方法——Elbow method。
通过上图可以看出,当出现左边的效果图的时候,可以认为k=3的时候最好,但是如果得到的是右边的效果图,就很难看出哪个点是好的了,因此这个方法也并非好用,也不能将其认为是唯一的办法。
那么最好的办法就是在分类之前对这个组数据有一个大体的划分目标。
17. Dimensionality Reduction
这一大节主要来讲解什么Unsupervised learning的另外一种算法——降维。
17.1 Motivation I:Data Compression
降维的一个应用——数据压缩。
数据压缩不仅可以降低存储空间,还可以进一步加速算法的运行。
先说一下什么是降维。
假设有一组数据,数据包含两个features,x1(表示长度cm)和x2(表示长度inches),在图像中表示如下图所示:

可以发现x1与x2是大约呈现出一种关系——线性关系,因此可以认为这两个features能够被同一个代替——也就是说x1和x2出现了数据冗余的现象。
那么我们便可以将这些数据降维表示——在一维层面上表示如下:

这样的好处就是,原来数据x是一个二维数组,即\(x=\begin{bmatrix} x_1\\ x_2 \end{bmatrix}\),但是现在对其降维表示,可以用一个一维数组进行表示了,即\(x=[z_1]\)。很显然,数据的存储空间得到了压缩,而且计算量也降低了一半。
同样地,在三维的空间中,也是可以被压缩的,前提是数据之间要有一定的相关性,比如下图所示的数据在三维空间中的表示效果:
可以发现数据是可以被压缩在一个平面中进行表示的,由原来的x1、x2、x3进行表示的数据,现在可以用z1和z2进行表示,在二维平面中表示是效果如下:

综上可以看出数据压缩的应用以及如何被压缩的。
17.2 Motivation II:Data Visualization
这一节主要来讲解降维的第二个应用——可视化数据。
比如:

对于一个50维的数据是很难画出其效果图的,那么还是需要想着进行降维操作,那么比较好的一个办法就是用一个新的特征来表示这50个特征:
其中z1和z2是没有很好的物理意义的,需要搞清楚的是新的特征大致意味着是什么意思,将z1和z2在二维平面中画出的效果如下图所示:
因为讲到要搞清楚新的相邻大体上是什么意思,因此我们不妨设z1表示国家GDP总和,z2表示人均GDP,此时就可以很好地表示出各个国家的情况了。
17.3 Principal Component Analysis
17.3.1 what's the PCA
在降维中一个最常用最流行的算法即是PCA,那么PCA是什么呢?
PCA就是一种最优化的策略,比如前面讲到将2维数据降低到一维,那么如何找到那个合适的直线呢,用图像化来表示就是如下图:

上图中蓝色的线段(可以理解成数据点到线段的距离)被称为是projection error,那么PCA要做的就是最小化每一个projection error的平方加起来的和,用公式表示就是\(min \frac{1}{m} \sum_{i=1}^m||x^i-x^i_{projection}||^2\)

那么推广到一般化的表示就是:
Reduce from n-dimension to k-dimension :Find k direction,\(u^1,u^2,...,u^k\)(vectors \(u^i\) is n-dimension) onto which to project the data , so as to minimize the projection error.
那比如说一个三维点云,降到二维的话,就是需要找到两个方向的3维向量,其可以确定了一个平面,然后让projection error最小化之后得到的平面就是我们需要的结果。

那么在2维降到1的时候,有没有发现降维操作比较像linear regression呢,它们之间是不是有什么关系呢?看下图中的定义:

可以发现两者的定义是不同的,尽管其在表面上很相似,但是本质上是两种算法的。
17.3.2 how to use the PCA
在使用PCA之前呢,是需要对数据做预处理的——mean normalization / feature scaling(其实这两种本质上一个东西) 。这两种方法与监督学习中的方法很像。
使用feature scaling的目的就是为了能够将不同的feature进行比较,要不然比如下图中提到的房子的面积这个feature和房子的数量这个特征是不在一个数量级上的,因此要对其进行feature scaling。
给定一组数据,将其中每一个数据x替换成x-u,然后再除以标准差,用公式表达如下:

那么feature scaling的计算方法是:\(x_i' = \frac{x_i-\mu_i}{\sigma_i}\)
这里我觉得吴恩达没讲得很仔细,我也对此进行了一些查阅。
首先是为什么说mean normalization 和 feature scaling本质上是一种东西呢?
这是因为scaling 包含四种计算方法,分别是Rescaling(min-max normalization)、Mean normalization、Standardization(z-score normalization有的地方叫做zero-mean normalization)和Scaling to unit length
可以发现scaling里面包含了mean normalization,因此说是一种东西。
在机器学习中最常用还是zero-mean normalization,其计算方法是:\(x'=\frac{x-mean(x)}{\sigma}\)
(注:我会在另一篇文章【特征放缩】中仔细讲一讲这个地方,因为这个地方存在着翻译的问题,导致了概念混淆)
那么对于预处理完成之后的数据,剩下的就是我们在[17.3.1](#17.3.1 what's the PCA)中介绍的PCA需要做的事情:

以3维到2维的例子来说,上图中的u1和u2相邻是怎么得到的,如何降维的,降维之后的z向量又是怎么求的呢?
算法的主要过程包括下面的两个步骤:

注意
- 在“Compute covariance matrix”中的\(\Sigma\)符号是大写的古希腊文字Sigma,不是求和符合,并且求和符号的上界是m不是n;
- 在“Compute eigenvector(特征向量) of matrix \(\Sigma\)”中的svd(Sigma)等价于svd(\(\Sigma\));
- svd()这个函数是应用在octave中的,是用于表示奇异值的分解;
- svd分解出三个矩阵U,S,V中,真正需要的是U矩阵,这是一个n*n的矩阵。(svd的详解会在【奇异值分解】文中讲到,现在只需要知道奇异值的分解目的跟矩阵的特征值分解的目的是一致的,都是提取出特征中重要的特征,进而达到简化数据的目的)
具体来说,得到的U矩阵如下图所示:

那么是如何从n维映射到k维的呢?
其实只需要取U矩阵中的前k个向量即可,也就是从\(u^{(1)},...u^{(k)}\)。那么也就是说获得了k个方向了,也就是数据需要投影的方向(这k个就是最小的投影误差,在此不予以证明)。
那么又如何将k个n维的向量变成k个k维的向量呢?
将从U中取得的前k个向量构成一个矩阵,命名为\(U_{reduce}=[u_1,u_2,...,u_k]\)。
首先规定用z表示降维之后的新向量。
那么\(z^i = [u_1 \; u_2 \: u_3 ...\; u_k]^Tx^i=\begin{bmatrix}u_1 \\ u_2 \\ u_3 \\ ... \\ u_k\end{bmatrix}_{k*n}x^i_{n*1}\),上标表示第i个数据。
这样就得到了新的向量了,从而达到了降维的目的。
总结PCA的过程可以用下图来表示:

17.4 Reconstruction from compressed representation
既然能够将数据压缩,那么肯定是有办法可以将数据再还原回去的(只是还原回去的是一个大约值)。
由17.3.2中提到了如何降维的,在降维的过程中引入了新的变量\(U_{reduce}\),但是没有说是,这个向量有一个性质——\(U_{reduce}U^T_{reduce}=1\),也就是说\(U_{reduce}\)的逆矩阵是\(U_{reduce}^T\),\(U_{reduce}\)是正交矩阵。
那么由\(z^i = U_{reduce}^Tx^i\)得===》\(x^i_{approx} = U_{reduce}z^i\)
其中如果说投影误差projection error不是很大的话,那么反求出的数据与原数据是相差不大的。
17.5 Choosing the number of principal components
这一节主要是讲如何选择参数k。
在这里需要引入一个计算公式,通过这个k来最小化下面的公式:
\(\frac{Average \; squared \; projection \; error}{Total \; variation \; in \; the \; data}=\frac{\frac{1}{m}\sum_{i=1}^m||x^i-x_{approx}^i||^2}{\frac{1}{m}\sum_{i=1}^m||x^i||^2}<=0.01\)其中\(x_{approx}\)是17.4中定义的,小于的数值也一定是0.01。
上述的式子可以说99%的方差性质被保留。
这里有一个地方不是特别好理解,就是为什么要选择大的方差?我查阅了一些说法,这个解释起来很麻烦,还提到了信息熵的概念,确实是超出了这种普及介绍课程的范围,我在此只是简单的说一下这个理解。
首先如何定义“信息量”这个问题:
假设我们在一个维度空间内,有一些数据点,这些点就代表了“信息”。那么如何直观的表示“信息量”呢?
信息量就是数据的复杂多样性。比如,我们有两个车的合集,第一个集合中我们有许多相似的轿车。而第二个合集中,我们有火车,皮卡,轿车,大货车。那么,我们显然能在第二个更加复杂的合集中获得的信息量更多。PCA就是在这个基础上定义出“方差越大,信息量越多”这个概念的(但是这个说法是不准确的)。当然,这并不一定适合所有情况。若给出两组数据,我们如何确定它们的“信息量”相同呢?
直观的回答是:画出这两组数据的分布,比如在二维空间内,画出两组数据的大概分布,它们“长得越像”,它们的“信息量”就越可能相同,为了能够降维或者去除冗余的信息(也就是相似的属性),故要让方差最大。当我们进行维度转换的时候,比如降维,我们要求,在尽量保证“信息量不丢失”的情况下,降低维度才是最好的办法。
比如我们在二维空间内,有一些数据点,它们的分布恰好是一条直线,当我们想要降维(降成一维)的时候,只需要把这条直线的方向当作特征向量就可以“无损耗”得到一个一维的数据集,但是在真实情况下,这几乎是不可能的。
我们经常会遇到这种情况,假设我们有如下的“信息”:
![]()
这里我们想要降成一维,即保留最大信息的情况下降低维度,在u1和u2中,我们u1是更优的选择,因为当我们只保留u1方向的数据的时候,我们发现它比只保留u2方向的数据更像之前的数据。在这样的情况下,我们尽可能多的保留了信息(相对于u2方向)。
或者从PCA的角度上来理解,我们把一个高维度的空间影射到一个低维度上,我们只保留那些“强正相关”的特征,即当一个“信息”变化的时候,在这些维度上的变化是最多的,即信息量损失最小的维度,这也就是为什么PCA使用了些方差矩阵的原因。而方差只不过是协方差的一个特例,在这一点上可以解释方差越大,“信息量”也越大。
这一篇博客是从PCA的数据处理开始讲解了为何要选择最大方差,但是我还没有看懂,需要再消化主成分分析(Principal components analysis)-最大方差解释 - JerryLead - 博客园 (cnblogs.com)
那么这个过程该如何计算呢?
下图便是计算流程:

如上图所示,通过一开始假设k=1,然后不断修改k的值,直到其满足我们的方差定义值。
上述的流程中的“Check if”还可以用svd函数的返回值来处理,处理起来更加简单:

svg函数的返回值中,S矩阵是一个对角矩阵,那么只需要用\(1-\frac{\sum_{i=1}^ks_{ii}}{\sum_{i=1}^ns_{ii}}\)替换掉\(\frac{\frac{1}{m}\sum_{i=1}^m||x^i-x_{approx}^i||^2}{\frac{1}{m}\sum_{i=1}^m||x^i||^2}\)就可以了。
这样就大大降低了计算量,只需要求一次奇异值分解协方差矩阵,剩下的就是不断调整k的取值就好。
总结一下就是如下图所示的结果:
17.6 Advice and Attention for applying PCA
经过前面的铺垫论述可以知道,PCA的用处之一就是压缩数据,那么这个特性是可以用在supervised learning中的,在supervised learning应用PCA的目的就是加速计算过程的。
我们知道,数据越大,计算的时间就越长,比如计算一个10000维的数据\(x^i\)(\(y^i\)先不用管),那么在CV中就是一张100*100像素点的图片,通过使用PCA,降低其原来维度的1/10或是1/5,比如原数据到映射到了1000维,然后应用到logistic regression或则linear regression中去就实现了一个加速的过程。

另外需要注意的是Mapping \(x^i-->z^i\)这个映射过程是在training sets上通过PCA获得的,然后cross validation和 test sets是只需要应用这个映射过程就好,不需要也参与PCA的过程,再具体一点说就是在training sets得到的\(U_{reduce}\),然后cross validation和test sets只需要乘以\(U_{reduce}\)就好。
在前面的章节中曾经探讨过拟合的问题,引起这个的原因之一就是特征点过多,恰巧的是,PCA是可以通过降维来实现特征点的减少,那么是否可以通过PCA来避免过拟合呢?答案是不行。
因为PCA的处理过程是无标签化的处理,因此压缩的时候不仅会丢掉无用的信息点,同时也是会丢到有用的信息,这样整体看来效果不好,最正确的方法还是用正规化regularization来处理。
最后要说的是,如果要你设计一个算法,那么PCA不是一定要考虑的,因为毕竟在压缩的过程中会造成数据精度降低,信息缺失等问题,因此不到非必要的情况下(所谓的必要情况是你能确定问题是没有采用PCA导致的,比如维度确实达到难以计算的地步了,导致了计算量过大),还是不需要用PCA。
18. Anomaly detection
18.1 Problem motivation
异常检查是机器学习中一个常见的算法。
所谓的异常检测就是从一堆数据中找出一个或者多个异常的数据点。
首先是要对数据模型进行建模,建一个概率模型,然后将需要测试的数据放入所建立好的模型中去判断是否概率是否在一个合理的范围内。

以下是异常检测的三个例子,分别是欺诈检测(包括用户的异常行为,多次登录),制造检测(新的零件是否是正常)和监控检测

18.2 Use the Guassian distribution
在应用高斯分布用于检测异常数据之前,应该要对极大似然估计这个东西明白,明白了之后,就用在18.1中说到的构建一个概率模型来推导是否是异常。
那么假设有一组没有标签的数据集Training sets:\(\{x^1,x^2,...,x^m\}\),其满足正态分布。也就是说\(x_1 \sim N(\mu_1,\sigma_1^2);x_2 \sim N(\mu_2,\sigma_2^2);....\)(这里需要注意的是,x的superscript i是表示第i个数据,x的subscript i表示第i个属性)
那么预测模型为\(P(x)=P(x_1;\mu_1,\sigma_1^2)P(x_2;\mu_2,\sigma_2^2)...P(x_n;\mu_n,\sigma_n^2)=\prod_{i=1}^nP(x_i;\mu_i,\sigma_i^2)\)
有了上述的推导之后,关键的函数模型已经知道,那么整体的算法流程如下图所示:

这里我说一下\(\mu_j,\sigma_j^2\)为什么是那样表示。
其实还是根据极大似然估计来得到的:
为了能够从直观上更加感受到这个效果,这里就用特征值x1和x2来说明。
x1和x2的数据分布用红叉表示如下,其正态分布的参数也如下,那么两者构成的P(x)就是一个二维的整体分布:

可以看出,用于测试的数据越是靠近数据集的红叉中心,越是为真,此时的概率也就越大,反之就越小。
以上就是应用Guassian distribution来判断异常数据的过程。
18.3 Developing and evaluating an anomaly detection system
那么讲到了如何设计一个异常检测算法,不可避免地需要提到如何评估一个算法的好坏。
和supervised learning一样,对于anomaly detection也是需要分为training sets、cross validation sets和testing sets,只不过这里的training sets是不含有标签的,但是cross validation sets和testing sets是含有标签的,目的就是为了检验在training sets训练出的概率模型是否是有效的。

那么数据该如何划分呢?
还是以飞机引擎零件检查为例,假设有10000个零件数据,这些零件全部是好的,另外还有20个坏的零件数据。
既然要用于检测是否是良品还是次品,我们定义y=1表示次品,y=0表示是良品。
对于一个典型的异常检测来说,良品的数量是远大于次品的数量
将10000组数据划分如下:

注意:CV(cross validation)和Test数据集的数据都是不同的,同时也包括anomalous的数据也是要保证不同才可以。
整个算法流程可以总结如下:

这里需要说明以下几个地方:
- training set的数据都是良品的数据,不包含次品的数据,因为是用于训练模型嘛;
- 由于良品的数量是远大于次品的数量的,这会导致分类的正确率会很高,因此这里会出现数据倾斜(skewed)的现象,那么就需要用到监督学习中提到的evaluation metrcs;
- 对于是否需要添加新的feature,\(\epsilon\)的选择(多试几个,比如选择使\(F_1-score\)结果最大的)都是在cross validation set上调整的,确定之后再在test sets上评估算法。
18.4 Anomaly detection vs. supervised learning
通过前面的检测零件异常的例子,是否有这样的问题?为何不用监督学习的logistic regression来做判断呢,都用了标签化的数据了,都分为了training sets、cross validation sets和test sets了,直接用logistic regression不是更好吗?
这便是这一节主要是来讨论的主要问题,讨论异常检测与监督学习都是在什么前提下使用的,或者说应用的场景是什么样子的。
那么接下来就简答介绍一下两者的区别(应用条件):
| Anomaly detection | Supervised learning | |
|---|---|---|
| 样本数量 | 负样本(y=0的样本)的数量相当大; 正样本(y=1)的相对于负样本数量很少很少 |
正负样本的数量都很多,呈现1:1的比例效果 |
| 种类数量 | 对于正样本,也就是异常样本,其特征很多,很难用特定的算法来描述样本;比如引擎零级的问题因素是永远无法确定的,总是会有新的问题因素,此时又因为正样本数量太少,很难去构建模型; | 特征也是有很多,比如垃圾邮件的分类,有广告邮件,有盗号邮件,也存在有钓鱼网站的邮件,但是这样的正样本数据量是足够大的; |
| 未来特征 | 以后的数据可能是全新的问题因素,还是以引擎零件异常的例子来说,假设已经学习好了现在10~20的正样本,但是后续会出现新的问题因素导致引擎零件是异常的,因此这种不确定性也是很难去用于构建模型的; | 新的数据特征与原来的数据特征很接近 |
| 总结 | 因此只需要对存在大量负样本的数据进行概率建模,而不是针对少量多变的正样本去下手,将其当作重点; | 正负样本的数量足够大,可以让算法去学到其特征进而通过模型表示出来。 |
最后在说一说异常检测与监督学习的应用例子:

其实总结来说就是,如果你的正样本有足够多的数据和比较稳定特征的数据,上述的异常监督的算法提到的应用场景是完全可以用监督学习的方法来实现代替的。
18.5 Choosing what features to use and Transformation of feature
就目前来说,异常检测算法是根据高斯模型建立的算法,前提是你的数据的features分布是符合高斯分布的,那么如果遇到了分布不符合高斯分布的情况,那就需要对数据进行稍微地转换,使其看上去更接近于一个高斯分布的效果。
比如下图中的数据分布呈现出一个下降的趋势,那么就需要对其做数据的转换:

上图中用到的是log函数的转换,当然还有其他的数值转换方法,比如\(x^2,x^{\frac{1}{2}},log(x+c),x+c,(x+c)^3,....\)其中c是一个可以调整的常数。
注意:虽然说不转变数据也是可以用于异常检测,但是效果不是很好,因此建议去修改数据。
那么接下来是第二个问题,如何选择确定feature?
其实这个问题的处理方法跟在监督学习提到的14.2error analysis处理方法差不多,那就是需要看被错位分类的数据有什么特征,通过增删这个特征,使其在cross validation set上表现更好,来达到更进一步区分的目的。
假设数据已经处理好使其符合了高斯分布如下图所示:

首先要明确一个正常的分类效果是:
- p(x) large for normal examples x;
- p(x) small for anomalous examples x;
但是如果出现了p(x)对于normal examples和 anomalous examples的预测结果是差不多的,那么这就是一个异常的情况。
如下图所示,一个绿色的数据点就是我上述有问题的情况,数值刚好处于中间值的状态,导致\(p(x_1)\)这个概率不大不小(图像中蓝色的曲线表示整个数据的概率)

那么是否可以添加一个新的特征\(x_2\)使异常点能够被区分出来呢?
这一步就是我们人工需要做的,那么添加一个新的特征\(x_2\)之后,所有的样本点的分布如下图所示:

可以看到异常点处于二维高斯分布的边缘部分,此时的\(p(x_1,x_2)\)的数值就是很小,这样就到达了异常检测的目的。
总结来说,选择需要添加的feature的时候,通常选择那种特别大或者特别小的值,这样的特征有可能是异常点的区分地方。
18.6 Multivariate Gaussian distribution
这一节主要是讲解了多元的高斯分布,以二维高斯分布为例,讲解参数的不同对模型的整体的影响是什么样的。
如果要想搞懂细节的地方,还是需要系统地学习多维的高斯分布的推导,这里只是简单地展示,不同的参数模型的效果是什么样子的。
对于一组数据,比如下面的数据:
你会发现这次的数据分布和以往的不同,不同之处在于这次的总体分布不是一个圆形区域,而是类似一个椭圆的分布区域,因此这就牵扯到如何调整参数来达到这样椭圆的效果。
有了数据x,不再为每一个参数定义一个\(p(x_i)\),而是为所有的参数定义一个总得模型\(P(x)\).这就牵扯到了多元高斯分布的参数问题了:
在此不再赘述细节,直接说结论:
- 通过调整协方差矩阵\(\Sigma\)(对角线上的数值相同),得到的效果如下:
- 通过调整协方差矩阵\(\Sigma\)(对角线上的数值不同),得到的效果如下:
- 通过调整协方差矩阵\(\Sigma\)(副对角线上的数值相同),得到的效果如下:
- 通过调整协方差矩阵\(\Sigma\)(副对角线上的数值相同,且为负数),得到的效果如下:
- 通过调整参数矩阵\(\mu\),得到的效果如下:
18.7 Anomaly detection using the Multivariate Gaussian distribution
上一节中提到了多元高斯分布的概念和参数的变化情况,那么如果确定了多元高斯分布的参数\(\mu\)和\(\Sigma\)呢?
其实跟前面讲到的差不多,还是利用了极大似然估计来推导出来的:
那么整体的算法流程如下图所示:
这里还有一个问题需要注意,多元高斯分布与[18.2](#18.2 Use the Guassian distribution)提出的公式\(P(x)=P(x_1;\mu_1,\sigma_1^2)P(x_2;\mu_2,\sigma_2^2)...P(x_n;\mu_n,\sigma_n^2)=\prod_{i=1}^nP(x_i;\mu_i,\sigma_i^2)\)是有区别的。
为了表述方便,我们将18.2中的公式成为Original model。
这个Original model在图像上表示的是一个轴对称的图像,所谓轴对称可以理解为图像不是一个倾斜的圆形或椭圆。
在数学层面上解释就是Original model是认为每一个feature都是相互独立的,也就是说没有任何关系,因此不能用这个模型来表示不同feature之间的关系(但是还是能够实现的,下面会讲到)。
但是Multivariate Gaussian distribution是存在一定的关系在里面表示的,因此就可以表示出倾斜的图像。
那么从本质上来说,Original model是Multivariate Gaussian distribution的一种特殊情况,Multivariate Gaussian distribution的协方差矩阵只需要在对角线上表示出Original model的\(\sigma^2\)(此时\(\Sigma\)矩阵是一个正定矩阵),对应的\(\mu\)也一致,就可以了。

那么如何从这两个模型中选择用哪一个呢?
虽然Original model使用得更多一些,但是Multivariate Gaussian能够处理特征值之间的关系。
| Original Model | Multivariate Gaussian | |
|---|---|---|
| expression | \(p(x_1;\mu_1,\sigma_1^2)...p(x_n;\mu_n,\sigma_n^2)\) | \(p(x;\mu,\Sigma)=\frac{1}{(2\pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}}exp(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu))\) |
| correlation | 需要手动创建一个新的feature,通过原有的features进行表示,这样就实现了原来的feature看起来没有什么异常,但是将部分features组合起来就会出现异常的现象 | 该算法可以自动将需要构建的features关系组合起来 |
| advantage/disadvantage | 1)计算成本低,也就是说当特征feature的数量n很大的时候,可以比Multivariate Gaussian更快; 2)即是训练集的数量m不是很大,也是可以很好地使用; |
1)计算量大,因为协方差矩阵\(\Sigma\)的计算量是n*n的 2)必须保证m>n(在实际中其实是严格要求m \(\geq\) 10*n,因为可能存在有线性相关的属性,也即是出现了冗余特征),否则协方差矩阵会不可逆【至于为什么是要保证m>n,我也不是很清楚,我也没有发现m和n有什么必然的联系,结合吴恩达在后面的说法,我猜测可能是因为如果说m<n的话,就会导致不能拟合好协方差矩阵,出现线性相关的情况,进一步导致了矩阵不可逆】 |
总结来说就是n不是很大的情况下,是可以考虑使用Multivariate Gaussian算法的,毕竟可以节省你手动构建新的feature的时间。




浙公网安备 33010602011771号