Sottoinsieme meno correlato di variabili casuali da una matrice di correlazione


10

Ho una matrice di correlazione , che ho ottenuto usando il coefficiente di correlazione lineare di Pearson attraverso il corrcoef () di Matlab . La matrice di correlazione della dimensione 100x100, ovvero ho calcolato la matrice di correlazione su 100 variabili casuali.A

Tra queste 100 variabili casuali, vorrei trovare le 10 variabili casuali la cui matrice di correlazione contiene il più "piccola correlazione" possibile (vedi Quantificare quanto "maggiore correlazione" contiene una matrice di correlazione rispetto a una matrice di correlazione B relativa alle metriche da misurare la correlazione complessiva in una matrice di correlazione). Mi interessa solo la correlazione a coppie.

Esistono buoni metodi per trovare quelle 10 variabili casuali in un ragionevole lasso di tempo (ad esempio, non voglio provare (10010) )? Gli algoritmi di approssimazione sono OK.


1
metrics to measure the overall correlation. Stai pensando specificamente al determinante?
ttnphns,

1
Una domanda molto simile stats.stackexchange.com/q/73125/3277 .
ttnphns,

1
Il log determinante è una funzione sottomodulare (vedere pagina 18 qui ). Sfortunatamente non sta aumentando, il che significa che il classico risultato approssimativo 11/e non si applica, ma sembra comunque che possa essere utile in qualche modo ....
Dougal

1
Se invece si desidera utilizzare il valore medio della correlazione, questo diventa un problema di cricca del peso massimo del bordo , che è ovviamente NP-difficile ma ha visto alcuni lavori sugli algoritmi di approssimazione.
Dougal,

3
Che dire di quella semplice idea con l'analisi dei cluster. Prendicome distanza (dissomiglianza) e fare il clustering secondo un metodo selezionato (probabilmente sceglierei Ward o il collegamento medio gerarchico). Seleziona il cluster più stretto composto da 10 elementi. |r|
ttnphns,

Risposte:


3

Consideriamo la somma delle correlazioni assolute a coppie come la nostra misura di scelta. Cerchiamo quindi un vettore con che ridurrà al minimo dove.v{0,1}Nl1(v)=nvQvQij=|Aij|

Supponiamo che Q sia anche definito positivo come A, il problema è ridotto per risolvere il problema di ottimizzazione quadratica vincolata:

v=min vQv s.t. l1(v)=n, vi{0,1}

Questo suggerisce il seguente rilassamento:

v=min vQv s.t. l1(v)=n, vi[0,1]

che può essere facilmente risolto utilizzando solutori pronti all'uso; quindi il risultato è dato dai componenti più grandi in .nv

Esempio di codice matlab:

N=100;
n=10;
% Generate random data
A=rand(N,1000);
C=corrcoef(A');
Q=abs((C+C')/2); % make sure it is symmetric
x = cplexqp(Q,zeros(1,N),[],[], ones(1, N),n, zeros(N,1), ones(N,1));
% If you don't use CPLEX, use matlab's default
% x = quadprog(Q,zeros(1,N),[],[], ones(1, N),n, zeros(N,1), ones(N,1));
assert(abs(sum(x)-n)<1e-10);
% Find the n largest values
I=sort(x); 
v=zeros(size(x)); v(x>I(N-n))=1; 
assert(abs(sum(v)-n)<1e-10);
% Make sure we do better than 10K random trials
for i=1:10000
   vc=zeros(size(x)); vc(randperm(N,n))=1;
   assert(sum(vc)==n, 'Wrong l0 norm');
   assert(vc'*Q*vc>v'*Q*v, 'Improves result');
end
% Show results
J=find(v==1);
fprintf('The optimal solution total off-diagonal correlations are %1.3f\n', v'*Q*v-n);
fprintf('The matrix:\n');
C(J,J)

Hai una versione Python di questo script per caso?
Casimir,

2

Questo potrebbe essere peggio dell'idea di raggruppamento gerarchico di @ttnphns. Ma: mi sono appena imbattuto in un documento che utilizza come una crescente funzione di obiettivo sottomodulare:logdet(I+A)

Vanchinathan, Marfurt, Robelin, Kossman e Krause. Alla scoperta di oggetti preziosi da dati di massa . KDD 2015. ( doi , arXiv )

Se pensi che sia una misura ragionevole di "meno correlata", puoi ottenere un fattore del set ottimale semplicemente scegliendo in modo iterativo il punto che la massimizza. Questo può essere fatto in modo efficiente con la decomposizione del blocco LU , dove è il vettore delle correlazioni con le voci già nella matrice:11/ev

det[I+AvvT2]=det([I0vT(I+A)11][I+A002vT(I+A)1v][I(I+A)1v01])=det[I0vT(I+A)11]det[I+A002vT(I+A)1v]det[I(I+A)1v01]=(2vT(I+A)1v)det(I+A)

e ovviamente dovresti calcolare , dove è la fattorizzazione di Cholesky di e usando un risolutore triangolare che è . Quindi l'intero processo dovrebbe richiedere tempo per selezionare di elementi, supponendo che la matrice di correlazione sia già calcolata .vT(I+A)1v=L1v2LI+AO(n2)O(k=1nNk2+k3)=O(Nn3)nN


Sembra che il link al documento sia morto. Hai una citazione a portata di mano?
Sycorax dice di reintegrare Monica il

@Sycorax È disponibile su Wayback Machine , ma non sono riuscito a trovare una copia corrente sul Web. Sembra che il documento dell'officina sia stato trasformato in un documento della conferenza , che sto aggiungendo alla risposta.
Dougal,

1

Non sono sicuro di capire appieno cosa intendi per "Mi interessa solo la correlazione a coppie" , ma ecco qualcosa che può aiutarti: usa l'invertito della tua matrice di correlazione. Il termine è uguale a , dove è la matrice x costruita da dove sono rimossi l' -esima colonna e riga.Aii1det(A0i)/det(A)A0i(n1)(n1)Ai

Ottenere l'indice del coefficiente diagonale minimo in ti dice quindi quale punto ha la correlazione più bassa con il resto dell'insieme.A1

A seconda di ciò che realmente vuoi fare, potresti prendere i 10 valori più bassi sulla diagonale dell'invertito, oppure ottenere il primo, quindi calcolare l'invertito con il punto cancellato, e così via.

Se questo non è ciò di cui hai bisogno, penso che questo trucco potrebbe essere ancora utile, ma non sono sicuro di come, però.


0

Trova di elementi con la correlazione meno a coppie: poiché una correlazione di dire spiega della relazione tra due serie, ha più senso ridurre al minimo la somma dei quadrati di correlazioni per i tuoi oggetti target . Ecco la mia soluzione semplice.kn0.60.36k

Riscrivi la tua matrice di correlazioni a una matrice di quadrati di correlazioni. Somma i quadrati di ogni colonna. Elimina la colonna e la riga corrispondente con la somma maggiore. Ora hai una matrice . Ripeti finché non hai una matrice . Potresti anche mantenere le colonne e le righe corrispondenti con somme più piccole. Confrontando i metodi, ho scoperto in una matrice con e che solo due elementi con somme strette sono stati mantenuti ed eliminati in modo diverso.n×n(n1)×(n1)k×kkn=43k=20


2
Potrebbe funzionare, ma suona ad hoc (sembra un algoritmo avido) e non hai offerto alcun motivo matematico che suggerisca che dovrebbe funzionare. Hai la certezza che funzionerà, o qualche limite su quanto sarà vicino alla soluzione migliore?
whuber

Ho usato il ramo di Gurobi e legato per risolvere soggetto a all'ottimalità per una matrice di correlazione e . Ho ottenuto un valore obiettivo finale di 8,13. Per fare un confronto, questo avido metodo ha raggiunto 42,87 mentre la selezione casuale aveva un valore obiettivo atteso di 62,07. Quindi non eccezionale, ma non inutile. E questo metodo ha sicuramente semplicità e velocità. x=argminx{0,1}n(xTC x)i=1nxi=k418×418k=20
Casimir,

C'era anche una correlazione positiva tra cui le voci di erano impostate su una da Gurobi e questo metodo avido. x
Casimir,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.