往期经典回顾
从零开始学Python【20】--线性回归(理论部分)
从零开始学Python【21】--线性回归(实战部分)
从零开始学Python【22】--线性回归诊断(第一部分)
从零开始学Python【23】--线性回归诊断(第二部分)
从零开始学Python【24】--岭回归及LASSO回归(理论部分)
从零开始学Python【25】--岭回归及LASSO回归(实战部分)
从零开始学Python【26】--Logistic回归(理论部分)
从零开始学Python【27】--Logistic回归(实战部分)
前言
聚类是一种无监督的挖掘算法,其目的就是将N个样本按照特定的变量划分为K个簇(K,而这个簇所表现的特征是:簇内样本相似度高(方差小),而簇间的相似度低(方差大)。关于聚类算法有很多,如K均值聚类、K中心聚类、密度聚类、谱系聚类、最大期望聚类等。本文我们介绍的是K均值聚类,它是公认的十大挖掘算法之一,其优点是计算速度快、原理易于理解及聚类效果理想。
原理说明
K均值算法是通过样本间的距离来衡量它们之间的相似度,如果两个样本聚类越远,则相似度越低,否则相似度越高。一般,相似度S可以是距离的倒数或距离平方的倒数,它们之间是成反比的。最常用的距离计算方法是曼哈顿距离和欧氏距离,它们的公式分别如下所示:
不妨我们就以欧氏距离为例,来看看K均值算法是如何完成聚类任务的,其聚类步骤如下:
在n个观测中随机挑选K个观测,每个观测代表一个簇;
计算剩余的每个对象到各个簇的欧式距离,将他们分配到最相近的簇中,并计算新簇的均值;
使用新的均值作为新簇的中心,再重新分配所有对象,计算簇均值
重复第二步和第三步,直到分配稳定,形成最终的k个类。
具体实现过程可以如下图所示:
从刚刚上面说明的几个步骤中,你是否有一些疑问呢?例如初始的K值如何确定,即聚类之前我必须清楚我应该聚为几类;什么叫分配稳定,即在聚类的迭代过程中,什么时候算完。为了解答这两个问题,接下来我们详细的说明一番。
设想,如果我们能够非常合理的将N个观测聚为K类(簇),根据前面提到的簇内样本相似度高(方差小)这个思想,我们可以构造一个目标函数,来说明聚类效果能够使各个簇内离差平方和之和达到最小。首先来看一下各个簇内离差平方和之和的表达式:
其实,我们就是要求这个和的最小值。你可能会问,当簇的个数与样本个数一致(每个样本都代表一个类,簇中样本与其均值相等)时,不就可以得到最小值0了嘛,好吧,那就不是聚类了。所以,为了实现聚类,如何求得这个目标函数的最小值呢?仍然通过微分(对簇的个数j求导)的方法来实现,具体推导如下:
哎?是不是很好玩,这个最优化的结果就是计算簇的均值哎!这不就正好和K均值聚类算法的簇中心不言而合了嘛。
第二个问题,迭代啥时候算个完呢?一般如下两种情况时,将会停止聚类的迭代过程:
尽管K均值聚类算法具有计算速度快、原理易于理解及聚类效果理想这些优点,但他还是存在一些缺点的,如:
最后,如果你使用K均值聚类时,一定要注意如下两点:
结语
OK,关于K均值聚类算法的理论部分我们就分享到这里,下一期,我将针对K均值聚类使用Python和R语言做一个实战性的案例。如果你有任何问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让更多的人学习和进步。
关注“每天进步一点点2015”,与小编一同进步!