K-Means算法原理及numpy实现
K-Means应该是大多数人接触到的第一个聚类算法或无监督学习算法,其算法原理简单,Python实现(使用sklearn包)也很方便。同时K-Means算法对于高维聚类(在维度没有达到几十维的情况下)也非常快速有效。我之前也是使用sklearn自带的kMeans包进行数据聚类的,但随着实验的深入,也发现了使用算法库带来的诸多不便,如不能自定义距离计算公式等。而网上的一些完全基于numpy编写的K-Means代码,由于受其自身开源性和可扩展性的影响,导致代码冗长繁杂,对初学者并不十分友好,于是动手实现了一下K-Means,力求简单易懂,同时保持一定的可扩展性,在此与大家分享。 首先简单介绍一些K-Means的原理:字面上,K即原始数据最终被聚为K类或分为K类,Means即均值点。K-Means的核心就是将一堆数据聚集为K个簇,每个簇中都有一个中心点称为均值点,簇中所有点到该簇的均值点的距离都较到其他簇的均值点更近。如下图是一个K=4的聚类示意图,每个点都是到自己所在的簇的均值点更近,而这个均值点可以是原始数据中的点,也可以是一个不存在的点,即不属于原始数据集中的点。 K-Means的算法流程下图所示,这里使用的是周志华教授《机器学习》一书中的插图。用文字描述为: 首先确定K值(即你想把数据聚为几类,K值是K-Means算法中唯一的参数); 从原始数据集中随机选择K个点作为初始均值点