ペアワイズ相関が最小のn個のアイテムのうちk個を見つける


9

n項目間のペアワイズ相関の行列があります。次に、相関が最も少ないk個のアイテムのサブセットを見つけます。したがって、2つの質問があります。

  1. そのグループ内の相関関係の適切な尺度はどれですか?
  2. 最小の相関を持つグループを見つける方法は?

この問題は私には一種の逆因数分析のように見え、簡単な解決策があると確信しています。

この問題は、完全なグラフからノード(nk)を削除する問題と実際に等しいため、残りのノードは最小のエッジの重みで接続されていると思います。どう思いますか?

事前にご提案いただきありがとうございます!


このページには役立つかもしれない:stackoverflow.com/questions/6782070/...
TimothéeHENRY

これは、統計的質問よりもグラフ理論に少し似ています(相関関係が相互依存として見なされなくなったため)。StackOverflowがより良い答えをもたらす可能性があります。ある種の制約付き最小スパニングツリー...
ttnphns 2013年

@ttnphs:ペアワイズ相関は完全なグラフを意味するため、最小のスパニングツリーは私が望んでいないものです。それにもかかわらず、あなたはこの質問が数学のサイトによりよく適合するかもしれないということは正しいです。ありがとう!
Chris

私はあなたが何を望んでいるかはっきりしていません。すべてのサブセットをチェックする場合、2乗相関の合計が最小であるサブセットを選択します。合計はサブセット内相関を超えていますか?やるの残りとの相関項目は重要か?(nk)k(k1)/2k(nk)nk
Ray Koopman 2013年

おおよその解決策がリンクされた質問で提案されていることを示しました
Uri Cohen

回答:


5

[事前警告:この回答は、OPが質問を再定式化することを決定する前に表示されたため、関連性が失われた可能性があります。もともとの質問はについてでしたHow to rank items according to their pairwise correlations]

ペアワイズ相関の行列は一次元配列ではないため、「ランキング」がどのように見えるかは明確ではありません。特にあなたが考えているように、あなたのアイデアを詳細に練っていない限り。しかし、あなたはPCAがあなたに適していると述べました、そしてそれはすぐに私にコレスキールートを潜在的にさらにより適切な代替物と考えるようにさせました。

コレスキールートは、PCAが残した負荷の行列のようなもので、三角形のみです。両方を例で説明します。

R, correlation matrix
         V1       V2       V3       V4
V1   1.0000   -.5255   -.1487   -.2790
V2   -.5255   1.0000    .2134    .2624
V3   -.1487    .2134   1.0000    .1254
V4   -.2790    .2624    .1254   1.0000

A, PCA full loading matrix
          I       II      III       IV
V1   -.7933    .2385    .2944    .4767
V2    .8071   -.0971   -.3198    .4867
V3    .4413    .8918    .0721   -.0683
V4    .5916   -.2130    .7771    .0261

B, Cholesky root matrix
          I       II      III       IV
V1   1.0000    .0000    .0000    .0000
V2   -.5255    .8508    .0000    .0000
V3   -.1487    .1589    .9760    .0000
V4   -.2790    .1361    .0638    .9485

A*A' or B*B': both restore R
         V1       V2       V3       V4
V1   1.0000   -.5255   -.1487   -.2790
V2   -.5255   1.0000    .2134    .2624
V3   -.1487    .2134   1.0000    .1254
V4   -.2790    .2624    .1254   1.0000

PCAの負荷行列Aは、変数と主成分の間の相関行列です。正方形の行の合計がすべて1(Rの対角線)であるのに対し、行列の正方形の合計は全体の分散(Rのトレース)であるため、それを言うことがあります。Bのコレスキールートの要素も相関です。これは、その行列にもこれら2つのプロパティがあるためです。Bの列は、ある意味で「コンポーネント」ですが、Aの主成分ではありません。

AとBはどちらもRを復元できるため、Rをその表現として置き換えることができます。Bは三角形であり、Rのペアワイズ相関を連続的または階層的に捕捉するという事実を明確に示しています。コレスキーのコンポーネントIはすべての変数と相関し、最初の変数の線形イメージですV1。コンポーネントはIIこれ以上共有しませんV1が、最後の3つと相関します...最後に、最後IVとのみ相関しV4ます。そんな「ランキング」があなたの求めるものかな?

ただし、コレスキー分解の問題は、PCAとは異なり、行列R内のアイテムの順序に依存することです。 、絶対要素の合計、または複数の相関係数の順序-下記を参照してください)。この順序は、アイテムが全体的にどれだけ相関しているかを反映しています。

R, rearranged
         V2       V1       V4       V3 
V2   1.0000   -.5255    .2624    .2134 
V1   -.5255   1.0000   -.2790   -.1487 
V4    .2624   -.2790   1.0000    .1254 
V3    .2134   -.1487    .1254   1.0000 

Column sum of squares (descending)
     1.3906   1.3761   1.1624   1.0833 

B 
          I       II      III       IV 
V2   1.0000    .0000    .0000    .0000 
V1   -.5255    .8508    .0000    .0000 
V4    .2624   -.1658    .9506    .0000 
V3    .2134   -.0430    .0655    .9738

最後のBマトリックスからV2、最も相関のあるアイテムであるが、すべての相関をでポーンしていることがわかりIます。次に、大まかに相関するアイテムはV1、with V2、in を除いて、そのすべての相関関係をポーンしIIます。等々。


別の決定は、すべてのアイテムの多重相関係数を計算し、その大きさに基づいてランク付けすることです。アイテムと他のすべてのアイテムとの間の複数の相関は、アイテムがそれらのすべてとより相関するが、それらは互いにあまり相関しないほど大きくなります。平方多重相関係数は、であるいわゆる画像共分散行列の対角を形成し。ここで、は対角の逆数の対角行列です。。S R 1SR1S2S+RSR1


この手の込んだ対応に心から感謝しますが、私は自分の問題を間違って述べていると思います。あなたの投稿が他のユーザーに役立つことを確信しているので、投票してください!ありがとう!
Chris

1
@Ray、失効の発見に気を付けてくれてありがとう。
ttnphns 2013年

3

これが私の問題の解決策です。nアイテムのkのすべての可能な組み合わせを計算し、問題をグラフ理論的なものに変換することによって相互依存関係を計算します。エッジの合計(依存関係)が最小のすべてのkノードを含む完全なグラフはどれですか?これは、networkxライブラリと1つの可能な出力を使用したpythonスクリプトです。私の質問のあいまいさについては謝罪してください!

コード:

import networkx as nx
import itertools
import os

#Create new graph
G=nx.Graph()

#Each node represents a dimension
G.add_nodes_from([1,2,3,4,5,6,7,8,9,10,11])

#For each dimension add edges and correlations as weights
G.add_weighted_edges_from([(3,1,0.563),(3,2,0.25)])
G.add_weighted_edges_from([(4,1,0.688),(4,3,0.438)])
G.add_weighted_edges_from([(5,1,0.25),(5,2,0.063),(5,3,0.063),(5,4,0.063)])
G.add_weighted_edges_from([(6,1,0.063),(6,2,0.25),(6,3,0.063),(6,4,0.063),(6,5,0.063)])
G.add_weighted_edges_from([(7,2,0.25),(7,3,0.063),(7,5,0.125),(7,6,0.063)])
G.add_weighted_edges_from([(8,1,0.125),(8,2,0.125),(8,3,0.5625),(8,5,0.25),(8,6,0.188),(8,7,0.125)])
G.add_weighted_edges_from([(9,1,0.063),(9,2,0.063),(9,3,0.25),(9,6,0.438),(9,7,0.063),(9,8,0.063)])
G.add_weighted_edges_from([(10,1,0.25),(10,2,0.25),(10,3,0.563),(10,4,0.125),(10,5,0.125),(10,6,0.125),(10,7,0.125),(10,8,0.375),(10,9,0.125)])
G.add_weighted_edges_from([(11,1,0.125),(11,2,0.063),(11,3,0.438),(11,5,0.063),(11,6,0.1875),(11,7,0.125),(11,8,0.563),(11,9,0.125),(11,9,0.188)])

nodes = set(G.nodes())
combs = set(itertools.combinations(nodes,6))
sumList = []
for comb in combs:
    S=G.subgraph(list(comb))
    sum=0
    for edge in S.edges(data=True):
        sum+=edge[2]['weight']
    sumList.append((sum,comb))

sorted = sorted(sumList, key=lambda tup: tup[0])    

fo = open("dependency_ranking.txt","wb")

for i in range(0,len(sorted)):
    totalWeight = sorted[i][0]
    nodes = list(sorted[i][1])
    nodes.sort()
    out = str(i)+": "+str(totalWeight)+","+str(nodes)
    fo.write(out.encode())
    fo.write("\n".encode())

fo.close()

S=G.subgraph([1,2,3,4,6,7])
sum = 0
for edge in S.edges(data=True):
        sum+=edge[2]['weight']
print(sum)

出力例:

0: 1.0659999999999998,[2, 4, 5, 7, 9, 11]
1: 1.127,[4, 5, 7, 9, 10, 11]
2: 1.128,[2, 4, 5, 9, 10, 11]
3: 1.19,[2, 4, 5, 7, 8, 9]
4: 1.2525,[4, 5, 6, 7, 10, 11]
5: 1.377,[2, 4, 5, 7, 9, 10]
6: 1.377,[2, 4, 7, 9, 10, 11]
7: 1.377,[2, 4, 5, 7, 10, 11]

入力グラフ: ここに画像の説明を入力してください

ソリューショングラフ: ここに画像の説明を入力してください

おもちゃの例の場合、k = 4、n = 6:入力グラフ: ここに画像の説明を入力してください

ソリューショングラフ: ここに画像の説明を入力してください

ベスト、

キリスト教徒


1
これは良い解決策かもしれません。しかし、それを理解するために、グラフ(行列)自体と解をグラフとして見たいと思います。コードと出力だけではありません。
ttnphns 2013年

@ttnphns:結果のグラフのプロットとおもちゃの例を追加しました。
Chris

@Chrisソリューションを文書化していただきありがとうございます。これが実行にかかった時間と、ノード/ディメンションの数に応じてどのようにスケーリングするかについて、1つまたは2つの文を追加できますか?
Casimir

@Casimir:この情報を事前に含めなかったことをお詫びします。ただし、現時点ではこの投稿は5年以上前であり、情報を入手することはできません。自由にコードをコピーして貼り付け、適用されたまたは理論上の実行時間の見積もりを行ってください-投稿への追加に感謝します。
Chris

1
したがって、次元の数が数百または数千にも及ぶ場合、このアプローチは実行不可能であることを言及する価値があるかもしれません。しかし、問題のサイズが小さい場合にこれを解決するためのクールな方法です!
Casimir

2

kn0.60.36k

n×n(n1)×(n1)k×kkn=43k=20 合計が近い2つのアイテムのみが異なる方法で保持および削除されました。


1
私はこの方法を試し、すべてのサブグラフを検索するグラフの方法と比較しました。この方法は最適な答えを提供しませんでしたが、5つの最良の組み合わせの1つを提供し、もちろんはるかに高速でした。
SamFisher83 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.