无监督学习(unsupervised learning)介绍
聚类(Clustering)
回顾之前的有监督学习,根据给出的数据集(已经做出标记labels)\({(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})}\),学习出假设函数,对数据集进行决策分界。
K-mean
初始数据集如下图所示,数据集未做任何标记labels,
所谓的的簇分类是将图中所有的绿色样本点根据其距离蓝色、红色中心点距离,分配到簇中。如下图:
此时继续迭代,聚类中心将不会再做改变。
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点处平均值,实例如下图所示:
}
目标优化--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 这个过程就是把这些点 划分到离它们最近的那个聚类中心,因为这样才会使得点到对应聚类中心的距离最短)。
因此 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均值聚类的方法。
具体地,假如决定运行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个聚类等。
其实选择聚类数目的方法时可能会提及一个叫做肘部法则(Elbow Method)的方法。
实际上,当你应用肘部法则的时候如果你得到了一个像上图形状非常好,而事实证明肘部法则并不那么常用其中一个原因是,如果你把这种方法用到一个聚类问题上事实上你最后得到的曲线通常看起来是更加模棱两可的(没有一个清晰的肘点),而畸变值像是连续下降的。也许3是一个好选择也许4是一个好选择也许5也不差,因此肘部法则它是一个值得尝试的方法,但是并不能够适应全部条件。