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 ....
3 Réponses :
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]
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
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]),)
Cela ne fonctionnera pas si ma valeur prédite est arrondie à quelque chose qui ne figure pas dans le dict
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]
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.
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
dictsi besoin est