k-means算法是目前最流行的,用得最多的一种clustering算法
K-means算法
如果我们想要将上图中的绿色的点分为两类,首先随机的选取两个cluster centroids(聚类中心),然后迭代(循环)地做两件事:cluster assignment和move centroids(图1)
cluster assignment: 然后将训练集中的每个样本,根据是距离红色的cluster centroid近还是蓝色的cluster centroid近来进行分配cluster.(图2)
move centroids:然后将所有红色的点的位置计算出平均值做为新的cluster centroid,同样所有的蓝色的点的位置计算出平均值做为新的cluster centroid.(图3)
cluster assignment:根据新的cluster centroids来重新分配(根据距离远近)每个样本的cluster,即对每个样本重新进行染色(图4)
move centroids:重新分配clusters后,再计算每个cluster的平均值做为新的cluster centroids.(图5)
我们继续进行迭代,发现cluster centroids和分配的cluster不再变化了,意味着k-means算法收敛了,即在这个数据中发现两个cluster这个工作结束了
K-means算法formally
输入:K为我们希望将数据集分为K个clusters(以后会讲如何选择K),现在K做为输入为需要将data分为的cluster的个数。
training set(没有y值,因为为非监督学习)
x(i)为n维,而不是n+1维,不用加上x0=1
cluster assignment step: 对于training data中的第一个点,计算c(i)(对每个样本进行染色)为距离最近的那个cluster centroid的下标值(1-K),注意uk中的k为小写,指的是centroid的下标,Kcluster centroids为大写,表示总共有K个cluster.通常我们喜欢用距离的平方来求最小值.
move centroid step: 重新计算每个cluster的cluster centroid(根据染色后的平均值)
如果某个cluster centroid没有一个点分配给它,那么怎么办呢?通常情况下,我们是将这个cluster centroid给移除掉,这样就会得到K-1个clusters;如果就是要K个clusters,怎么办呢?办法是重新找一个cluster centroid.但是将这个cluster centroid给移除掉这种方法更常使用。
K-means在不能明显区分的clusters上的应用
左边图为k-means在明显分为三个clusters上的数据集上的应用。
K-means也可以应用在如右图所示的那样,数据集看上去是没有明显的cluster的区分的。这是一个T-shirt size的例子,如你想要设计三种大小(S,M,L)的T-shirt,但是不知道每种大小应设计为多大,这时我们将要穿我们T-shirt的人的身高体重(这些是影响T-shirt大小的主要因素)做个统计,如左图所示,然后应用K-means算法将这些数据分为三个cluster,然后分别针对每个cluster来设计不同size的衣服的大小。=>市场细分的例子,使用K-means将我的市场划分为三部分,这样就能区别对待三类不同的顾客群体,更好地适应他们不同的需求(如S,M,L不同size的衣服那样)
总结
- 先随机选取cluster centroids(聚类中心)
- 对每个样本点进行cluster assignment step(染色)
- move centroid step:根据染色后的结果,再重新计算新的cluster centroids(聚类中心)
- 重复以上2,3步骤,直到收敛(cluster centroids与染色结果不再改变)