美文网首页机器学习算法
机器学习--K-means算法优化

机器学习--K-means算法优化

作者: YCzhao | 来源:发表于2018-11-04 22:01 被阅读0次

    主要的聚类算法可以划分为如下几类:划分方法、层次方法、基于密度的方法、基于网格的方法以及基于模型的方法。
    目前,聚类问题的研究不仅仅局限于上述的硬聚类(即每一个数据只能被归为一类,数据集中每一个样本都是被100%确定得分到某一个类别中),模糊聚类也是聚类分析中
    研究较为广泛的一个分支。模糊聚类(通过隶属函数来确定每个数据隶属于各个簇的程度,而不是将一个数据对象硬性地归类到某一簇中,可以理解为每个样本是以一定的概率被分到某一个类别中)。
    以下对四种硬聚类算法(K-means++,二分K-means,ISODATA和Kernel K-means)进行
    介绍:

    1. K-means++
      假设已经选取了n个初始聚类中心(0<n<k), 则在选取第n+1个聚类中心时: 距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心, 在选取第一个聚类中心(n=1)时同样通过随机的方法.可以说这也符合我们的直觉:聚类中心当然是互相离得越远越好

    2. ISODATA

    • 类别数目随着聚类过程而变化
    • 对类别数的'合并'(当聚类结果某一类中样本数太少, 或两个类间的距离太近时)
    • '分裂' (当聚类结果中某一类的内方差太大, 将该类进行分裂)
    1. Kernel K-means
      kernel k-means,就是将每个样本进行一个投射到高维空间的处理,然后再将处理后的数据使用普通的k-means算法进行聚类

    2. 二分K-means

    • 首先将所有点作为一个簇, 然后将该簇一分为二. 之后选择能最大限度降低聚类代价函数(也就是误差平方和)和簇划分为两个簇. 一次进行下去, 直到簇的数目等于用户给定的数目K为止.
    • 隐含的一个原则是: 因为聚类的误差平方和能够衡量聚类性能, 该值越小表示数据点越接近于他们的质心, 聚类效果就越好. 所以我们就需要对误差平方和最大的簇进行再一次划分, 因为误差平方和越大, 表示该簇聚类效果越不好, 越有可能是多个簇被当成了一个簇, 所以我们首先需要对这个簇进行划分.
    • 二分K均值算法可以加速K-means算法的执行速度, 因为它的相似度计算少了不受初始化问题的影响, 因为这里不存在随机点的选取, 且每一步都保证了误差最小
    1. Mini Batch K-Means(适合大数据的聚类算法)
      大数据量是什么量级?通过当样本量大于1万做聚类时,就需要考虑选用MiniBatch K-Means算法。
      Mini Batch KMeans使用了一个种叫做Mini Batch(分批处理)的方法对数据点之间的距离进行计算。Mini Batch的好处是计算过程中不必使用所有的数据样本,而是从不同类别的样本中抽取一部分样本来代表各自类型进行计算。由于计算样本量少,所以会相应的减少运行时间,但另一方面抽样也必然会带来准确度的下降。

    该算法的迭代步骤有两步
    1. 从数据集中随机抽取一些数据形成小批量, 把他们分配给最近的质心
    2. 更新质心
    与K均值算法相比, 数据的更新是在每个小的样本集上. 对于每一个小批量, 通过计算平均值得到更新质心, 并把小批量里的试卷分配给该质心, 随着迭代次数的增加, 这些质心的变化是逐渐减小的, 直到质心稳定或达到指定的迭代次数, 停止计算

    案列
    用MiniBatch-KMeans对生成的数据集进行聚类,并查看的效果

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.cluster import MiniBatchKMeans, KMeans
    from sklearn import metrics
    from sklearn.datasets.samples_generator import make_blobs
    # X为样本特征,Y为样本簇类别, 共1000个样本,每个样本4个特征,共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()
    

    输入如下图:


    生成数据
    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()
    

    最终结果如下:

    实现效果
    由此可以得出K=4时, 得分最高, 聚类效果最好

    相关文章

      网友评论

        本文标题:机器学习--K-means算法优化

        本文链接:https://www.haomeiwen.com/subject/vzvdxqtx.html