Sous-ensemble le moins corrélé de variables aléatoires d'une matrice de corrélation

10

J'ai une matrice de corrélation , que j'ai obtenue en utilisant le coefficient de corrélation linéaire de Pearson via corrcoef () de Matlab . La matrice de corrélation de dimension 100x100, c'est-à-dire que j'ai calculé la matrice de corrélation sur 100 variables aléatoires.A

Parmi ces 100 variables aléatoires, je voudrais trouver les 10 variables aléatoires dont la matrice de corrélation contient aussi "peu de corrélation" que possible (voir Quantifier la quantité de "plus de corrélation" qu'une matrice de corrélation A contient par rapport à une matrice de corrélation B concernant les métriques à mesurer la corrélation globale dans une matrice de corrélation). Je me soucie seulement de la corrélation par paires.

Existe-t-il de bonnes méthodes pour trouver ces 10 variables aléatoires dans un délai raisonnable (par exemple, je ne veux pas essayer les combinaisons (10010) )? Les algorithmes d'approximation sont OK.

Franck Dernoncourt
la source
1
metrics to measure the overall correlation. Vous pensez spécifiquement au déterminant?
ttnphns
1
Une question très similaire stats.stackexchange.com/q/73125/3277 .
ttnphns
1
Le log-déterminant est une fonction sous-modulaire (voir page 18 ici ). Il n'augmente pas, malheureusement, ce qui signifie que le résultat d'approximation gourmand classique 11/e ne s'applique pas, mais il semble toujours que cela pourrait être utile d'une manière ou d'une autre ...
Dougal
1
Si vous souhaitez plutôt utiliser la valeur moyenne de la corrélation, cela devient un problème de clique de poids de bord maximal , qui est bien sûr NP-difficile mais a vu un certain travail sur les algorithmes d'approximation.
Dougal
3
Qu'en est-il de cette idée simple avec l'analyse de cluster. Prenezcomme la distance (dissimilarité) et faire le clustering par une méthode sélectionnée (je choisirais probablement Ward ou hiérarchie de liaison moyenne). Sélectionnez le cluster le plus serré composé de 10 éléments. |r|
ttnphns

Réponses:

3

Considérons la somme des corrélations absolues par paire comme mesure de notre choix. On cherche donc un vecteur avec qui minimisera où.l 1 ( v ) = n v Q v Q i j = | A i j |v{0,1}Nl1(v)=nvQvQij=|Aij|

Supposons que Q est également défini comme étant positif, le problème est réduit à résoudre le problème d'optimisation quadratique contraint:

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

Cela suggère la relaxation suivante:

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

qui peut être facilement résolu en utilisant des solveurs standard; alors le résultat est donné par les plus grandes composantes dans .v nv

Exemple de code 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)
Uri Cohen
la source
Avez-vous une version Python de ce script par hasard?
Casimir
2

Cela peut être pire que l'idée de clustering hiérarchique de @ ttnphns. Mais: je viens de tomber sur un article qui utilise comme une fonction objectif sous-modulaire croissante:logdet(I+A)

Vanchinathan, Marfurt, Robelin, Kossman et Krause. Découvrir des objets précieux à partir de données massives . KDD 2015. ( doi , arXiv )

Si vous pensez que c'est une mesure raisonnable de "moins corrélée", vous pouvez obtenir dans un facteur de l'ensemble optimal en choisissant simplement de manière itérative le point qui maximise cela. Cela peut être fait efficacement avec la décomposition de bloc LU , où est le vecteur de corrélations aux entrées déjà dans la matrice:11/evv

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)

et bien sûr, vous devez calculer , où est la factorisation de Cholesky de et en utilisant un solveur triangulaire qui est . Donc, tout ce processus devrait prendre temps pour choisir parmi éléments, en supposant que la matrice de corrélation est déjà calculée .vT(I+A)1v=L1v2LI+AO(n2)O(k=1nNk2+k3)=O(Nn3)nN

Dougal
la source
Il semble que le lien vers le document soit mort. Avez-vous une citation à portée de main?
Sycorax dit Reinstate Monica
@Sycorax Il est disponible sur Wayback Machine , mais je n'ai pas trouvé de copie actuelle sur le Web. Il semble que ce document d'atelier a été transformé en document de conférence , que j'ajoute à la réponse.
Dougal
1

Je ne suis pas sûr de bien comprendre ce que vous entendez par «je ne me soucie que de la corrélation par paires» , mais voici quelque chose qui peut vous aider: utilisez l'inverseur de votre matrice de corrélation. Le terme est égal à , où est la x construite à partir de où la ème colonne et la ligne ont été supprimées.Aii1det(A0i)/det(A)A0i(n1)(n1)Ai

L'obtention de l'indice du coefficient diagonal minimum dans vous indique donc quel point a la plus faible corrélation avec le reste de l'ensemble.A1

Selon ce que vous voulez réellement faire, vous pouvez soit prendre les 10 valeurs les plus basses sur la diagonale de l'inverseur, soit obtenir la première, puis calculer l'inverseur avec le point supprimé, et ainsi de suite.

Si ce n'est pas ce dont vous avez besoin, je pense que cette astuce pourrait toujours être utile, mais je ne sais pas comment, cependant.

Romain Reboulleau
la source
0

Trouvez de éléments avec la corrélation la moins paire: étant donné qu'une corrélation de explique de la relation entre deux séries, il est plus logique de minimiser la somme des carrés de corrélations pour vos éléments cibles . Voici ma solution simple.kn0.60.36k

Réécrivez votre matrice de corrélations en une matrice de carrés de corrélations. Additionnez les carrés de chaque colonne. Éliminez la colonne et la ligne correspondante avec la plus grande somme. Vous avez maintenant une matrice . Répétez jusqu'à ce que vous ayez une matrice . Vous pouvez également conserver les colonnes et les lignes correspondantes avec les plus petites sommes. En comparant les méthodes, j'ai trouvé dans une matrice avec et que seuls deux éléments avec des sommes proches ont été conservés et éliminés différemment.( n - 1 ) × ( n - 1 ) k × k k n = 43 k = 20n×n(n1)×(n1)k×kkn=43k=20

Jon Arts
la source
2
Cela peut fonctionner, mais cela semble ad hoc (il se lit comme un algorithme gourmand) et vous n'avez proposé aucune raison mathématique suggérant que cela devrait fonctionner. Avez-vous une assurance que cela fonctionnera, ou des limites sur la façon dont il se rapprochera de la meilleure solution?
whuber
J'ai utilisé la branche de Gurobi et je suis obligé de résoudre sous réserve de à l'optimalité pour une matrice de corrélation et . J'ai obtenu une valeur d'objectif finale de 8,13. A titre de comparaison, cette méthode gourmande a atteint 42,87 alors que la sélection aléatoire avait une valeur objective attendue de 62,07. Donc pas terrible mais pas inutile non plus. Et cette méthode a de la simplicité et de la vitesse! n i = 1 xi=k418×418k=20x=argminx{0,1}n(xTC x)i=1nxi=k418×418k=20
Casimir
Il y avait également une corrélation positive entre les entrées de définies par Gurobi et cette méthode gourmande. x
Casimir