赞
踩
机器学习中有两类的大问题,一个是分类,一个是聚类。分类是监督学习,原始数据有标签,可以根据原始数据建立模型,确定新来的数据属于哪一类。聚类是一种无监督学习,聚类是指事先没有“标签”,在数据中发现数据对象之间的关系,将数据进行分组,一个分组也叫做“一个簇”, 组内的相似性越大,组间的差别越大,则聚类效果越好,也就是簇内对象有较高的相似度,簇之间的对象相似度比较低,则聚类效果越好。K-means就是一个聚类算法。
K-means聚类算法中K表示将数据聚类成K个簇,means表示每个聚类中数据的均值作为该簇的中心,也称为质心。K-means聚类试图将相似的对象归为同一个簇,将不相似的对象归为不同簇,这里需要一种对数据衡量相似度的计算方法,K-means算法是典型的基于距离的聚类算法,采用距离作为相似度的评价指标,默认以欧式距离作为相似度测度,即两个对象的距离越近,其相似度就越大。
聚类和分类最大的不同在于,分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来,也就是聚类分组不需要提前被告知所划分的组应该是什么样的,因为我们甚至可能都不知道我们再寻找什么,所以聚类是用于知识发现而不是预测,所以,聚类有时也叫无监督学习。
假设有一批关于计算机科学和数学统计相关的人才,这批人才中计算机人才、机器学习人才、数学人才三类,那么该如何将这批数据进行聚类?
我们可以直观的感觉到应该如下分类:
但问题是计算机不会直观的去观察数据,首先将这批数据向量化,K-means聚类会随机在这些点中找到三个点,然后计算所有的样本到当前三个点的距离大小,判断样本点与当前三个点哪个距离比较
当经过一次计算之后,就是经过了一次迭代过程,当完成一次迭代后,就分出来是三个类别(簇),每个类别中都有质心。然后进行下一次迭代,继续计算所有点到三个类别中心点的距离,按照每个样本点与哪个质心距离最近就属于哪个簇,以此类推,继续迭代。
当本次计算的中心点的距离较上次计算的中心点的位置不再变化,那么停止迭代。
K值的选择一般可以根据问题的内容来确定,也可以根据肘部法来确定。如图:横轴表示K值的选择,纵轴表示对应的K值下所有聚类的平均畸变程度。
每个类的畸变程度是每个类别下每个样本到质心的位置距离的平方和。类内部成员越是紧凑,那么类的畸变程度越低,这个类内部相似性越大,聚类也就越好。如图,在k=1请况下,相比k=2情况下,类的平均畸变程度变化大,说明,k=2的情况类的紧凑程度比k=1情况下要紧凑的多。同理,发现当k=3之后,随着k的增大,类的平均畸变程度变化不大,说明k=3是比较好的k值。k>3后类的平均畸变程度变化不大,聚类的个数越多,有可能类与类之间的相似度越大,类的内部反而没有相似度,这种聚类也是不好的。举个极端的例子,有1000个数据,分成1000个类,那么类的平均畸变程度是0,那么每个数据都是一类,类与类之间的相似度大,类内部没有相似性。
K-means算法的思想就是对空间K个点为中心进行聚类,对靠近他们的对象进行归类,通过迭代的方法,逐次更新聚类中心(质心)的值,直到得到最好的聚类结果。K-means过程:
1.首先选择k个类别的中心点
2.对任意一个样本,求其到各类中心的距离,将该样本归到距离最短的中心所在的类
3.聚好类后,重新计算每个聚类的中心点位置
4.重复2,3步骤迭代,直到k个类中心点的位置不变,或者达到一定的迭代次数,则迭代结束,否则继续迭代
K-means算法假设聚类为3类,开始选取每个类的中心点的时候是随机选取,有可能三个点选取的位置非常近,导致后面每次聚类重新求各类中心的迭代次数增加。K-means++在选取第一个聚类中心点的时候也是随机选取,当选取第二个中心点的时候,距离当前已经选择的聚类中心点的距离越远的点会有更高的概率被选中,假设已经选取n个点,当选取第n+1个聚类中心时,距离当前n个聚类中心点越远的点越会被选中,这种思想是聚类中心的点离的越远越好,这样就大大降低的找到最终聚类各个中心点的迭代次数,提高了效率。
现在一般说的kmeans算法都是 kmeans++算法
数据
1.658985 4.285136
-3.453687 3.424321
4.838138 -1.151539
-5.379713 -3.362104
...
自己实现
# encoding:utf-8
import numpy as np
# 将每行数据放入一个数组内列表,返回一个二维列表
def loadDataSet
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。