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

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

  1. K-means++
    假设已经选取了n个初始聚类中心(0

  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算法优化)