2012-08-29 31 views
8

Tengo un gran scipy.sparse.csc_matrix y me gustaría normalizarlo. Eso es restar la media de la columna de cada elemento y dividir por la desviación estándar de la columna (std) i.¿Cómo calculo la varianza de una columna de una matriz dispersa en Scipy?

scipy.sparse.csc_matrix tiene .mean(), pero ¿hay una manera eficiente de calcular la varianza o std?

+5

Iba a publicar un código python para calcular la varianza de forma vectorizada, pero si lo "normaliza" no tendrá ningún elemento cero, así que antes de hacerlo, por favor díganos que no está estropeando su estructura de dispersión de todos modos. – seberg

+0

Ese es un muy buen punto Sebastian, gracias. No pensé en eso. – nickponline

Respuesta

5

Se puede calcular la varianza por sí mismo utilizando la media, con el siguiente formula:

E[X^2] - (E[X])^2 

E[X] representa la media. Entonces, para calcular E[X^2], deberá cuadrar el csc_matrix y luego usar la función mean. Para obtener (E[X])^2, simplemente necesita cuadrar el resultado de la función mean obtenida con la entrada normal.

+2

Para cuadrar la matriz, para simplificar: 'c = matrix.copy(); c.data ** = 2' y luego 'c.mean (0); del c' (solo pudo reemplazar '.data'). Pero mantengo que el OP suena mal diciendo restar de todos los elementos. – seberg

+0

Gracias por la respuesta y los comentarios. – nickponline

3

La forma más eficiente es en realidad para densificar toda la matriz, y luego estandarizar en la forma habitual con

X = X.toarray() 
X -= X.mean() 
X /= X.std() 

Como @Sebastian ha señalado en sus comentarios, normalización destruye la estructura de escasez (introduce un montón de no cero elementos) en el paso de resta, por lo que no sirve de nada mantener la matriz en un formato disperso.

+0

Esto no es realmente cierto. Usar la fórmula en la respuesta de Sicco permite utilizar la dispersión para reducir el tiempo de cálculo. –

Cuestiones relacionadas