相関行列のクラスタリング


20

すべてのアイテムが他のアイテムとどのように相関しているかを示す相関行列があります。したがって、N個のアイテムについては、すでにN * N相関行列があります。この相関行列を使用して、k番目のビンのNk個のアイテムが同じように動作すると言うことができるように、M個のビンのN個のアイテムをクラスター化する方法を教えてください。親切に私を助けてください。すべてのアイテム値はカテゴリです。

ありがとう。さらに情報が必要な場合はお知らせください。Pythonでの解決策が必要ですが、要件に向かって私を押し進める助けは大きな助けになります。


Nは通常どれくらいの大きさですか?
ロダン

1
私の問題のために階層的なクラスタリングは必要ありません。どのアイテムが同様に振る舞うかを伝える必要があります。
Abhishek093


3
参考までに、この問題はバイクラスタリングと呼ばれます。そのデモはscikit-learn.org/stable/auto_examples/bicluster/…
chanp

回答:


15

ブロックモデリングの仕事のように見えます。「ブロックモデリング」のGoogleと最初のいくつかのヒットが役立ちます。

N = 100の共分散行列があり、実際には5つのクラスターがあるとします。 初期共分散行列

ブロックモデリングが行おうとしているのは、行の順序を見つけて、クラスターが「ブロック」として見えるようにすることです。 最適化された共分散行列の順序

以下は、これを実現するために基本的な欲張り検索を実行するコード例です。250〜300の変数にはおそらく遅すぎるかもしれませんが、それは始まりです。コメントと一緒にフォローできるかどうかを確認します。

import numpy as np
from matplotlib import pyplot as plt

# This generates 100 variables that could possibly be assigned to 5 clusters
n_variables = 100
n_clusters = 5
n_samples = 1000

# To keep this example simple, each cluster will have a fixed size
cluster_size = n_variables // n_clusters

# Assign each variable to a cluster
belongs_to_cluster = np.repeat(range(n_clusters), cluster_size)
np.random.shuffle(belongs_to_cluster)

# This latent data is used to make variables that belong
# to the same cluster correlated.
latent = np.random.randn(n_clusters, n_samples)

variables = []
for i in range(n_variables):
    variables.append(
        np.random.randn(n_samples) + latent[belongs_to_cluster[i], :]
    )

variables = np.array(variables)

C = np.cov(variables)

def score(C):
    '''
    Function to assign a score to an ordered covariance matrix.
    High correlations within a cluster improve the score.
    High correlations between clusters decease the score.
    '''
    score = 0
    for cluster in range(n_clusters):
        inside_cluster = np.arange(cluster_size) + cluster * cluster_size
        outside_cluster = np.setdiff1d(range(n_variables), inside_cluster)

        # Belonging to the same cluster
        score += np.sum(C[inside_cluster, :][:, inside_cluster])

        # Belonging to different clusters
        score -= np.sum(C[inside_cluster, :][:, outside_cluster])
        score -= np.sum(C[outside_cluster, :][:, inside_cluster])

    return score


initial_C = C
initial_score = score(C)
initial_ordering = np.arange(n_variables)

plt.figure()
plt.imshow(C, interpolation='nearest')
plt.title('Initial C')
print 'Initial ordering:', initial_ordering
print 'Initial covariance matrix score:', initial_score

# Pretty dumb greedy optimization algorithm that continuously
# swaps rows to improve the score
def swap_rows(C, var1, var2):
    '''
    Function to swap two rows in a covariance matrix,
    updating the appropriate columns as well.
    '''
    D = C.copy()
    D[var2, :] = C[var1, :]
    D[var1, :] = C[var2, :]

    E = D.copy()
    E[:, var2] = D[:, var1]
    E[:, var1] = D[:, var2]

    return E

current_C = C
current_ordering = initial_ordering
current_score = initial_score

max_iter = 1000
for i in range(max_iter):
    # Find the best row swap to make
    best_C = current_C
    best_ordering = current_ordering
    best_score = current_score
    for row1 in range(n_variables):
        for row2 in range(n_variables):
            if row1 == row2:
                continue
            option_ordering = best_ordering.copy()
            option_ordering[row1] = best_ordering[row2]
            option_ordering[row2] = best_ordering[row1]
            option_C = swap_rows(best_C, row1, row2)
            option_score = score(option_C)

            if option_score > best_score:
                best_C = option_C
                best_ordering = option_ordering
                best_score = option_score

    if best_score > current_score:
        # Perform the best row swap
        current_C = best_C
        current_ordering = best_ordering
        current_score = best_score
    else:
        # No row swap found that improves the solution, we're done
        break

# Output the result
plt.figure()
plt.imshow(current_C, interpolation='nearest')
plt.title('Best C')
print 'Best ordering:', current_ordering
print 'Best score:', current_score
print
print 'Cluster     [variables assigned to this cluster]'
print '------------------------------------------------'
for cluster in range(n_clusters):
    print 'Cluster %02d  %s' % (cluster + 1, current_ordering[cluster*cluster_size:(cluster+1)*cluster_size])

その手法はソーシャルネットワーククラスタリングに使用されていませんか?これはここで関連しますか?その相関行列を距離行列として使用するのは理にかなっていますか?
Abhishek093

1)はい、2)そう思います、3)はい(高度に相関する値は近い)
ロダン

はい。最初のいくつかのリンクを見ました。これが私の問題の解決にどのように役立つかはまだわかりません。
Abhishek093

回答を編集しました。あなたの役に立つことを願っています。
ロダン

私は今それを確認するつもりです。私の問題に合うかどうかをお知らせします。どうもありがとうございます。
Abhishek093

6

階層的なクラスタリングを見たことがありますか?距離だけでなく、類似点でも機能します。樹状図は、k個のクラスターに分割される高さで切断できますが、通常は、樹状図を視覚的に検査し、切断する高さを決定することをお勧めします。

階層的クラスタリングは、他の回答に見られるように、類似度マトリックスの視覚化のための巧妙な並べ替えを生成するためにもよく使用されます。これは、ユーザーの検証ツールとしても機能します!


2

相関クラスタリングを検討しましたか?このクラスタリングアルゴリズムは、ペアワイズの正/負の相関情報を使用して、明確に定義された機能的かつ厳密な生成確率的解釈使用して、最適なクラスター数を自動的に提案します


推進されているウィキペディアの記事:Correlation clustering provides a method for clustering a set of objects into the optimum number of clusters without specifying that number in advance。それはメソッドの定義ですか?はいの場合、クラスターの数を自動的に提案する他の方法が存在するため奇妙です。また、なぜそれが「相関」と呼ばれるのですか。
ttnphns

@ttnphns(1)入力としてペアワイズ相関行列を期待するため、「相関クラスタリング」と呼ばれます(Bansal、N .; Blum、A .; Chawla、S.(2004)の独創的な研究を参照してください。 "Correlation Clustering 「。機械学習。56:89)。
シャイ

「クラスターの最適数」に関する@ttnphns:「最適」があいまいで、どの尺度で「最適」であるという事実について正しいですか?相関クラスタリングに関しては、Bagon&Galunの「大規模相関クラスタリング」で提案されている生成モデルを受け入れた場合、このメソッドは最適な数を出力します。
シャイ

シャイ、あなたはこの方法の発明者の一人のようです。時間と希望があれば、それを提示するよりラップされていない答えを与えることをお勧めします。具体的には、k-meansやhierarhicalなど、確立された方法の中にメソッドがどのように配置されているかを知りたいと考えています。また、相関ユークリッド距離に簡単に変換できることに注意してください(その後に適用される標準的なクラスタリング手法を使用)。それについて書く。(事前に感謝!)
ttnphns

1
カバーすることを願っています。このサイトに投稿された回答には、特にメソッドが新しく、発言者が発明者であることを知っている場合は特に、もう少し詳しく説明することをお勧めします。:-)いいえ、「広すぎる」ではありません。
ttnphns

-1

意味のある(統計的有意性)しきい値でフィルタリングし、dulmage-mendelsohn分解を使用して接続されたコンポーネントを取得します。推移的相関のような問題を除去しようとする前に(AはBに高度に相関し、BはCに、CはDにすべてを含むコンポーネントがありますが、実際にはDからAは低いです)。いくつかの中間ベースのアルゴリズムを使用できます。誰かが示唆したように、相関行列は対称的であり、したがって双対は存在しないため、これは二重クラスタリングの問題ではありません。


この回答では、IMOがarbitrary意的であると思われる推奨しきい値の設定方法については説明していません。さらに、この質問は2年前であり、いくつかの賛成票による回答が既に受け入れられているため、既存の情報について詳しく説明することもできます。
IWS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.