Python: 验证 k 均值聚类

Python: validation k-means clustering

我想比较使用 sklearn.

的 k-means 库计算的两个不同集群
from sklearn.cluster import KMeans

ya = KMeans(n_clusters=3).fit_predict(Xa)
yb = KMeans(n_clusters=3).fit_predict(Xb)

哪里

ya
array([0, 2, 1, 1, 2, 2, 0, 2, 2, 1, 0, 0, 1, 2, 0, 1, 0, 0, 0, 0, 2, 2, 2,
       2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 0, 1, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2,
       2, 0, 1, 0, 2, 2, 2], dtype=int32)

yb
array([1, 2, 0, 0, 2, 2, 1, 2, 2, 0, 1, 1, 0, 2, 1, 0, 1, 1, 1, 1, 2, 2, 2,
       2, 2, 1, 2, 1, 2, 1, 2, 2, 2, 1, 1, 0, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2,
       2, 1, 0, 1, 2, 2, 2], dtype=int32)

集群相同,但标签不同。为了计算我所做的差异:

sm = difflib.SequenceMatcher(None,list(ya),list(yb))
sm.ratio()

但是由于标签的原因,它当然不起作用。有什么方法可以比较两个集群吗?

通常,使用 confusion matrix 评估具有已知目标的聚类。你可以在你的情况下使用它,即使它们都不是真正的目标。

如果您只想直接比较数组,您可以将一个数组的值映射到另一个数组:

ya = np.array([{0:1, 2:2, 1:0}[a] for a in ya])

我是这样解决的,可能不是很优雅,但是很管用

ya = KMeans(n_clusters=3).fit_predict(Xa)
yb = KMeans(n_clusters=3).fit_predict(Xb)

ya= KMeans(n_clusters=3).fit_predict(Xa)
cla = list()
m = 0
for i in range(0,3):
    tmp = np.where(ya == i)
    cla.append(list(tmp[0]))
cla = sort(cla)


yb= KMeans(n_clusters=3).fit_predict(Xb)
clb = list()
m = 0
for i in range(0,3):
    tmp = np.where(yb == i)
    clb.append(list(tmp[0]))
clb = sort(clb)
e = 0
for i in range(0,3):
    sm = difflib.SequenceMatcher(None,list(cla[i]),list(clb[i]))
    e += 1 - sm.ratio()

比较聚类(或聚类和 类!)的常用方法是 调整后的随机指数 (ARI)。

正好解决了簇号变化的问题