9.4 试编程实现k均值算法,设置3组不同的k值,3组不同初始中心点,在西瓜数据集4.0上进行实验比较,并讨论什么样的初始中心有利于取得好结果。
根据k均值算法的迭代公式,可以知道在二维平面上,这些中心点直接由其几何位置的两点间垂直平分线作为聚类边界,因此在数据不多的情况下,很容易陷入局部最优,从而使迭代过程很快结束。实际执行代码发现,所谓取得好结果,应该是使各点离聚类边界尽量远,且最终的中心点相互远离。个人推测,由于在更新中心向量的时候使用了平均,因而所有中心会尽量向点分布密度较大的区域移动,因此,初始中心应该尽量分散到不同的高点密度分布区域上去,可取得较好结果。
本题的算法十分简单,不过如果直接采用与书上相同的初始中心,则马上就会收敛而不会像书上所说训练5轮才达到收敛。也就是说,书上给的示例是错的。
另外,通过这个题,我才发现,原来用matplotlib可以画动图,利用animation里面的ArtistAnimation或者FuncAnimation即可。然而,我发现不能理想地导出gif图,这就比较尴尬了。。。网上搜了一下发现,需要装ImageMagick这个软件,然而装了还是各种错,后来找到matplotlib的配置文件,在最后一行更改convert_path为convert.exe的安装路径也仍然不行,还报错:winError 5,后来找到一篇帖子一篇帖子