无监督学习(unsupervised learning)介绍
聚类(Clustering)
回顾之前的有监督学习,根据给出的数据集(已经做出标记labels)({(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})}),学习出假设函数,对数据集进行决策分界。
![1.jpg](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fhh5c53wfpj209k07lt8r.jpg)
相反无监督学习中并未给出具体的标记$y^{(m)}$,仅有数据集${x^{(1)},x^{(2)},...,x^{(m)}}$,算法对同一类的进行划分。
![2.jpg](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fhh5c5fyb4j209507h0sq.jpg)
对于聚类在实际的应用中亦是非常广泛的,如:市场细分(Market segmentation)、社交圈分析(social network analysis)、集群计算(organize computing clusters)、天体数据分析(astronomical data analysis)
![3.jpg](http://wx1.sinaimg.cn/mw690/7b8d2108gy1fhh5c7vsf1j20j10bi460.jpg)
在聚类分析中,我们希望能有一种算法能够自动的将相同元素分为紧密关系的子集或簇,K均值算法(K-mean)为最广泛的一种算法。
K-mean
初始数据集如下图所示,数据集未做任何标记labels,
![4.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fhh5c8wh5sj20bj08ldfq.jpg)
要求将其分为两簇,K均值算法的操作原理为:
![5.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fhh5c9g9n7j20c808lwei.jpg)
随机挑选两个点作为聚类中心(cluster centroids),K-均值算法是一个迭代过程,分为两部分,第一为簇分类,第二为移动聚类中心。
所谓的的簇分类是将图中所有的绿色样本点根据其距离蓝色、红色中心点距离,分配到簇中。如下图:
![6.jpg](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fhh5c9qqjvj20bo08tjrc.jpg)
接下来将染色的点计算它们的平均值(平均下来的位置)此时将相应的聚类中心移动到这个均值处。
![7.jpg](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fhh5ca4t9mj20bd08s0sq.jpg)
继续迭代,有:
![11.jpg](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fhh5cbfagcj20bg08o0ss.jpg)
此时继续迭代,聚类中心将不会再做改变。
K-均值算法,输入有两个部分:K(聚类的个数):number of clusters,训练集({x^{(1)},x^{(2)},...,x^{(m)}}) 。
随机初始化K个聚类中心(mu_1,mu_2,...,mu_K in mathbb{R}^n),重复一下迭代:
{ for i=1:m
c(i)=从1到K的所有聚类中心索引(index)中最接近于x(i)的索引,即---(c^{(i)}=min_k||x^{(i)}-mu_k||^2)
for k=1:K
(mu_k)=对于接近于聚类k点处平均值,实例如下图所示:
}
![13.jpg](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fhh5ccg859j20jj03ut90.jpg)
可能存在一种情况,即某一聚类中心的最近点数位零,此时可以删除即变为K-1个簇。此外k-均值对于不易分离的聚类有很好的效果,如下图,对于不同身高、体重的人群衬衫的尺寸是相差很多的,若你是一家服装设计公司,利用k均值进行聚类分析,形成3个簇,即三种类,可以为尺寸设计方便很多,这也是市场细分--Market segmentation的一个隔离。
![14.jpg](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fhh5ccvpj5j20br0a2jrx.jpg)![15.jpg](http://wx1.sinaimg.cn/mw690/7b8d2108gy1fhh5cd8sk8j20aa08e3yt.jpg)
目标优化--Optimization Objective
在大多数我们已经学到的监督学习算法中类似于线性回归逻辑回归以及更多的算法,所有的这些算法都有一个优化目标函数或者某个代价函数需要通过算法进行最小化 处理。事实上 K均值也有 一个优化目标函数或者需要最小化的代价函数。
首先了解什么是 K均值的优化目标函数将能帮助我们调试学习算法,以确保K均值算法是在正确运行中,第二个也是最重要的一个目的是在之后的视频中我们将讨论将怎样运用这个来帮助K均值找到更好的簇并且避免局部最优解。
定义:(c^{(i)})为(x^{(i)})所对对应的索引值,(mu_k)为聚类中心k,(mu_{c^{(i)}})为样本(x^{(i)})所属聚类簇。
现在写出 K均值聚类算法的优化目标:
J 参数是(c^{(1)})到 (c^{(m)}) 以及 (mu_1)到 (mu_k), 随着算法的执行过程,这些参数将不断变化,右边给出了优化目标也就是所有的1/m乘以i = 1到 m个项的求和,也即每个样本(x^{(i)})到 (x^{(i)})所属的聚类簇的中心距离的平方值 。
那么K均值算法要做的事情就是它将找到参数 (c^{(i)})和 (mu_i),也就是说找到能够最小化代价函数 J 的 c 和 μ。这个代价函数在K均值算法中有时候也叫做失真代价函数(distortion cost function) 。
再解释详细点,这个算法的第一步就是聚类中心的分配,在这一步中我们要把每一个点划分给各自所属的聚类中心,这个聚类簇的划分步骤实际上就是在 对代价函数 J 进行最小化,是关于参数 (c^{(1)})、 (c^{(2)})等一直到(c^{(m)})同时保持最近的聚类中心(mu_1)到(mu_k)固定不变 。第一步要做的其实不是改变聚类中心的位置而是选择 (c^{(1)})、 (c^{(2)})等一直到(c^{(m)})来最小化这个代价函数或者说失真函数 J 这个过程就是把这些点 划分到离它们最近的那个聚类中心,因为这样才会使得点到对应聚类中心的距离最短)。
![2.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fhia6dxfisj20kt06x0tp.jpg)
K-均值算法的第二步任务是**聚类中心的的移动**,实际上是选择了能够最小化J的μ的值,也就是说最小化代价函数J。因此是最小化 J关于所有聚类中心的位置$mu_1$到$mu_k$。
因此 K均值算法 实际上是把这两组变量在这两部分中分割开来最小化 J 。首先是c作为变量然后是μ作为变量,首先关于c求 J的最小值然后关于μ 求 J 的最小值,反复循环 。
随机初始化--Random Initialization
如何初始化K均值聚类的方法将引导我们讨论如何避开局部最优来构建K均值,我们之前没有讨论太多如何初始化聚类中心,有几种不同的方法可以用来随机初始化聚类中心,但是事实证明有一种效果最好的一种方法。
1.当运行K-均值方法时,需要有一个聚类中心数量K,K值要比训练样本的数量m小
2.通常初始化K均值聚类的方法是随机挑选K个训练样本
3.设定μ1到μk让它们等于这个K个样本
具体地,假设K等于2,如下图的例子,我们想找到两个聚类,为了初始化聚类中,首先要做的是随机挑选几个样本,比如挑选了蓝色和红色X标明的样本点,并作为初始化聚类中心。这就是一个随机初始化K均值聚类的方法。
![3.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fhia6e9toij208u057745.jpg)
但是有时候,有可能不会那么幸运,也许会挑选到如下两个初始化样本,实际上用了一种不同的初始化方法来初始化聚类中心而这张幻灯片中描述的方法是真正被推荐的方法,这种方法在你实现K均值聚类的时候可能会用到。根据推荐也许通过这右边的两个图你可能会猜到K均值方法最终可能会得到不同的结果取决于聚类簇的初始化方法因此也就取决于随机的初始化。K均值方法最后可能得到不同的结果尤其是如果K均值方法落在局部最优的时候。
![4.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fhia6emtnkj208e05cmx0.jpg)
如下图所给的一些数据,看起来好像有3个聚类,那么如果你运行K均值方法如果它最后得到一个局部最优这可能是真正的全局最优,可能会得到这样的聚类结果:
![5.jpg](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fhia6f7fu4j20h406t75o.jpg)
但是如果你运气特别不好,随机初始化K均值方法也可能会卡在不同的局部最优上面,在下图这个例子中,看上去蓝色的聚类捕捉到了左边的很多点,而在绿色的聚类中每一个聚类都捕捉到了相对较少的点,这与不好的局部最优相对应。因为它基本上是基于这两个聚类的并且它们进一步合并成了1个聚类,而把第二个聚类分割成了两个像这样的小的聚类,它也把第二个聚类分割成了两个分别的小聚类簇。
![7.jpg](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fhia6fm0xyj20fg05hwf5.jpg)
这些局部最优所对应的是真正的K均值方法,且通过最小化这个失真函数J并不能得到很好的结果,因此,如果担心K均值方法会遇到局部最优的问题,且想提高K均值方法找到最有可能的聚类的几率的话,我们能做的是尝试多次随机的初始化而不是仅仅初始化一次,如果我们能初始化K均值很多次并运行K均值方法很多次,通过多次尝试以保证我们最终能得到一个足够好的结果一个尽可能局部或全局最优的结果。
具体地,假如决定运行K均值方法一百次,即我们需要执行这个循环100次(100--这是一个相当典型的次数,有时会是从50到1000之间),这意味对于这些100次随机初始化的每一次,我们需要运行K均值方法,得到一系列聚类结果和一系列聚类中心。之后我们可以计算失真函数J用我们得到这些聚类结果和聚类中心来计算这样一个结果函数,最后完成整个过程100次之后,在所有这100种用于聚类的方法中选取能够给我们代价最小的一个。
for i=1:100
%随机初始化K-均值
%运行K-均值,获得c(1),...,c(m),μ_1,...,μ_K
%计算代价函数J(c(1),...,c(m),μ_1,...,μ_K)
end
如果聚类数是从2到10之间的任何数的话,做多次的随机初始化通常能够保证你能有一个较好的局部最优解,但是如果K非常大的话,如果K比10大很多,有多个随机初始化就不太可能会有太大的影响,更有可能你的第一次随机初始化就会给你相当好的结果,做多次随机初始化可能会给你稍微好一点的结果但是不会好太多。
选择适当的聚类数--the number of Clusters
本节将讨论一下K-均值聚类数目的选择或者说是如何去选择参数大写K的值,实际上并没有一个非常标准的解答或者能自动解决它的方法。目前用来决定聚类数目的最常用的方法仍然是通过人为察看可视化的图或者聚类算法的输出结果来手动地决定聚类的数目。
选择聚类的数目不总是那么容易大部分原因是数据集中有多少个聚类通常是模棱两可的,看到下图这样的一个数据集,有些人可能会看到四个聚类那么这就意味着需要使用K=4,有些人可能会看到两个聚类这就意味着K=2,其他人也会看到3个聚类等。
![8.jpg](http://wx1.sinaimg.cn/mw690/7b8d2108gy1fhia6fwqqaj20el0alt8x.jpg)
无监督学习的一部分没有给我们标签所以不会总有一个清晰的答案这是为什么做一个能够自动选择聚类数目的算法是非常困难的原因之一。
其实选择聚类数目的方法时可能会提及一个叫做肘部法则(Elbow Method)的方法。
![9.jpg](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fhia6gas0rj20ah07h74h.jpg)
分别计算K值为1,2,....时的代价函数或者说计算畸变J,plot之后,我们就能得到一条曲线它展示了随着聚类数量的增多畸变值是如何下降的,这条曲看起来有一个很清楚的肘点,类比于人的手臂。K从1变化到2再从2到3时畸变值迅速下降,然后在3的时候到达一个肘点此后畸变值就下降得非常慢。我们选肘点:K等于3。
实际上,当你应用肘部法则的时候如果你得到了一个像上图形状非常好,而事实证明肘部法则并不那么常用其中一个原因是,如果你把这种方法用到一个聚类问题上事实上你最后得到的曲线通常看起来是更加模棱两可的(没有一个清晰的肘点),而畸变值像是连续下降的。也许3是一个好选择也许4是一个好选择也许5也不差,因此肘部法则它是一个值得尝试的方法,但是并不能够适应全部条件。
![10.jpg](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fhia6gnfshj209r07edfw.jpg)
还有一种方法来考虑如何选择K的值,通常人们使用K-均值聚类算法是为了某些后面的用途或者说某种下游的目的(later/downstream purpose),而要求得一些聚类。也许你会用K-均值聚类算法来做市场分割如我们之前谈论的T恤尺寸的例子,如果那个后续下游的目的比如市场分割能给你一个评估标准那么通常来说决定聚类数量的更好的办法是看不同的聚类数量能为后续下游的目的提供多好的结果。即具体问题具体分析。
![11.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fhia6h4ylyj20hx0730tc.jpg)
上图就是后续下游目的一个例子,比如这个问题里的决定生产什么样的T恤(你可生产3种尺寸的T恤亦可以生产五种尺寸的等) ,给我们一个选择聚类数量的评价标准。