k-means,这一种算法是非监督模型,也就是说一开始我可以不用告诉它类别,让他们自己去分类。那么怎么去分类呢?假设我们首先将它映射到欧式空间
可以直观的看出来,图中把点分成了三类。然后我们做出这样一种假设:每一类有一个中心点,这一类的绝大部分点到中心点的距离应该是小于到其他类中心点的距离的。之所以说绝大部分是因为考虑到点的特例,我们不能因为单独的几个点而否定之前的大部分。基于这一个思想我们可以确定所要优化的目标函数,我们假设分类N个数据到K个类别,则有:
其中的rnk意味着归类到k时为1,剩下为0.剩下的具体如何优化这里不在详细说了。
代码实现如下:
这里调用了聚类器KMeans,因为已知三类我们让其中的clusters中心点为3就可以了。KMeans的参数除了聚类个数之外还有max_iter,n_init,init,precompute_distances等。具体的参数含义解释如下网址:
http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans