Python:验证k-means聚类

时间:2016-02-10 03:22:07

标签: python cluster-analysis k-means

我想比较使用Fragment fragment = fragmentManager.findFragmentByTag.findFragmentById (R.id.fragment); or Fragment currentFragment = fragmentManager.findFragmentByTag("fragmentTag"); 的k-means库计算的两个不同的聚类。

sklearn

哪里

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)

但当然由于标签不起作用。有没有办法比较两个集群?

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我用这种方式解决了,可能不是很优雅,但它有效

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

答案 2 :(得分:0)

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

它解决了完全群集号码发生变化的问题。