Python:验证k-means聚类

Python:验证k-means聚类,python,cluster-analysis,k-means,Python,Cluster Analysis,K Means,我想比较使用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

我想比较使用
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)

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

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

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

通常,对已知目标的簇进行评估是使用一个。您可以在您的案例中使用此选项,即使两者都不是真正的目标

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

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()

比较集群(或集群和类!)的常用方法是thr调整后的兰德指数(ARI)


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

我的问题是,即使两个簇是相同的,标签也会不同。我更新了答案,以从一个数组映射到另一个数组,这样做有效吗?问题是标签似乎是随机的,你不知道它是如何变化的。我认为这取决于数组的初始化算法。如果将随机状态种子设置为整数,则每次都应得到相同的结果。
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()