Temukan k item n dengan korelasi paling tidak berpasangan

9

Saya memiliki matriks korelasi berpasangan antara n item. Sekarang saya ingin menemukan subset item k dengan korelasi paling sedikit. Jadi ada dua pertanyaan:

  1. Manakah ukuran yang tepat untuk korelasi dalam kelompok itu?
  2. Bagaimana menemukan grup dengan korelasi paling sedikit?

Masalah ini muncul seperti semacam analisis faktor terbalik bagi saya dan saya cukup yakin bahwa ada solusi langsung.

Saya pikir masalah ini sebenarnya sama dengan masalah untuk menghapus (nk) node dari grafik lengkap sehingga node yang tersisa terhubung dengan bobot tepi minimum. Bagaimana menurut anda?

Terima kasih atas saran Anda sebelumnya!

Chris
sumber
Halaman ini mungkin membantu: stackoverflow.com/questions/6782070/…
Timothée HENRY
Itu sekarang terlihat agak lebih sebagai teori grafik daripada pertanyaan statistik (karena korelasi tidak dilihat sebagai saling tergantung lagi). Mungkin StackOverflow dapat menghasilkan jawaban yang lebih baik. Semacam pohon spanning minimal yang dibatasi ...
ttnphns
@ttnphs: pohon spanning minimal adalah hal yang tidak saya inginkan, karena korelasi berpasangan menyiratkan grafik lengkap. Namun demikian, Anda benar bahwa pertanyaan ini mungkin lebih cocok dengan situs matematika. Terima kasih!
Chris
Saya tidak jelas tentang apa yang Anda inginkan. Jika Anda memeriksa semua himpunan bagian , apakah Anda akan memilih himpunan bagian dengan jumlah terkecil dari korelasi kuadrat, di mana jumlahnya melebihi dalam korelasi subset? Apakah berkorelasi dengan item yang tersisa penting? (nk)k(k1)/2k(nk)nk
Ray Koopman
Saya telah memberikan solusi perkiraan yang disarankan dalam pertanyaan yang ditautkan .
Uri Cohen

Jawaban:

5

[Peringatan: jawaban ini muncul sebelum OP memutuskan untuk merumuskan kembali pertanyaan, sehingga mungkin kehilangan relevansinya. Awalnya pertanyaannya adalah tentang How to rank items according to their pairwise correlations]

Karena matriks korelasi berpasangan bukan array unidimensional, tidak cukup jelas seperti apa "peringkat" itu. Terutama selama Anda belum mengerjakan ide Anda secara rinci, seperti yang terlihat. Tetapi Anda menyebut PCA sebagai yang cocok untuk Anda, dan itu segera membuat saya menganggap Cholesky root sebagai alternatif yang berpotensi lebih cocok.

Akar Cholesky seperti matriks pembebanan yang ditinggalkan oleh PCA, hanya berupa segitiga. Saya akan menjelaskan keduanya dengan sebuah contoh.

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

Matriks pemuatan PCA A adalah matriks korelasi antara variabel dan komponen utama. Kita dapat mengatakannya karena jumlah baris kuadrat adalah semua 1 (diagonal R) sedangkan jumlah matriks kuadrat adalah varian keseluruhan (jejak R). Elemen Cholesky root dari B juga berkorelasi, karena matriks itu juga memiliki dua sifat ini. Kolom B bukan komponen utama dari A, meskipun mereka adalah "komponen", dalam arti tertentu.

Baik A dan B dapat mengembalikan R dan dengan demikian keduanya dapat menggantikan R, sebagai representasi. B adalah segitiga yang jelas menunjukkan fakta bahwa ia menangkap korelasi berpasangan R secara berurutan, atau secara hierarkis. Komponen Cholesky Iberkorelasi dengan semua variabel dan merupakan gambar linier dari yang pertama V1. Komponen IItidak lagi berbagi dengan V1tetapi berkorelasi dengan tiga yang terakhir ... Akhirnya IVhanya berkorelasi dengan yang terakhir V4,. Saya pikir "peringkat" semacam itu mungkin yang Anda cari ?

Masalah dengan dekomposisi Cholesky adalah, - tidak seperti PCA - itu tergantung pada urutan item dalam matriks R. Nah, Anda mungkin mengurutkan item menurun atau naik dari jumlah elemen kuadrat (atau, jika Anda suka , jumlah elemen absolut, atau dalam urutan koefisien korelasi berganda - lihat di bawah ini). Pesanan ini mencerminkan seberapa besar suatu item berkorelasi kotor.

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

Dari matriks B terakhir kita melihat bahwa V2, item yang paling berkorelasi sangat besar, menggadaikan semua korelasinya di I. Berikutnya item yang berkorelasi sangat besar V1menggadaikan semua korelasinya, kecuali dengan V2, dalam II; dan seterusnya.


Keputusan lain bisa menghitung koefisien korelasi berganda untuk setiap item dan peringkat berdasarkan besarnya. Korelasi berganda antara suatu item dan semua item lainnya tumbuh sebagai item berkorelasi lebih banyak dengan mereka semua tetapi mereka berkorelasi lebih sedikit satu sama lain. Koefisien korelasi berganda kuadrat membentuk diagonal dari apa yang disebut matriks kovarians gambar yaitu , di mana adalah matriks diagonal dari resiprokal diagonal .SR1S2S+RSR1

ttnphns
sumber
Terima kasih banyak atas tanggapan yang rumit ini, tetapi saya khawatir saya telah menyatakan masalah saya salah. Saya sangat yakin bahwa posting Anda bermanfaat bagi orang lain dan karenanya memilihnya! Terima kasih!
Chris
1
@ Ray, terima kasih atas perhatiannya melihat kesalahan.
ttnphns
3

Inilah solusi saya untuk masalah ini. Saya menghitung semua kombinasi yang mungkin dari k item n dan menghitung saling ketergantungan mereka dengan mengubah masalah dalam grafik-teoretis: Manakah grafik lengkap yang berisi semua node k dengan jumlah tepi terkecil (dependensi)? Berikut skrip python menggunakan perpustakaan networkx dan satu kemungkinan keluaran. Mohon maaf atas ambiguitas dalam pertanyaan saya!

Kode:

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)

Output sampel:

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]

Input grafik: masukkan deskripsi gambar di sini

Grafik solusi: masukkan deskripsi gambar di sini

Untuk contoh mainan, k = 4, n = 6: Input grafik: masukkan deskripsi gambar di sini

Grafik solusi: masukkan deskripsi gambar di sini

Terbaik,

Kristen

Chris
sumber
1
Ini mungkin solusi yang bagus. Tetapi untuk menghargainya, orang ingin melihat grafik (matriks) itu sendiri dan solusinya sebagai grafik. Bukan hanya kode dan output.
ttnphns
@ttnphns: Saya menambahkan plot dari grafik yang dihasilkan dan contoh mainan.
Chris
@ Chris Terima kasih telah mendokumentasikan solusi Anda. Bisakah Anda menambahkan satu atau dua kalimat tentang berapa lama ini berjalan dan bagaimana skala dengan jumlah node / dimensi?
Casimir
@Casimir: permintaan maaf saya karena tidak memasukkan informasi ini di muka. Namun, saat ini pos ini sudah berumur> 5 tahun dan saya tidak punya informasi lagi. Silakan menyalin & menempelkan kode dan melakukan perkiraan runtime terapan atau teoritis - Saya menghargai penambahan posting ini.
Chris
1
Jadi mungkin layak disebutkan bahwa dalam kasus di mana jumlah dimensi dalam ratusan atau bahkan ribuan, pendekatan ini tidak layak. Tapi tetap cara yang keren untuk menyelesaikan ini untuk ukuran masalah kecil!
Casimir
2

Cari dari item dengan berpasangan korelasi setidaknya: Sejak korelasi katakanlah menjelaskan dari hubungan antara dua seri lebih masuk akal untuk meminimalkan jumlah kuadrat dari korelasi untuk target item. Ini solusi sederhana saya.kn0.60.36k

Tulis ulang matriks korelasi Anda ke matriks kuadrat korelasi. Jumlahkan kuadrat dari setiap kolom. Hilangkan kolom dan baris yang sesuai dengan jumlah terbesar. Anda sekarang memiliki . Ulangi sampai Anda memiliki matriks . Anda juga bisa menyimpan kolom dan baris yang sesuai dengan jumlah terkecil. Membandingkan metode, saya menemukan dalam matriks dengan dan bahwa hanya dua item dengan jumlah dekat yang disimpan dan dihilangkan secara berbeda.n×n(n1)×(n1)k×kkn=43k=20

Jon Arts
sumber
1
Saya mencoba metode ini dan dibandingkan dengan metode grafik untuk mencari setiap subgraph dan walaupun metode ini tidak memberikan jawaban yang paling optimal, ia memberikan salah satu dari 5 kombinasi terbaik dan tentu saja jauh lebih cepat.
SamFisher83