es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Calculando la matriz gorro cuando ‘n’ es grande (60000)

Estoy tratando de calcular la ‘matriz sombrero’ en Python. Estoy utilizando la siguiente fórmula. Cuando la longitud de X es grande (digamos 60,000), estoy teniendo problemas de falta de memoria.
H = Xinv(X’X)X’

¿Existe una manera computacionalmente más eficiente de hacer esto? Aquí está un fragmento del código:

import numpy as np
X = np.random.rand(60000,1)
hat = X.dot(np.linalg.inv(X.T.dot(X)).dot(X.T))
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma computacionalmente más eficiente de calcular la “matriz sombrero” en Python. Una forma de hacer esto es utilizando la función ‘pinv’ de numpy, que calcula la pseudoinversa de Moore-Penrose de una matriz. Esta función puede manejar matrices grandes sin causar problemas de memoria.

    Aquí hay un ejemplo de cómo usar la función ‘pinv’ para calcular la “matriz sombrero”:

    import numpy as np
    
    X = np.random.rand(60000, 1)
    X_pinv = np.linalg.pinv(X)
    hat = X.dot(X_pinv).dot(X)
    

    Al calcular la pseudoinversa de X usando ‘pinv’ y luego multiplicar X por ella, obtenemos la “matriz sombrero” sin tener que calcular la inversa de X’X, lo cual puede ser computacionalmente costoso para matrices grandes.

    Alternativamente, también podrías intentar utilizar una representación de matriz dispersa de X utilizando ‘scipy.sparse’, lo cual puede ayudar a reducir el uso de memoria al lidiar con matrices grandes. Sin embargo, este enfoque puede requerir un poco de código adicional y no necesariamente ser más rápido en términos de tiempo de cómputo.

    import numpy as np
    import scipy.sparse as sp
    
    X = sp.random(60000, 1, density=0.01)
    X_t = X.transpose()
    X_Xt = X.dot(X_t)
    X_Xt_inv = np.linalg.inv(X_Xt)
    hat = X_t.dot(X_Xt_inv).dot(X)
    

    Aquí, creamos una matriz dispersa X utilizando la función ‘random’ de ‘scipy.sparse’, con una densidad de 0.01 (lo que significa que solo el 1% de los elementos en la matriz son diferentes de cero). Luego creamos una representación de matriz dispersa de X’, calculamos X’X utilizando la multiplicación de matrices dispersas y luego calculamos la inversa de X’X utilizando ‘np.linalg.inv’. Finalmente, multiplicamos X’ por la inversa de X’X y luego multiplicamos el resultado por X para obtener la “matriz sombrero”.

Comments are closed.