本文来说讲K平均聚类算法(K-Means Clustering),K Means算法是全部聚类算法中最经典的一种,由于它不断在直觉上容易理解,并且它的计算效率也是很是的高。css
在讲K-Means算法前咱们先看看,这个算法能作什么。下面有一组数据,咱们想要把数据分红若干个类,在某一类当中,这些数据的彼此之间的距离比较近。对于这个大问题,咱们有两个小问题。第一个是,咱们如何肯定分的类的个数;第二个问题是,如何在肯定类的个数的状况下,如何肯定每一个类中包含的元素。那么K-Means算法就能够自动帮助咱们找到最佳的聚类的方式。如图所示,K-Means算法讲这些数据分红了红蓝绿三组。python
那么咱们就来看看K-Means算法的工做流程。算法
下面从具体的例子来说述这个步骤。假设有一组数据,咱们要分配成两类,即K=2;而后随机选择两个点,分别计算每一个点距离这两个点的距离。这里能够有个比较简单的计算方式,咱们做出这两个点的垂直平分线,那么这个绿线上方的点都是离蓝色点比较近,下面的离红色比较近。app
那么咱们就把上面的点分做蓝组,下面的分为红组。目前的步骤至关于已经进行到第三步。接下来第四步,更新每组数据的中心点,那么咱们就找到了新的中心点能够进行第五步,依据新的中心点,从新进行分配。less
不断重复45步骤,直到分配的结果和前一步分配的结果是一致的。dom
K-Means算法能够以一种算法的方式告诉咱们最佳的聚类的方式,这里就获得了左下方红组,右上方蓝组的这样一个结论。工具
如今看看初始点的选择对最终K-Meas聚类结果的影响。下面有一个例子,咱们须要用K-Means算法对这组数据进行聚类,选择K=3。这里很明显有三类,咱们这里就直接选择最佳的中心点并标记出这三类数据。学习
那么这里是咱们肉眼看出来的三个中心点,但若是咱们选择的不是这最佳的中心点,则须要重复上述的45步,好比选的是下面这三个中心点。spa
那么这时就须要对中心点进行位移,但因为这个位移是很是小的,因此新的分类结果和以前并不会有什么改变,因此算法就这样结束了。code
这样获得的分类结果和以前那个显然是不一样的。但这样就发生了同一组数据,却产生了两个不一样的分类结果。区别就在于选择了不一样的初始中心点。咱们很差直接说哪个分类算法更好,须要有一个方法来判断如何选择初始中心点。也就是说初始中心点不能随机进行选择了。如今有一个K-Means算法的更新版本,叫作K-Means++,它完美的解决了初始化中心点的陷阱,数学上来说叫作局部最小值的一个陷阱。不管在R仍是Python中,这个K-Means++都已经加入了算法当中,所以不用担忧以后的代码实现会不会掉入这个陷阱。
上文讲到的是选择中心点的陷阱,那么如今在谈谈如何选择类的个数。从直观上,上文中的图像大部分人应该很容易想到分为3组,也有的人可能想分为2组,但怎样选择才是最佳的分组方式是个须要好好研究的问题。首先来定义一个数学的量,组内平方和(WCSS)。
来看这个表达式,一共有3项,每一项表明对于每一组的平方和。好比第一项,就是对全部数据点对这一组中心点距离的平方。很显然,若是每一组的数据蜷缩的越紧,那么这个平方和就越小。
那么若是将这组数据分为1组,那么这个组内平方和只有一项,那么这个结果很显然会很大。若是分为2组,那么结果比1组的确定要小,当分为3组时,获得的结果会更小。也就是说,随着分组的个数增长,这个组内平方和会逐渐变小。那么如今的问题来了,如何选择最合适的分组的个数?
这里要介绍一个法则,叫作手肘法则(The Elbow Method)。咱们把随着分组个数的增长,WCSS的结果的图像画出来。
找到最像手肘的这个点,这里就是3,那么这个点,就是最佳的分组的个数。这个曲线上能够看到,从1到2,和2到3时,降低的速率都是比较快的,但从3日后,降低的速率都是很是小的,那么咱们要找的就是这样一个点,在到达这个点以前和从这个点开始的降低,速率的变化时最大的。
咱们此次要用到的数据集部分以下,反映的是一个购物商场的购物信息。最后一列Spending Score是购物商场根据客户的信息打出的客户的评分,分数越低意味着客户花的钱越少,越高觉得着客户花的越多。商场但愿经过对客户的年收入和购物指数来进行分群。
CustomerID | Genre | Age | Annual Income (k$) | Spending Score (1-100) |
---|---|---|---|---|
0001 | Male | 19 | 15 | 39 |
0002 | Male | 21 | 15 | 81 |
0003 | Female | 20 | 16 | 6 |
0004 | Female | 23 | 16 | 77 |
那么这个问题的自变量就是第三四列,年收入和购物指数。但它是个无监督学习,所以没有因变量。这里咱们要用到的工具是sklearn.cluster中的KMeans类。
首先要计算各个分组的WCSS。这里咱们计算组数从1到10的状况。
wcss = [] for i in range(1, 11): kmeans = KMeans(n_clusters=i, max_iter=300, n_init=10, init='k-means++', random_state=0) kmeans.fit(X) wcss.append(kmeans.inertia_) plt.plot(range(1, 11), wcss) plt.title('The Elbow Method') plt.xlabel('Number of Clusters') plt.ylabel('WCSS') plt.show()
这里的KMeans中的参数也解释下,n_clusters指的是分组数,max_iter指的是每一次计算时最大的循环个数,这里使用默认值300,n_init表明每个作K平均算法时,会对多少组不一样的中心值进行计算。init这个参数很是重要,指的是咱们如何选择初始值,最简单的是random,即随机,但为了不掉入随机初始值陷阱,这里使用k-means++。
拟合好后获得组间距离就是kmeans.inertia_。这样咱们就能够画出对于不一样的分组数,wcss的图像。
那么经过手肘法则,能够获得最佳的分组个数是5组,则能够开始拟合数据。
# Applying the k-means to the mall dataset kmeans = KMeans(n_clusters=5, max_iter=300, n_init=10, init='k-means++', random_state=0) y_kmeans = kmeans.fit_predict(X)
拟合好数据后,获得的y_means实际上就是0-4五个分组。咱们来将分组后的图像画出来看看。
# Visualizing the clusters plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s=100, c='red', label='Careful') plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s=100, c='blue', label='Standard') plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s=100, c='green', label='Target') plt.scatter(X[y_kmeans == 3, 0], X[y_kmeans == 3, 1], s=100, c='cyan', label='Careless') plt.scatter(X[y_kmeans == 4, 0], X[y_kmeans == 4, 1], s=100, c='magenta', label='Sensible') plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='yellow', label='Centroids') plt.title('Clusters of clients') plt.xlabel('Annual Income (k$)') plt.ylabel('Spending Score (1-100)') plt.legend() plt.show()
获得的图像以下,咱们就能够根据图像来进行分析,给予不一样的标签。
以上,就是K-Means聚类算法的相关基础知识点。