2017-08-01 3 views
1

異なるサイズの集合Sのパーティション/クラスタリング(P1とP2)と比較したいと思います。例:Python scikit-learn異なるサイズのパーティションで相互情報が正しく動作しない

S = [1, 2, 3, 4, 5, 6] 
P1 = [[1, 2], [3,4], [5,6]] 
P2 = [ [1,2,3,4], [5, 6]] 

私が読んだことから、相互情報がアプローチであり、それはscikit-learnで実装されています。私は私のコードを実装しようとすると、定義から、それは、パーティションのサイズが同じでなければならない、というものはありません(http://scikit-learn.org/stable/modules/generated/sklearn.metrics.mutual_info_score.html).l

は、しかし、私は、異なるサイズにエラーが発生します。

from sklearn import metrics 
P1 = [[1, 2], [3,4], [5,6]] 
P2 = [ [1,2,3,4], [5, 6]] 
metrics.mutual_info_score(P1,P2) 


ValueErrorTraceback (most recent call last) 
<ipython-input-183-d5cb8d32ce7d> in <module>() 
     2 P2 = [ [1,2,3,4], [5, 6]] 
     3 
----> 4 metrics.mutual_info_score(P1,P2) 

/home/user/anaconda2/lib/python2.7/site-packages/sklearn/metrics/cluster/supervised.pyc in mutual_info_score(labels_true, labels_pred, contingency) 
    556  """ 
    557  if contingency is None: 
--> 558   labels_true, labels_pred = check_clusterings(labels_true, labels_pred) 
    559   contingency = contingency_matrix(labels_true, labels_pred) 
    560  contingency = np.array(contingency, dtype='float') 

/home/user/anaconda2/lib/python2.7/site-packages/sklearn/metrics/cluster/supervised.pyc in check_clusterings(labels_true, labels_pred) 
    34  if labels_true.ndim != 1: 
    35   raise ValueError(
---> 36    "labels_true must be 1D: shape is %r" % (labels_true.shape,)) 
    37  if labels_pred.ndim != 1: 
    38   raise ValueError(

ValueError: labels_true must be 1D: shape is (3, 2) 

形がにあります

答えて

0

エラーは、情報が関数に渡された形式で表示されます。正しい形式でリストを指定しています。パーティションへのグローバルセットの各要素のラベルの数(この場合、各eleそれぞれのラベルは、それが属するクラスターに対応する必要があります。したがって、同じラベルを持つエレメントは同じクラスター内にあります。例を解決するには、次の

S = [1, 2, 3, 4, 5, 6] 
P1 = [[1, 2], [3,4], [5,6]] 
P2 = [ [1,2,3,4], [5, 6]] 
labs_1 = [ 1, 1, 2, 2, 3, 3] 
labs_2 = [1, 1, 1, 1, 2, 2] 
metrics.mutual_info_score(labs_1, labs_2) 

答えは次のようになります。

0.636514168294813 

私たちは、もともと与えられたパーティションのフォーマットのための相互情報量を計算したい場合は、1次のコードを使用することができます

from sklearn import metrics 
from __future__ import division 
import numpy as np 

S = [1, 2, 3, 4, 5, 6] 
P1 = [[1, 2], [3,4], [5,6]] 
P2 = [ [1,2,3,4], [5, 6]] 
set_partition1 = [set(p) for p in P1] 
set_partition2 = [set(p) for p in P2] 

def prob_dist(clustering, cluster, N): 
    return len(clustering[cluster])/N 

def prob_joint_dist(clustering1, clustering2, cluster1, cluster2, N): 
    ''' 
    N(int): total number of elements. 
    clustering1(list): first partition 
    clustering2(list): second partition 
    cluster1(int): index of cluster of the first partition 
    cluster2(int): index of cluster of second partition 
    ''' 
    c1 = clustering1[cluster1] 
    c2 = clustering2[cluster2] 
    n_ij = len(set(c1).intersection(c2)) 
    return n_ij/N 

def mutual_info(clustering1, clustering2, N): 
    ''' 
    clustering1(list): first partition 
    clustering2(list): second partition 
    Note for it to work division from __future__ must be imported 
    ''' 
    n_clas = len(clustering1) 
    n_com = len(clustering2) 
    mutual_info = 0 
    for i in range(n_clas): 
     for j in range(n_com): 
      p_i = prob_dist(clustering1, i, N) 
      p_j = prob_dist(clustering2, j, N) 
      R_ij = prob_joint_dist(clustering1, clustering2, i, j, N) 
      if R_ij > 0: 
       mutual_info += R_ij*np.log(R_ij/(p_i * p_j)) 
    return mutual_info 

mutual_info(set_partition1, set_partition2, len(S)) 
を同じ応答を与える

0.63651416829481278 

log2ではなく自然対数を使用していることに注意してください。コードは簡単に適応できます。

関連する問題