k-means 算法

摘要:
基于样本的MiniBatchK-Means算法的对应类是MiniBatchKMeans。由于K-Means是一种局部最优迭代算法,其结果受初始值的影响,因此需要多次运行以选择更好的聚类效果。默认值为10,通常不需要更改。通常建议使用默认的“k-means++”。“Full”是我们传统的K-Means算法,“elkan”是我们的elkanK-Means。
1. scikit-learn中的K-Means类

    在scikit-learn中,包括两个K-Means的算法,:

                (1)传统的K-Means算法,对应的类是KMeans。

           (2)基于采样的Mini Batch K-Means算法,对应的类是MiniBatchKMeans。

    一般来说,K-Means的算法调参是比较简单的,虽然KMeans类和MiniBatchKMeans类可以选择的参数并不少,但是大多不太需要去调参。:

          (1)用KMeans,一般要注意的仅仅就是k值的选择,即参数n_clusters;

          (2)用MiniBatchKMeans,一般注意n_clusters和batch_size(即采样的数量)

2. KMeans类、MiniBatchKMeans类主要参数

    1、KMeans类的主要参数有:

    1) n_clusters: 即我们的k值,一般需要多试一些值以获得较好的聚类效果。k值好坏的评估标准在下面会讲。

    2)max_iter: 最大的迭代次数,一般如果是凸数据集的话可以不管这个值,如果数据集不是凸的,可能很难收敛,此时可以指定最大的迭代次数让算法可以及时退出循环。

    3)n_init:用不同的初始化质心运行算法的次数。由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,默认是10,一般不需要改。如果你的k值较大,则可以适当增大这个值。

    4)init: 即初始值选择的方式,可以为完全随机选择'random',优化过的'k-means++'或者自己指定初始化的k个质心。一般建议使用默认的'k-means++'。

    5)algorithm:有“auto”, “full” or “elkan”三种选择。"full"就是我们传统的K-Means算法, “elkan”是我们原理篇讲的elkan K-Means算法。默认的"auto"则会根据数据值是否是稀疏的,来决定如何选择"full"和“elkan”。一般数据是稠密的,那么就是 “elkan”,否则就是"full"。一般来说建议直接用默认的"auto"

     

    2、MiniBatchKMeans类的主要参数比KMeans类稍多,主要有:

    1) n_clusters: 即我们的k值,和KMeans类的n_clusters意义一样。

    2)max_iter:最大的迭代次数, 和KMeans类的max_iter意义一样。

    3)n_init:用不同的初始化质心运行算法的次数。这里和KMeans类意义稍有不同,KMeans类里的n_init是用同样的训练集数据来跑不同的初始化质心从而运行算法。而MiniBatchKMeans类的n_init则是每次用不一样的采样数据集来跑不同的初始化质心运行算法。

    4)batch_size:即用来跑Mini Batch KMeans算法的采样集的大小,默认是100.如果发现数据集的类别较多或者噪音点较多,需要增加这个值以达到较好的聚类效果。

    5)init: 即初始值选择的方式,和KMeans类的init意义一样。

    6)init_size: 用来做质心初始值候选的样本个数,默认是batch_size的3倍,一般用默认值就可以了。

    7)reassignment_ratio: 某个类别质心被重新赋值的最大次数比例,这个和max_iter一样是为了控制算法运行时间的。这个比例是占样本总数的比例,乘以样本总数就得到了每个类别质心可以重新赋值的次数。如果取值较高的话算法收敛时间可能会增加,尤其是那些暂时拥有样本数较少的质心。默认是0.01。如果数据量不是超大的话,比如1w以下,建议使用默认值。如果数据量超过1w,类别又比较多,可能需要适当减少这个比例值。具体要根据训练集来决定。

    8)max_no_improvement:即连续多少个Mini Batch没有改善聚类效果的话,就停止算法, 和reassignment_ratio, max_iter一样是为了控制算法运行时间的。默认是10.一般用默认值就足够了。

3. K值的选取标准

    不像监督学习的分类问题和回归问题,无监督聚类没有样本输出,也就没有比较直接的聚类评估方法,但是可以从簇内的稠密程度和簇间的离散程度来评估聚类的效果。

    常见的评价方法:(1)轮廓系数Silhouette Coefficient   

 

 

 

            (2)Calinski-Harabasz Index。

                    Calinski-Harabasz Index计算简单直接,数学计算公式是:

                                                                           k-means 算法第1张

                       n表示聚类的数目 ,k 表示当前的类, trB(k)表示类间协方差矩阵的迹, trW(k) 表示类协方差矩阵的迹

    

    得到的Calinski-Harabasz分数值CH(K)越大则聚类效果越好。其中,类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数会高。

    在scikit-learn中, Calinski-Harabasz Index对应的方法是metrics.calinski_harabaz_score.

5. K-Means类、MiniBatchKMeans应用实例

    下面用KMeans类和MiniBatchKMeans类聚类,并观察比较在不同的k值下Calinski-Harabasz分数。

  (1)随机创建一些二维数据作为训练集,代码如下:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.datasets.samples_generator import make_blobs
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本2个特征,共4个簇,簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分别为[0.4, 0.2, 0.2]
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]], cluster_std=[0.4, 0.2, 0.2, 0.2], 
                  random_state =9)
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()

  (2)用K-Means聚类方法来做聚类,首先选择k=2,代码如下:

from sklearn.cluster import KMeans
y_pred = KMeans(n_clusters=2, random_state=9).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

    用Calinski-Harabasz Index评估的聚类分数:   3116.1706763322227

rom sklearn import metrics
metrics.calinski_harabaz_score(X, y_pred)  

  (3)k=3时候的聚类

from sklearn.cluster import KMeans
y_pred = KMeans(n_clusters=3, random_state=9).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show() 

    Calinski-Harabaz Index评估的k=3时候聚类分数: 2931.625030199556

metrics.calinski_harabaz_score(X, y_pred)  

  (4)k=4时候的聚类

from sklearn.cluster import KMeans
y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

    Calinski-Harabaz Index评估的k=4时候聚类分数:  5924.050613480169

  k=4的聚类分数比k=2和k=3都要高,符合预期,最终选择分为4个簇。

  所以,当特征维度大于2,无法直观可视化观察聚类效果时,用Calinski-Harabaz Index评估是一个很方便有效的方法。

  

  (5)用MiniBatchKMeans的效果,将batch size设置为200. 由于我们的4个簇都是凸的,所以其实batch_size的值只要不是非常的小,对聚类的效果影响不大。

for index, k in enumerate((2,3,4,5)):
    plt.subplot(2,2,index+1)
    y_pred = MiniBatchKMeans(n_clusters=k, batch_size = 200, random_state=9).fit_predict(X)
    score= metrics.calinski_harabaz_score(X, y_pred)  
    plt.scatter(X[:, 0], X[:, 1], c=y_pred)
    plt.text(.99, .01, ('k=%d, score: %.2f' % (k,score)),
                 transform=plt.gca().transAxes, size=10,
                 horizontalalignment='right')
plt.show()

使用MiniBatchKMeans的聚类效果也不错,KMeans类的Calinski-Harabasz Index分数为5924.05,而MiniBatchKMeans的分数稍微低一些,为5921.45。这个差异损耗并不大。

免责声明:文章转载自《k-means 算法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇三系统删除与恢复引导(windows,Ubuntu,deepin)深入理解计算机系统(4.1)---X86的孪生兄弟,Y86指令体系结构下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HAProxy安装配置详解

简介 HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。 HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可...

openssl3.0 加密算法库编程精要 04 详解 EVP API 消息摘要

4.1 消息摘要的概念   消息摘要有好几个名字,比如单项散列函数,Hash 函数,它是一个将可变长度的输入串转换为一个固定长度的输出 串的函数。大多数消息摘要算法都是公开的,它的安全性依赖于它的单向性,如果仅获取到消息摘要的结果,想要从结果 反推出原文几乎是不可能的事情。并且对于输入串的细微改变,都会引发输出串的雪崩式变化,所以消息摘要一般用于校 验数据...

【机器学习】聚类分析的模型评估

  一、聚类算法中的距离   1. 单个样本之间的距离        余弦距离        在聚类分析中,一般需要对数据进行标准化,因为聚类数据会受数据量纲的影响。   在sklearn库中,可调用如下方法进行标准化: 1 from sklearn.preprocessing import StandardScaler 2 data = Standard...

0-1背包问题的分枝—限界算法

  1.分枝—限界法的基本原理 分枝—限界算法类似于回溯法,也是一种在问题的解空间树上搜索问题解的算法。但两者求解方法有两点不同:第一,回溯法只通过约束条件剪去非可行解,而分枝—限界法不仅通过约束条件,而且通过目标函数的限界来减少无效搜索,也就是剪掉了某些不包含最优解的可行解;第二,在解空间树上,回溯法以深度优先搜索,而分枝—限界法则以广度优先或...

图的遍历算法(2)

  这是《计算机算法分析与设计》课件第二章“图与遍历算法”内容的总结。   1.关于有向图   有向图的表示也可以用邻接矩阵和关联矩阵,邻接矩阵的表示和无向图一样,但是关联矩阵为指明边的方向,只用 0,1 两个元素是不够的,可以增加一个元素-1。若i是j的始点,赋值为1,若i是j的终点,赋值为-1,其余赋值为0。   有向图 D 说是连通的是指其基础图是连...

迪杰斯特拉 算法 在游戏中的运用

迪杰斯特拉 (Dijkstra).是算最短节点的。虽然网上有很多文献资料和代码,不过并不适合我的口味。于是简单的改造了下。 纯手工鼠标画图一张。 static void Main(string[] args) { int n = 7, en = 11; //-1表示不可达 int[,] a = new in...