7 votos

¿Por qué termino con una matriz altamente correlacionada cuando multiplico dos matrices aleatorias estrictamente positivas?

He estado trabajando con algunos de los grandes positivo matrices para una máquina de aprendizaje problema que estoy tratando de resolver. El problema consiste en multiplicar una matriz $A$ que es un conjunto de usuarios y artículos, con una matriz de $B$ que es un conjunto de elementos y atributos. Cuando nos fijamos en las columnas de $B$, podemos ver un mínimo de correlaciones. Sin embargo, cuando vamos a crear una nueva matriz, $C=A \bullet B$, vemos que las columnas de a $C$ están altamente correlacionados. Esto es claramente un problema para el aprendizaje de máquina.

Lo que hemos tratado es el de la normalización. Parece que el centrado y la ampliación de las características de $B$ a una distribución normal estándar se soluciona el problema de las altas correlaciones. También, en el fin de mantener la positiva restricciones, si le $L1$ norma las filas de $A$ y las columnas de a $B$, entonces las correlaciones no aparecen en el producto final.

La rareza viene cuando tratamos de utilizar las $L2$ normalizaciones, que para mí no debería ser muy distinta de la de $L1$. Sin embargo, si se $L2$ norma las filas de $A$ y las columnas de a $B$, entonces las correlaciones aparecen todavía (aunque son un poco más débiles) ... Esto es intuitivamente muy extraño para mí y me parece que no puede averiguar qué es.

¿Alguien tiene alguna idea de lo que está pasando aquí? He incluido R código de abajo, que recrea el problema con matrices aleatorias.

    library(corrplot)

    # randomly generate strictly positive matrices
    item_attributes <- matrix(runif(100000, min=0, max=1),1000,10)
    users_items <- matrix(sample(0:1, 10000*1000, rep=T, prob=c(0.95, 0.05)),10000,1000)

    # L1 Norm
    item_attributes_l1 <- t(t(item_attributes)/abs(apply(item_attributes,2,sum)))
    users_items_l1 <- users_items / abs(apply(users_items,1,sum))

    # L2 Norm
    item_attributes_l2 <- t(t(item_attributes)/sqrt(apply(item_attributes^2,2,sum)))
    users_items_l2 <- users_items/sqrt(apply(users_items^2,1,sum))

    # multiply the matrices
    mat_prod <- users_items %*% item_attributes
    mat_prod_l1 <- users_items_l1 %*% item_attributes_l1
    mat_prod_l2 <- users_items_l2 %*% item_attributes_l2

    # check for correlations in the final products
    corrplot(cor(mat_prod), main='\ndot product')
    corrplot(cor(mat_prod_l1), main='\nl1 norm')
    corrplot(cor(mat_prod_l2), main='\nl2 norm')

enter image description here

enter image description here

3voto

Tim Meers Puntos 633

Ayuda a pensar sobre el significado subyacente de las puntuaciones que el resultado de cada enfoque. Indicar el binario de usuario-objeto de las puntuaciones, $X_{hi}$ usuario $h=1,...,H$ elemento $i=1,...,I$ y el elemento-puntuaciones de atributos como $T_{ia}$ elemento $i=1,...,I$ y el atributo $a=1,...,A$.

Primero considere la posibilidad de usar el producto escalar (sin normalización). La puntuación en el atributo $a$ usuario$i$$\sum_{i=1}^I X_{hi} T_{ia}$, que es la suma de las puntuaciones en el atributo $a$ de todos los artículos comprados por el usuario $h$. Las puntuaciones de las $A$ atributos correlacionados debido a que son impulsados en parte por el número de artículos comprados por el usuario $h$.

library(corrplot)

# randomly generate strictly positive matrices
item_attributes <- matrix(runif(100000, min=0, max=1),1000,10)
users_items <- matrix(sample(0:1, 10000*1000, rep=T, prob=c(0.95, 0.05)),10000,1000)

# dotproduct
mat_prod <- users_items %*% item_attributes
corrplot(cor(mat_prod), main='\ndot product')

El próximo considerar la adopción de la norma L1 del usuario-objeto de las puntuaciones (pero dejando el elemento puntuaciones de atributos como está):

item_attributes_l1 <- t(t(item_attributes)/abs(apply(item_attributes,2,sum)))
users_items_l1 <- users_items / abs(apply(users_items,1,sum))
mat_prod_l1 <- users_items_l1 %*% item_attributes_l1
# corrplot(cor(mat_prod_l1), main='\nl1 norm')

mat_prod_l1A <- users_items_l1 %*% item_attributes
corrplot(cor(mat_prod_l1A), main='\nl1 norm - items only')

La puntuación en el atributo $a$ usuario $i$ sería entonces la media de las puntuaciones en el atributo $a$ a través de todos los artículos comprados por el usuario $h$: $\frac{1}{n_a} \sum_{i=1}^I X_{hi} T_{ia}$, donde $n_a = \sum_{i=1}^I X_{hi}$ es el número de artículos comprados. Tomando la media en lugar de la suma elimina la correlación impulsado por el número de artículos comprados.

El próximo considerar la adopción de la norma L2 de que el usuario-objeto puntuaciones (de nuevo, dejando el elemento puntuaciones de atributos como está):

item_attributes_l2 <- t(t(item_attributes)/sqrt(apply(item_attributes^2,2,sum)))
users_items_l2 <- users_items/sqrt(apply(users_items^2,1,sum))
mat_prod_l2 <- users_items_l2 %*% item_attributes_l2
# corrplot(cor(mat_prod_l2), main='\nl2 norm')

mat_prod_l2A <- users_items_l2 %*% item_attributes
corrplot(cor(mat_prod_l2A), main='\nl2 norm - items only')

La norma L2 de un conjunto de $i$ ítems binarios es $\sqrt{\sum_{i=1}^I X_{hi}^2} = \sqrt{\sum_{i=1}^I X_{hi}} = \sqrt{n_a}$, y por lo tanto el puntaje en el atributo $a$ usuario $i$ sería entonces, ser $\sqrt{n_a}$ veces la media de las puntuaciones en el atributo $a$ a través de todos los elementos de adquirirlo por el usuario $h$: $\frac{1}{\sqrt{n_a}} \sum_{i=1}^I X_{hi} T_{ia}$. Las puntuaciones de las $A$ atributos todavía estará correlacionada porque todos ellos son impulsados en parte por $\sqrt{n_a}$.

De estas tres opciones, a mí me parece que la toma de la L1 norma en los elementos (es decir, el promedio de los elemento de atributo de resultados en lugar de sumar ellos) se produce la mayor cantidad de interpretar los resultados. Si el número total de los artículos comprados es de interés, entonces siempre se puede calcular esto y se incluyen como un predictor más.

La mejor norma del artículo puntuaciones de atributos me parece enteramente una cuestión separada. Tenga en cuenta que tomar la L1 norma del elemento de atributo de las puntuaciones de las cantidades a asignar a cada elemento de una "porción" de la cantidad total de un atributo, que puede o no tener sentido según el contexto. En lugar de tomar la norma L2, podría tener más sentido intuitivo para volver a escalar el elemento de atributo de los puntajes tienen media 0 y SD 1, es decir,

item_attributes_Z <- apply(item_attributes, 2, scale)
apply(item_attributes_Z, 2, mean)
apply(item_attributes_Z, 2, sd)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X