2
votes

Comment puis-je trouver la valeur avec le MSE minimum avec un tableau numpy?

Mes valeurs possibles sont:

[[0.9539342  0.84090066 0.46451256 0.09715253],
 [0.9923432  0.01231235 0.19491441 0.09715253]
 ....

J'ai quelques valeurs:

0: [0 0 0 0]
1: [1 0 0 0]
2: [1 1 0 0]
3: [1 1 1 0]
4: [1 1 1 1]

Je veux savoir laquelle de mes valeurs possibles ceci est le plus proche de mes nouvelles valeurs. Idéalement, je veux éviter de faire une boucle for et me demande s'il existe une sorte de moyen vectorisé de rechercher l'erreur quadratique moyenne minimale?

Je veux qu'il renvoie un tableau qui ressemble comme: [2, 1 ....


2 commentaires

Quel est ce format de valeurs possibles? Cela ressemble à un dictionnaire


Il n'y a donc pas de format strict, mais oui, nous pouvons en faire un dict si besoin est


3 Réponses :


1
votes

Supposons que vos données d'entrée soient un dictionnaire. Vous pouvez ensuite utiliser NumPy pour une solution vectorisée. Vous convertissez d'abord vos listes d'entrée en un tableau NumPy et utilisez l'argument axis = 1 pour obtenir le RMSE.

# Input data
dicts = {0: [0, 0, 0, 0], 1: [1, 0, 0, 0], 2: [1, 1, 0, 0], 3: [1, 1, 1, 0],4: [1, 1, 1, 1]}
new_value = np.array([0.9539342, 0.84090066, 0.46451256, 0.09715253])

# Convert values to array
values = np.array(list(dicts.values()))

# Compute the RMSE and get the index for the least RMSE 
rmse = np.mean((values-new_value)**2, axis=1)**0.5
index = np.argmin(rmse)    

print ("The closest value is %s" %(values[index]))
# The closest value is [1 1 0 0]


1 commentaires

J'ai ajouté plus de détails à la question Plus précisément, j'ai besoin que cela fonctionne sur BEAUCOUP de new_value s



0
votes

Numpy pur:

val1 = np.array ([
   [0, 0, 0, 0],
   [1, 0, 0, 0],
   [1, 1, 0, 0],
   [1, 1, 1, 0],
   [1, 1, 1, 1]
  ])

print val1
val2 = np.array ([0.9539342, 0.84090066, 0.46451256, 0.09715253], float)
val3 = np.round(val2, 0)
print val3

print np.where((val1 == val3).all(axis=1)) # show a match on row 2 (array([2]),)


1 commentaires

Cela ne fonctionnera pas si ma valeur prédite est arrondie à quelque chose qui ne figure pas dans le dict



1
votes

Vous pouvez utiliser np.argmin pour obtenir l'index le plus bas de la valeur rmse qui peut être calculée en utilisant np.linalg.norm

[np.argmin(np.linalg.norm(a-i, axis=1)) for i in b] 
#Outputs [2, 1]

Comme mentionné dans l'édition, b peut avoir plusieurs lignes. L'op veut éviter la boucle for, mais je n'arrive pas à trouver un moyen d'éviter la boucle for. Voici une méthode de compilation de listes, mais il pourrait y avoir une meilleure façon

import numpy as np
a = np.array([[0, 0, 0, 0], [1, 0, 0, 0], [1, 1, 0, 0],[1, 1, 1, 0], [1, 1, 1, 1]])
b = np.array([0.9539342, 0.84090066, 0.46451256, 0.09715253])
np.argmin(np.linalg.norm(a-b, axis=1))
#outputs 2 which corresponds to the value [1, 1, 0, 0]


3 commentaires

J'ai ajouté plus de détails à la question Plus précisément, j'ai besoin que cela fonctionne sur BEAUCOUP de nouvelles_valeurs


Est-ce que linalg.norm calcule MSE?


Il calcule rmse qui est essentiellement mse si vous voulez trouver l'argmin.