2016-02-10 2 views
0

Я хочу сравнить два разных кластера, рассчитанные с помощью библиотеки k-средств sklearn.Python: проверка k-означает кластеризацию

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

Но, конечно, это не работает из-за ярлыков. Есть ли способ сравнить два кластера?

ответ

0

Обычная мера сравнения кластеров (или кластеров и классов!) Составляет скорректированный индекс rand (ARI).

Он решает точно проблема изменения номера кластера.

0

Как правило, оценка кластеров с известными целями выполняется с использованием confusion matrix. Вы можете использовать это в своем случае, хотя ни одна из них не является целью.

Если вы просто хотите, чтобы сравнить массивы непосредственно можно сопоставить значения одного к другому:

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

Моя проблема - это метка, которая отличается, даже если оба кластера одинаковы. – emax

+0

Я обновил ответ на карту из одного массива в другой - это работает? – vahndi

+0

Проблема в том, что маркировка кажется случайной, и вы не изменяете ее. – emax

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() 
Смежные вопросы