Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

141
Vistas
Raíz cuadrática media en Postgresql

Estoy trabajando en la biblioteca de duplicación de imágenes que usa ML para predecir la similitud de la imagen. En este proceso, Root Mean Square se usa para calcular la similitud entre dos imágenes (no voy a explicar cómo). La función que lo hace se parece a esto.

 # Function that calulates the mean squared error (mse) between two image matrices def _mse(imageA, imageB): err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2) err /= float(imageA.shape[0] * imageA.shape[1]) return err

Mi modelo funcionó bien cuando lo probé en carpetas que contenían imágenes de 5K, pero tomó demasiado tiempo. Así que decidí refactorizar mi código y almacenar todos los tensores en una base de datos. ¿Por qué?

Si almaceno los tensores de todas las imágenes en una base de datos y luego consulto el tensor de la próxima imagen, obtendré resultados rápidamente. Repasar todas las imágenes una y otra vez + emparejar una imagen RMS con otras dará como resultado muchas combinaciones que llevarán tiempo.

Solución

Si almaceno todos los tensores que son una lista o una matriz y los almaceno en una base de datos como Postgres, entonces puedo consultarlos fácilmente con RMS wrt para obtener todas las imágenes a la vez que recorrerlas y descubrir la duplicidad.

Necesito su ayuda para averiguar si hay alguna forma de consultar a Postgres para obtener imágenes con el RMS más cercano.

Algo como esto:

 SELECT ID_PARTNER, ID_ACCOUNT , SQRT(Avg( POWER(Act_F_1 - Pred_F_1 , 2) ) ) as feature_1_rmse FROM ... GROUP BY ID_PARTNER, ID_ACCOUNT

Pregunta similar: obtenga la puntuación RMSE mientras obtiene datos de la tabla directamente. Escriba una consulta para eso

Así es como se ve la base de datos

Así es como se ve la base de datos

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Si entiendo lo que quiere hacer correctamente, solo necesita crear una columna para contener el cálculo de RMSE y luego actualizar la tabla para hacer el cálculo.

 UPDATE table_name as orig set RMSE=(select SQRT(Avg( POWER(Act_F_1 - Pred_F_1 , 2) ) ) from table_name as copy where orig.ID_PARTNER=copy.ID_PARTNER and orig.ID_ACCOUNT=copy.ID_ACCOUNT GROUP BY ID_PARTNER, ID_ACCOUNT);

editar: no me había dado cuenta del grupo. Creo que esto crea un campo precalculado correctamente, aunque probablemente sea muy ineficiente, ya que creo que se volverá a calcular para cada par ID_PARTNER ID_ACCOUNT. Puede haber una mejor manera de hacer esto en SQL. Simplemente SELECT DISTINCT ID_PARTNER, ID_ACCOUNT from table_name luego ejecutaría eso en el código y SELECT SQRT(Avg( POWER(Act_F_1 - Pred_F_1 , 2) ) ) from table_name where ID_PARTNER=? and ID_ACCOUNT=? para cada una de las tuplas que he update table_name set RMSE=? para cada uno de esos valores. Alternativamente, podría tener una tabla que sea solo ID_PARTNER, ID_ACCOUNT, RMSE y solo poner los resultados allí una vez.

Luego, la tabla en la base de datos tendrá todos los valores precalculados y podrá ejecutar consultas en ella. Si quiere cosas cercanas a un valor de search_RMSE

 SELECT ...,ABS(RMSE - search_RMSE) as RMSE_DIFF from table_name order by RMSE_DIFF;

Esa no es necesariamente una forma súper optimizada de hacer los cálculos. Habla de duplicidad, lo que significaría que está buscando valores idénticos, pero sus cálculos son de punto flotante, por lo que incluso podría terminar con valores que deberían ser idénticos pero no terminar de esa manera. ¿Solo le importa el valor más cercano o le importa una cantidad de los valores más cercanos? Si solo crea una tabla gigante y la ordena por RMSE, el valor más cercano para cada fila será la fila de arriba o la fila de abajo y la colección de valores más cercanos crecerá hacia arriba y hacia abajo desde la fila.

No estoy del todo seguro de por qué quiere involucrar una base de datos en esto a menos que no pueda caber todos los datos en la memoria. Si ese es el caso, podría simplemente colocar los datos sin procesar en la base de datos y luego usar la selección a la que hace referencia con una cláusula order by y almacenarla en fragmentos fuera de la base de datos si lo desea.

De todos modos, hay muchas maneras de hacer esto, yo solo usaría un módulo cython para evitar las matemáticas extremadamente lentas en python (es notablemente más rápido que numpy y es casi idéntico a python) y hago todo esto con estructuras de datos en memoria y tal vez algunos archivos temporales.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda