毫升 | 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