¿Cómo dibujar un diagrama de pantalla en python? [cerrado]

11

Estoy usando la descomposición vectorial singular en una matriz y obteniendo las matrices U, S y Vt. En este punto, estoy tratando de elegir un umbral para la cantidad de dimensiones a retener. Me sugirieron que mirara un diagrama de pantalla pero me pregunto cómo trazarlo en numpy. Actualmente, estoy haciendo lo siguiente usando bibliotecas numpy y scipy en python:

U, S, Vt = svd(A)

¿Alguna sugerencia?

Leyenda
fuente
1
tome la diagonal de S, si aún no es una diagonal, cuadrátela, ordénela en orden decreciente, tome la suma acumulativa, divida por el último valor, luego grafíquela.
shabbychef
@shabbychef: ¿Quiere decir que tome la suma acumulativa y divida por la suma de todos los valores, verdad?
Leyenda
si. En matlab, sería[U,S,V] = svd(X);S = cumsum(sort(diag(S).^2,1,'descend'));S = S ./ S(end);plot(S);
shabbychef

Respuestas:

13

Aquí hay un ejemplo que se puede pegar en un indicador de IPython y generar una imagen como la siguiente (utiliza datos aleatorios):

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

#Make a random array and then make it positive-definite
num_vars = 6
num_obs = 9
A = np.random.randn(num_obs, num_vars)
A = np.asmatrix(A.T) * np.asmatrix(A)
U, S, V = np.linalg.svd(A) 
eigvals = S**2 / np.sum(S**2)  # NOTE (@amoeba): These are not PCA eigenvalues. 
                               # This question is about SVD.

fig = plt.figure(figsize=(8,5))
sing_vals = np.arange(num_vars) + 1
plt.plot(sing_vals, eigvals, 'ro-', linewidth=2)
plt.title('Scree Plot')
plt.xlabel('Principal Component')
plt.ylabel('Eigenvalue')
#I don't like the default legend so I typically make mine like below, e.g.
#with smaller fonts and a bit transparent so I do not cover up data, and make
#it moveable by the viewer in case upper-right is a bad place for it 
leg = plt.legend(['Eigenvalues from SVD'], loc='best', borderpad=0.3, 
                 shadow=False, prop=matplotlib.font_manager.FontProperties(size='small'),
                 markerscale=0.4)
leg.get_frame().set_alpha(0.4)
leg.draggable(state=True)
plt.show()

ingrese la descripción de la imagen aquí

Josh Hemann
fuente
Hermann: +1 ¡Gracias por tu tiempo! Sé que ha pasado mucho tiempo, sin embargo, es realmente bueno tenerlo :)
Leyenda
lo que es num_vars? no parece estar definido en tu script.
TheChymera
@TheChymera - Gracias por entender esto, he actualizado mi respuesta.
Josh Hemann el
@ Josh Hemann, sí, también descubrí esto mientras tanto, pero creo que sería mejor calcularlo desde la forma de A
TheChymera
1
@JoshHemann, ¿puede explicar esto: eigvals = S ** 2 / np.cumsum (S) [- 1] ?? He visto basado en algunos documentos eigvals = S ** 2 / (n-1) donde n es el número de características
makis