J'essaie de créer une fonction qui prend un nombre et le normalise de 0 à 1 entre ses limites minimale et maximale. Par exemple:
Si je veux normaliser une valeur de 10 entre 5 et 15, j’appelle ceci:
val = 10; normalize(val, 5, 15);
Retourne 0.5
normaliser une valeur 0 entre -10 et 5
val = 0; normalize(val, -10, 5);
Retourne 0.666
Voici la fonction que j'ai créée:
function normalize(val, min, max){
// Shift to positive to avoid issues when crossing the 0 line
if(min < 0){
max += 0 - min;
val += 0 - min;
min = 0;
}
// Shift values from 0 - max
val = val - min;
max = max - min;
return Math.max(0, Math.min(1, val / max));
}
Ma question est la suivante: est-ce la méthode la plus efficace pour normaliser une valeur à 1 dimension? J'appellerai cette fonction plusieurs milliers de fois par image à 60 images par seconde. J'aimerais donc qu'elle soit optimisée au maximum pour réduire la charge de calcul. J'ai cherché des formules de normalisation, mais je ne trouve que des solutions bidimensionnelles ou tridimensionnelles.
Utiliser la réponse de Nathan Bertons avec une fonction préconfigurée pour certaines valeurs ayant les mêmes valeurs min
et max
, vous pouvez l'utiliser.
function normalize(min, max) {
var delta = max - min;
return function (val) {
return (val - min) / delta;
};
}
console.log([5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15].map(normalize(5, 15)));
Avec la réponse de Nathan Bertons , vous devez valider si max-min est égal à zéro, sinon le retour sera NaN:
function (val, max, min) {
if(max - min === 0) return 1 // or 0, it's up to you
return (val - min) / (max - min);
}
et vous pouvez utiliser un generalization pour restreindre la plage de valeurs de l'ensemble de données entre des points arbitraires a et b en utilisant:
function (val, max, min) {
if(max - min === 0) return 1 // or 0, it's up to you
return a + (((val - min) * (b-a)) / (max - min));
}
Je vais compléter la réponse de Nina Scholz, vous pouvez utiliser la bibliothèque de soulignement pour trouver le minimum et le maximum pour un tableau et vous pouvez utiliser comme suit, ou créer la vôtre (méthodes simples avec une simple boucle):
si vous utilisez nodeJS, vous devez installer le underscore avec la commande npm installer le underscore et l’utiliser avec la commande var _ = require('underscore/underscore');
.__ ou vous pouvez importer la bibliothèque au format HTML et l’utiliser sur votre site Web.
function min(arr) {
if (!arr.length) return null;
var minValue = arr[0];
for (var item of arr) {
if (item maxValue) maxValue = item;
}
return maxValue;
}
var array = [1, 2, 3, 4, 5, 6, 7, 8, 9];
function normalize(min, max) {
var delta = max - min;
return function (val) {
return (val - min) / delta;
};
}
function normalizeArray(array) {
var minValue = min(array); //if you use underscore _.min(array)
var maxValue = max(array);//if you use underscore _.max(array)
return array.map(normalize(minValue, maxValue));
}
console.log(normalizeArray(array));