一、聚类简介
前面所学习的回归算法、分类算法都可以归于监督学习,即在开始之前我们就知道了数据属于的类别或是明白决策边界的相对位置,下面来学习一下无监督的学习算法-聚类,主要是学习最基本的K-means聚类,像层次聚类、密度聚类等其他算法以后慢慢来看。
上图就是一个很简单的回归模型,我们给定一个数据集,注意!这里的数据是提前知道标签的,即知道yi的相关值,可视化之后就是图中所描的点那样,我们希望找到一条类似与红色线那样的回归直线,将其合理的进行划分。
而在无监督学习中,我们给定的无监督的学习中,我们给定的数据集只有关于x的信息,可视化之后可以看出,我们只有一系列的点,但没有相应的标签。我们所要做的就是将训练数据输入到算法中,然后希望算法为我们找到数据内在的结构特点,然后将其正确的分成两个分开的点集(簇),这就是我们希望聚类算法做的事。
聚类算法应用在我们生活的各个层次,例如:市场分割、社交网络分析、计算机集群的组织,甚至于天文数据的分析等,所以学号聚类还是很重要的。
二、K-means算法
下面就来具体的学习我们的K-means算法!
比如当我们的数据集可视化之后是如上图一样的一系列点后我们希望可以将其正确的分为不同的簇,那K-means算法是怎么做的呢?
首先我们随机找到两个簇的中心,如图上红色和蓝色×所示,然后进行下一步
然后计算每一个数据点来这两个聚类中心的距离,选择最小距离的中心最为自己本次聚类的结果。
接着在第一次聚类结束后,我们需要更新我们的聚类中心,计算首次聚类的每一类数据的均值,将其作为新的聚类中心,如图上箭头所指的变化。
迭代多次进行聚类中心的更新,直到它不再改变,说明我们的聚类算法得到了正确的结果,我们将数据集合理的进行了划分。
来看一下K-means算法中我们的参数形式,我们输入时,实际上需要给定两个东西:一个是我们想要聚类的类别的数目K,另一个是训练集,训练集中的每一个数据都是一个n维的向量。
给定输入之后,来看一下算法具体是怎么实施的。
• 随机的初始化K个聚类中心,μ1,μ2 … μk
• 迭代进行如下步骤:
○ 计算每一个数据点Xi到聚类中心的距离Ci,求出最小的距离值,进行划分
○ 计算划分后每一类的数据的均值,更新聚类中心
如上图所示,当我们的训练集是左图所示的分隔较远的数据时,我们可以相对容易的确定聚类的类别数K;但如果是如右图所示,数据离的很近,很难确定具体的K哪个合适,这时要考虑实际的需求。比如右图是有关T-shirt的身高、体重的相关数据,我们希望根据这些数据进行聚类,确定我们要怎么划分,假如我们分为S、M、L三种型号,那K就等于三,类似的我们的聚类结果就是这样。
三、优化目标
在我们之前学习的算法中,不管是使用均方误差还是熵,我们都有一个代价函数,那么在K-means算法中是否可以设一个合适的代价函数呢?是可以的!我们记c(i)为距离各个聚类中心的距离,μk表示各个聚类中心,μc(i)代表与 x(i)最近的聚类中心点,我们就可以假设我们的代价函数如下所示:
我们的目标仍然是得到最小的代价函数值,求出相应的参数。
回顾前面的算法,我们可以看出,第一层循环是减小Ci引起的代价,第二层循环是减小μi引起的代价。
四、随机初始化
在K-means算法中,有一个很重要的事就是如何确定K的大小,它对于我们最后的聚类结果有着很大的影响。
第一种就是随机初始化:
1. 我们应该选择k<m,即聚类中心点的个数小于所有训练实例的数量
2. 随机选择k个训练实例,然后令k个聚类中心分别与这k个训练实例相等
但是K-means算法可能最后聚类的中心点会停留在一个局部的最小值处,从而聚类的结果并不是我们想要的。因此我们就需要多次运行短发,每一次都重新进行随机的初始化,最后比较几次的结果,选择代价函数最小点而结果,但如果K很大时,这种做法的改善效果就很小了。
五、选择聚类数
当我们的训练数据是如上这么简单的数据时,我们也许可以相对容易的确定K的值,但是实例数量很大时,K的确定就不容易了。其实没有最好的选择K值的方法,通常是根据不同的问题,根据人的经验人工进行选择。
这选择K的值时,我们有一个方法是:“肘部法则”,我们所需要的就是改变K的值,我们用一个聚类来运行K均值算法,这意味着所有的数据都会分到一个聚类里,然后计算成本函数或者计算畸变函数。理想情况像左图所示,代价函数值在K=3时到达一个肘点,在此之后,值下降的就很慢了,所以我们可以选K=3.但是在实际中我们得到的图往往是右面的,我们就不太清晰的选择K的取值了。
例如在前面T-shirt的例子中,我们可以取k=5,分成S、M、L三个尺寸,也可以分为XS、S、M、L、XL5个,这完全是建立在我们问题的基础上做出的。