📜  毫升 | Mini Batch K-means 聚类算法

📅  最后修改于: 2022-05-13 01:54:57.336000             🧑  作者: Mango

毫升 | Mini Batch K-means 聚类算法

先决条件:K-Means 聚类中 K 的最优值

K-means 是最流行的聚类算法之一,主要是因为它具有良好的时间性能。随着要分析的数据集大小的增加,K-means 的计算时间增加,因为它需要将整个数据集放在主存中。出于这个原因,已经提出了几种方法来降低算法的时间和空间成本。一种不同的方法是Mini batch K-means algorithm

Mini Batch K-means 算法的主要思想是使用固定大小的随机小批量数据,因此可以将它们存储在内存中。每次迭代都会从数据集中获得一个新的随机样本并用于更新集群,并重复此操作直到收敛。每个小批量使用原型值和数据的凸组合来更新集群,应用一个随着迭代次数而降低的学习率。该学习率是在此过程中分配给集群的数据数量的倒数。随着迭代次数的增加,新数据的影响会降低,因此当连续几次迭代中聚类没有发生变化时,可以检测到收敛。
实证结果表明,它可以以牺牲一些聚类质量为代价来获得大量的计算时间节省,但尚未对该算法进行广泛的研究来衡量数据集的特征,例如聚类的数量或它的大小,影响隔断质量。

该算法在每次迭代中随机选择小批数据集。批次中的每个数据都分配给集群,具体取决于集群质心的先前位置。然后它根据批次中的新点更新集群质心的位置。更新是梯度下降更新,比普通的Batch K-Means 更新快得多。

下面是Mini batch K-means的算法——

Given a dataset D = {d1, d2, d3, .....dn},
                       no. of iterations t,
                       batch size b, 
                       no. of clusters k.

k clusters C = {c1, c2, c3, ......ck}

initialize k cluster centers O = {o1, o2, .......ok}
# _initialize each cluster
Ci = Φ (1=< i =< k)
# _initialize no. of data in each cluster
Nci = 0 (1=< i =< k)

for j=1 to t do:
    # M is the batch dataset and xm
    # is the sample randomly chosen from D
    M = {xm | 1 =< m =< b}

    # catch cluster center for each
    # sample in the batch data set
    for m=1 to b do:
        oi(xm) = sum(xm)/|c|i (xm ε M and xm ε ci)
    end for
    # update the cluster center with each batch set

     for m=1 to b do:
        # get the cluster center for xm
        oi = oi(xm)
        # update number of data for each cluster center
        Nci = Nci + 1
        #calculate learning rate for each cluster center
        lr=1/Nci
        # take gradient step to update cluster center
        oi = (1-lr)oi + lr*xm
     end for
end for


使用scikit-learn库对上述算法的Python实现:

from sklearn.cluster import MiniBatchKMeans, KMeans
from sklearn.metrics.pairwise import pairwise_distances_argmin
from sklearn.datasets.samples_generator import make_blobs
  
# Load data in X 
batch_size = 45
centers = [[1, 1], [-2, -1], [1, -2], [1, 9]]
n_clusters = len(centers)
X, labels_true = make_blobs(n_samples = 3000,
                            centers = centers,
                            cluster_std = 0.9)
  
# perform the mini batch K-means
mbk = MiniBatchKMeans(init ='k-means++', n_clusters = 4,
                      batch_size = batch_size, n_init = 10,
                      max_no_improvement = 10, verbose = 0)
  
mbk.fit(X)
mbk_means_cluster_centers = np.sort(mbk.cluster_centers_, axis = 0)
mbk_means_labels = pairwise_distances_argmin(X, mbk_means_cluster_centers)
  
# print the labels of each data
print(mbk_means_labels)

小批量 K-means 速度更快,但给出的结果与普通批量 K-means 略有不同。
在这里,我们对一组数据进行聚类,首先使用 K-means,然后使用 mini-batch K-means,并绘制结果。我们还将绘制两种算法之间标记不同的点。

随着集群数量和数据数量的增加,计算时间的相对节省也会增加。只有当集群的数量非常大时,计算时间的节省才会更加明显。当集群数量越大时,batch size 对计算时间的影响也更加明显。可以得出结论,增加聚类的数量会降低小批量 K-means 解决方案与 K-means 解决方案的相似性。尽管分区之间的一致性随着集群数量的增加而降低,但目标函数并没有以相同的速率退化。这意味着最终的分区不同,但质量更接近。参考:
https://upcommons.upc.edu/bitstream/handle/2117/23414/R13-8.pdf
https://scikit-learn.org/stable/modules/generated/sklearn.cluster.MiniBatchKMeans.html