根据网上的参考文献,简单的概况了一下要点和具体怎么实现。
实现聚类首先要了解一下几个要点:
什么是聚类?什么是簇?
聚类(clustering)是指根据“物以类聚”原理,将本身没有类别的样本聚集成不同的组,这样的一组数据对象的集合叫做簇,并且对每一个这样的簇进行描述的过程。它的目的是使得属于同一个簇的样本之间应该彼此相似,而不同簇的样本应该足够不相似。
如下图,有4个簇:
Inertia?
簇内所有点到该簇的质心的距离的总和。质心可以理解为簇的中心点。
可以说Inertia越小,我们的聚类越好
距离怎么计算呢?
计算俩点之间的距离有很多公式,我们以欧式距离公式为例。
K-Means是什么?
K-Means是基于质心或基于距离的算法,根据每个点到质心的距离来分别计算出属于哪个簇。
K-Means算法主要目标是计算出最小的各个点到自质心距离的总和。
原文如下:
The main objective of the K-Means algorithm is to minimize the sum of distances between the points and their respective cluster centroid.
K-Means实现步骤:
第一步和第二步: 选择簇的个数K, 然后随意选择点位质心。我们假设K为2。
第三步:将所有点分配到质心距离最近的簇。这样我们就完成了第一次簇的选择。
第四步:根据现在簇的位置,重新计算簇的质心。按照最小距离之和的原则找出质心的位置。有了新的质心也就有了新的簇。
第五步:重复第三步和第四步
计算出新质心并基于各个点与质心的距离将所有点分配给簇的步骤是单次迭代。
那什么时候该停止迭代呢 ?
停止K-means聚类的三种标准:
a.新形成的簇的质心不会改变
b.数据点保留在同一个簇中
c.达到最大迭代次数
以第一个标准为例,如果新形成的簇的质心没有变化,我们就可以停止迭代。
即使在多次迭代之后,所有簇都还是相同的质心,我们可以说该算法没有学习任何新模式,所以它是停止训练的标志。
现在让我们用PYTHON代码实现上述逻辑。
以用户的收入和贷款分类用户为例子。数据可以在原文章上下载,链接在最底部。
导入需要的库,然后查看前五行数据看一下数据结构。
Pandas, numpy, matplotlib等等。
选择"LoanAmount","ApplicantIncome"两列数据作为数据可视化的X,Y轴。
可视化效果如下:
接下来我们进行第一步和第二部:选择要分几个cluster(K),然后随机选择样本。
第三步:利用欧式距离公式计算个点到质心的距离
第四步:找到新的质心
第五步:有新的质心更新就重新计算距离,知道不在有更新。
代码详解如下图:
代码其实分解来看的话很好理解。
*PS:如果用 sklearn库的话,这些方法都被封装好了。直接调用就行。但是为了理解算法原理推荐过一遍上述代码。
执行上述代码会得到下列结果。其中0表示质心不在发生变更。
最后我们可以可视化我们的聚类成果。
原文链接:https://www.analyticsvidhya.com/blog/2019/08/comprehensive-guide-k-means-clustering/
网友评论