聚类之K-Means算法(二)

740 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

前面有了基本的K-Means算法的了解,接下来让我们继续看看K-Means算法的实现。

K-Means算法

我们需要先设置好中心点,然后根据每个中心点去计算每个实例的距离,之后就能够按照计算出来的分数,将所有实例划分到不同的中心点。或者如果我们不知道中心点,但是有标签,我们也可以通过计算实例之间的平均距离一步步推出中心点。

当我们对于不确定的事物,我们最喜欢的最准确的做法就是设置随机值。所以如果没有确定的中心点的位置时,我们就首先要想到设置随机值。比如我们看到图像k堆,那就可以设置k个随机中心点。然后需要做的就很简单,去循环标记我们的实例,更正中心点的位置。

我们看上面的步骤,中心点应该就会在有限步骤后就慢慢开始不动,算法最终达到收敛。

图1 K-Means算法

当然我们也要注意,如果这个算法用在不是聚类的数据上,最后可能永远不会收敛,最后的计算复杂度还会变得很大。

还有一点,对于随机的中心点,我们应该也要考虑到一点,那就是他这样就算下去,会不会到一个次优解。其实上图也能看出来效果稍微差一丢丢。那么我们就需要要优化一下:

也就是刚才说的,我们如果知道中心点可以直接设置:

KMeans(n_clusters=5,init=init_points,n_init=1)

init_points就是我们设置的刚好知道k个中心点。不过我想这个基本不太可能吧。n_init就是就是要初始化几次。

那么我们是不是可以设置,多一点n_init次数,然后再多次中随机初始化中,找到相对比较好的。这个怎么找比较好的,就需要引入模型的惯性这个指标,他其实就是每个实例与器最接近的中心点之间的均方距离。Scikit-Learn的K-Means算法可以通过inertia_instance变量访问。最后只要在多次计算中,找到惯性最小的返回就行。