首次接触k-means算法是在大二参加华中地区数学建模时,题目是对各搜索引擎进行评价,在进行搜索结果文本分析的时候,稀里糊涂就用了k-means,现在趁着机器学习的作业,重新学习了一下。
K-means通常作为一种聚类分析方法流行于数据挖掘领域,其目的是:把n个点(可以是样本的一次观察或一个实例)划分到k个聚类中,使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类,以之作为聚类的标准[1]。K-means聚类是无监督机器学习中常用的算法,所谓无监督(无教师)学习,指拿到一堆数据,不知道其类别信息,直接丢给学习算法,算法根据数据特征,自动将数据分类。例如,有一堆水果混杂在一起,并不知道它们的名字,我们按照它们的特征(长的,圆的,有刺的)分成几堆,后来有人告诉我们这分别是香蕉、苹果和榴莲。我们并不知道这些水果的类别信息,但我们却能大体将其归类,这个性质特别实用,因为在实际中我们往往缺乏先验知识,拿到的是密密麻麻的一堆数据,如果直接喂给模型来学习可能会比较低效。于是k-means作为无监督的聚类算法,通常用于数据的预处理,实现大体上的分类,随后再进行更精细的处理。K-means有个很著名的解释,牧师—村民模型[2]:
有四个牧师去郊区布道,一开始牧师们随意选了几个布道点,并且把这几个布道点的情况公告给了郊区所有的居民,于是每个居民到离自己家最近的布道点去听课。
听课之后,大家觉得距离太远了,于是每个牧师统计了一下自己的课上所有的居民的地址,搬到了所有地址的中心地带,并且在海报上更新了自己的布道点的位置。