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.

Error de formas no alineadas al realizar la descomposición en valores singulares utilizando scipy.sparse.linalg.

Estoy tratando de utilizar la Descomposición de Valores Singulares (SVD, por sus siglas en inglés) para predecir valores faltantes en una matriz dispersa. El Capítulo 4 del curso de Datacamp “Building Recommendation Engines in Python” proporciona un ejemplo de cómo hacerlo con las calificaciones de películas, lo cual es genial. Como primer paso, he estado tratando de replicar este ejemplo de Datacamp en mi PC local utilizando Jupyter Notebook. Sin embargo, cuando intento multiplicar las matrices U_Sigma y Vt que son el resultado de la función “svds”, obtengo un error:

ValueError: las formas (671,) y (6,9161) no son compatibles: 671 (dim 0) != 6 (dim 0)

Estoy utilizando este conjunto de datos: https://www.kaggle.com/rounakbanik/the-movies-dataset/version/7?select=ratings_small.csv

Aquí está el código que estoy tratando de ejecutar:

    import pandas as pd

filename = 'ratings_small.csv'
df = pd.read_csv(filename)

df.head()
user_ratings_df = df.pivot(index='userId', columns='movieId', values='rating')

# Obtén la calificación promedio para cada usuario
avg_ratings = user_ratings_df.mean(axis=1)

# Centra las calificaciones de cada usuario alrededor de 0
user_ratings_centered = user_ratings_df.sub(avg_ratings, axis=1)

# Rellena todos los valores faltantes con 0s
user_ratings_centered.fillna(0, inplace=True)
# Imprime la media de cada columna
print(user_ratings_centered.mean(axis=1))

######################
# Importa las librerías necesarias
from scipy.sparse.linalg import svds
import numpy as np

# Descompone la matriz
U, sigma, Vt = svds(user_ratings_centered)

## Ahora que tienes tus tres matrices factoriales, puedes multiplicarlas para obtener los datos de calificaciones completos sin valores faltantes. En este ejercicio, utilizarás la función de producto punto de numpy para multiplicar U y sigma primero, luego el resultado por Vt. Luego podrás añadir las calificaciones promedio para cada fila para encontrar tus calificaciones finales.

# Producto punto de U y sigma
U_sigma = np.dot(U, sigma)

# Producto punto del resultado y Vt
U_sigma_Vt = np.dot(U_sigma, Vt)
Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que hay una incompatibilidad de forma entre las matrices U_sigma y Vt. Específicamente, dice que las dimensiones 671 y 6 no coinciden. Esto sugiere que hay un problema con las dimensiones de las matrices que se están multiplicando.

    Tras inspeccionar el código, parece que el problema radica en el número de dimensiones utilizadas para crear la matriz U_sigma. El código utiliza el producto escalar de U y sigma para crear U_sigma, pero sigma es una matriz unidimensional con solo 6 valores (ya que se utilizan 6 factores latentes en la descomposición en valores singulares). Por lo tanto, U_sigma tiene dimensiones (671,), lo cual es incorrecto.

    Para solucionar este problema, es necesario transformar la matriz sigma en una matriz diagonal antes de utilizarla en el producto escalar. Esto se puede hacer utilizando la función np.diag de numpy. El código corregido se muestra a continuación:

    # Producto escalar de U y sigma (convertido en matriz diagonal)
    U_sigma = np.dot(U, np.diag(sigma))
    
    # Producto escalar del resultado y Vt
    U_sigma_Vt = np.dot(U_sigma, Vt)
    

    Después de realizar este cambio, el código debería ejecutarse sin errores y producir los datos completos de las calificaciones.

Comments are closed.