sklearnの凝集クラスタリングコマンドを使用して制約付きクラスタリングを実行しようとしています。アルゴリズムを制約するために、「接続性マトリックス」を要求します。これは次のように説明されます。
接続性の制約は、接続性マトリックス(接続する必要のあるデータセットのインデックスを持つ行と列の共通部分にのみ要素を持つscipyスパース行列)を介して課されます。このマトリックスは、事前情報から構築できます。たとえば、あるページから別のページを指すリンクを持つページをマージするだけでWebページをクラスター化することができます。
アルゴリズムが同じクラスター内にとどまることを強制する観測ペアのリストがあります。これをスパースscipy
行列(coo
またはのいずれかcsr
)に変換できますが、結果のクラスターは制約を強制できません。
いくつかのデータ:
import numpy as np
import scipy as sp
import pandas as pd
import scipy.sparse as ss
from sklearn.cluster import AgglomerativeClustering
# unique ids
ids = np.arange(10)
# Pairs that should belong to the same cluster
mustLink = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'B'])
# Features for training the model
data = pd.DataFrame([
[.0873,-1.619,-1.343],
[0.697456, 0.410943, 0.804333],
[-1.295829, -0.709441, -0.376771],
[-0.404985, -0.107366, 0.875791],
[-0.404985, -0.107366, 0.875791],
[-0.515996, 0.731980, -1.569586],
[1.024580, 0.409148, 0.149408],
[-0.074604, 1.269414, 0.115744],
[-0.006706, 2.097276, 0.681819],
[-0.432196, 1.249149,-1.159271]])
ペアを「接続性マトリックス」に変換します。
# Blank coo matrix to csr
sm = ss.coo_matrix((len(ids), len(ids)), np.int32).tocsr()
# Insert 1 for connected pairs and diagonals
for i in np.arange(len(mustLink)): # add links to both sides of the matrix
sm[mustLink.loc[i, 'A'], mustLink.loc[i, 'B']] = 1
sm[mustLink.loc[i, 'B'], mustLink.loc[i, 'A']] = 1
for i in np.arange(sm.tocsr()[1].shape[1]): # add diagonals
sm[i,i] = 1
sm = sm.tocoo() # convert back to coo format
凝集クラスタリングモデルをトレーニングして適合させます。
m = AgglomerativeClustering(n_clusters=6, connectivity=sm)
out = m.fit_predict(X=data)
私が受け取る警告:
UserWarning:接続マトリックスの接続されたコンポーネントの数は7> 1です。ツリーを早期に停止しないように完了します。接続性、n_components = _fix_connectivity(X、接続性)
不吉な警告に加えて、私が望んでいたペアは同じクラスターに属しますが、そうではありません。
これは、sklearnアルゴリズムがmustlink制約を処理するように設計されておらず、代わりにdistance
行列(ここに描かれている区別)しか使用できないためですか?
接続マトリックスをに渡すときsklearn.cluster.AgglomerativeClustering
は、マトリックス内のすべてのポイントを接続する必要があります。凝集クラスタリングは、すべてのポイントが繰り返しグループ化される階層を作成するため、孤立したクラスターは存在できません。接続マトリックスは、ユークリッド空間の近くにあるが、別のメトリックから遠く離れている可能性のあるポイントの接続を「オフ」にするのに役立ちます(ユーザーガイドのゼリーロールの例を参照してください)。
これを考える別の方法は、ポイントが互いに素ではないグラフを形成する必要があるということです。できることは、ノード間のエッジをオフにすることだけです。
この警告:
UserWarning:接続マトリックスの接続されたコンポーネントの数は7> 1です。ツリーを早期に停止しないように完了します。接続性、n_components = _fix_connectivity(X、接続性)
は、許可されている1つよりも多い7つの互いに素なクラスターがあることを示しています。そのようなsklearnはそれを「完了」します(本質的に、ばらばらのクラスターを持たないようにそれを埋めます)。これが、制約がまったく尊重されない理由です。
ここに簡単な修正はありません。クラスタリング後にセンターを再割り当てして制約を尊重するか、別のアルゴリズムを採用する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加