Subconjunto menos correlacionado de variables aleatorias de una matriz de correlación

10

Tengo una matriz de correlación A , que obtuve usando el coeficiente de correlación lineal de Pearson a través de corrcoef de Matlab () . La matriz de correlación de dimensión 100x100, es decir, calculé la matriz de correlación en 100 variables aleatorias.

Entre estas 100 variables aleatorias, me gustaría encontrar las 10 variables aleatorias cuya matriz de correlación contiene la "pequeña correlación" posible (vea Cuantificar cuánta "más correlación" contiene una matriz de correlación A en comparación con una matriz de correlación B con respecto a las métricas para medir la correlación general en una matriz de correlación). Solo me importa la correlación por pares.

¿Existen buenos métodos para encontrar esas 10 variables aleatorias en un período de tiempo razonable (por ejemplo, no quiero probar combinaciones )? Los algoritmos de aproximación están bien.(10010)

Franck Dernoncourt
fuente
1
metrics to measure the overall correlation. ¿Estás pensando específicamente en el determinante?
ttnphns
1
Una pregunta muy similar stats.stackexchange.com/q/73125/3277 .
ttnphns
1
El log-determinante es una función submodular (ver página 18 aquí ). No es cada vez mayor, por desgracia, lo que significa el clásico resultado aproximación codiciosos no se aplica, pero todavía se siente como que podría ser útil de alguna manera ....11/e
Dougal
1
Si, en cambio, desea utilizar el valor medio de la correlación, esto se convierte en un problema de camarilla de peso máximo de borde , que por supuesto es NP-hard pero ha visto algún trabajo en algoritmos de aproximación.
Dougal
3
¿Qué pasa con esa idea simple con análisis de conglomerados? Tomarcomo la distancia (disimilitud) y agrupamiento por un método seleccionado (probablemente elegiría Ward o jerarquía de vinculación promedio). Seleccione el grupo más ajustado que consta de 10 elementos. |r|
ttnphns

Respuestas:

3

Consideremos la suma de correlaciones absolutas por pares como nuestra medida de elección. Por lo tanto, buscamos un vector con que minimizará donde.v{0,1}Nl1(v)=nvQvQij=|Aij|

Suponga que Q también es positivo definido como A, el problema se reduce a resolver el problema de optimización cuadrática restringida:

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

Esto sugiere la siguiente relajación:

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

que se puede resolver fácilmente utilizando solucionadores estándar; entonces el resultado está dado por los componentes más grandes en .nv

Código de muestra de 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
fuente
¿Tienes una versión de Python de este script por casualidad?
Casimir
2

Esto puede ser peor que la idea de agrupación jerárquica de @ ttnphns. Pero: acabo de pasar por un artículo que usa como una función objetivo submodular creciente:logdet(I+A)

Vanchinathan, Marfurt, Robelin, Kossman y Krause. Descubriendo artículos valiosos de datos masivos . KDD 2015. ( doi , arXiv )

Si cree que es una medida razonable de "menos correlacionada", puede obtener un factor del conjunto óptimo simplemente eligiendo iterativamente el punto que maximiza eso. Esto se puede hacer de manera eficiente con la descomposición del bloque LU , donde es el vector de correlaciones con las entradas que ya están en la matriz: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)

y, por supuesto, debe calcular , donde es la factorización de Cholesky de y utilizando un solucionador triangular que es . Entonces, todo este proceso debería tomar tiempo para seleccionar de elementos, suponiendo que la matriz de correlación ya esté calculada .vT(I+A)1v=L1v2LI+AO(n2)O(k=1nNk2+k3)=O(Nn3)nN

Dougal
fuente
Parece que el enlace al documento está muerto. ¿Tienes una cita a mano?
Sycorax dice Reinstate Monica
@ Sycorax Está disponible en Wayback Machine , pero no pude encontrar una copia actual en la web. Parece que el documento del taller se convirtió en un documento de conferencia , que estoy agregando a la respuesta.
Dougal
1

No estoy seguro de entender completamente lo que quiere decir con "solo me importa la correlación por pares" , pero aquí hay algo que puede ayudar: use la inversión de su matriz de correlación. El término es igual a , donde es la x construida a partir de donde se han eliminado la -ésima columna y línea.Aii1det(A0i)/det(A)A0i(n1)(n1)Ai

Obtener el índice del coeficiente diagonal mínimo en le indica qué punto tiene la correlación más baja con el resto del conjunto.A1

Dependiendo de lo que realmente quiera hacer, puede tomar los 10 valores más bajos en la diagonal de la inversión u obtener el primero, luego calcular la inversión con el punto eliminado, y así sucesivamente.

Si esto no es lo que necesita, creo que este truco podría ser útil, pero no estoy seguro de cómo hacerlo.

Romain Reboulleau
fuente
0

Encuentra de elementos con la correlación por lo menos dos a dos: Desde una correlación de, por ejemplo explica de la relación entre dos series que tiene más sentido para minimizar la suma de los cuadrados de las correlaciones para su blanco elementos. Aquí está mi solución simple.kn0.60.36k

Reescribe tu matriz de correlaciones en una matriz de cuadrados de correlaciones. Suma los cuadrados de cada columna. Eliminar la columna y la fila correspondiente con la mayor suma. Ahora tiene una matriz . Repita hasta que tenga una matriz . También podría mantener las columnas y las filas correspondientes con las sumas más pequeñas. La comparación de los métodos, he encontrado en una matriz con y que sólo dos elementos con cierre sumas se mantienen de manera diferente y eliminados.n×n(n1)×(n1)k×kkn=43k=20

Jon Arts
fuente
2
Esto podría funcionar, pero suena ad hoc (se lee como un algoritmo codicioso) y no ha ofrecido ninguna razón matemática que sugiera que debería funcionar. ¿Tiene alguna garantía de que funcionará, o algún límite sobre qué tan cerca llegará a la mejor solución?
whuber
Solía rama de Gurobi y encuadernado para resolver sujeto a a la óptima para una matriz de correlación y . Obtuve un valor objetivo final de 8.13. A modo de comparación, este método codicioso logró 42.87, mientras que la selección aleatoria tuvo un valor objetivo esperado de 62.07. Así que no tan bueno, pero tampoco inútil. ¡Y este método seguramente tiene simplicidad y velocidad! x=argminx{0,1}n(xTC x)i=1nxi=k418×418k=20
Casimir
También hubo una correlación positiva entre qué entradas de fueron configuradas en una por Gurobi y este método codicioso. x
Casimir