K-Means++算法
算法步骤
K-Means算法对初始质心是敏感的,不同的初始质心,可能会导致不同的聚类效果(SSE)与收敛速度。虽然随机初始化多组质心,可以缓解这一问题,但是,这通常限于聚类数量(簇)较少的情况,如果聚类数量较多,随机初始化多组质心的方式可能就不会有效了。
鉴于此,我们完全可以在选择初始质心上进行优化,这就是K-Means++算法。
K-Means++与K-Means的区别在于选择初始质心的方式不同,对于K-Means,其使用完全随机的方式来选择初始质心,对于K-Means++,其选择初始质心的步骤如下:
- 从训练数据中随机选择一个样本,作为初始质心。
- 对于任意一个非质心样本x(i),计算x(i)与现有最近质心的距离D(x(i))。
- 根据概率D(x(i))2 / ∑ mj=1D(x(i))^2 来选择下一个质心x(i),m为非质心样本的数量。
- 重复步骤2与3,直到选择k个质心为止。
当选择好初始质心后,剩余的计算方式,K-Means++与K-Means是相同的。
程序演示
在sklearn中,已经实现了K-Means++算法,只需要将init参数设置为‘k-means++’即可(默认值)。
kmeans = KMeans(n_clusters=4, init='k-means++')
kmeans.fit(x)
plot_cluster(kmeans,x)
Mini Batch K-Means算法
算法步骤
K-Means算法每次迭代都会使用所有数据参与运算,当数据集较大时,该算法可能会花费较多的计算时间。Mini Batch K-Means算法(小批量K-Means算法)是K-Means算法的一种变化,与K-Means算法具有相同的优化目标(目标函数)。不同的是,Mini Batch K-Means算法每次迭代使用小批量训练样本,逐批次累计的方式进行计算,这样可以大大减少计算时间,在聚类效果上,通常只会略差于K-Means算法。
Mini Batch K-Means算法步骤如下:
- 从数据集中随机选择部分数据,使用K-Means算法在这部分随机数据上聚类,获取质心。
- 从数据集中随机选择部分数据,形成一个批次,将该批次数据分配给最近的质心。
- 根据现有的数据集(当前批次数据+所有以前的数据)更新质心。
- 重复步骤2与3,直到质心变化小于指定的阈值或者到达最大迭代次数为止。
程序演示
生成数据集
在sklearn中,我们可以使用make_blobs方法生成用于聚类的数据集。
import time
import pandas as pd
from sklearn.cluster import MiniBatchKMeans, KMeans
from sklearn.metrics.pairwise import pairwise_distances_argmin
from sklearn.datasets import make_blobs
centers = [[1,1],[-1,-1],[1,-1]]
#生成用于聚类的数据。
#n_samples:样本数量。
#n_features:特征数量。
#centers:聚类中心。
#cluster_std:簇的标准差。可以统一指定,也可以为每个簇指定不同的标准差。
#random_state:随机种子,用来生成样本数据。
x, y = make_blobs(n_samples=3000, n_features=2, centers=centers,
cluster_std=0.7, random_state