Definición
Nuevo en la versión 8.2.
Normaliza una expresión numérica dentro de una ventana de valores. Por defecto, los valores pueden oscilar entre cero y uno. El valor más pequeño se convierte en cero, el valor más grande se convierte en uno, y todos los demás valores se escalan proporcionalmente entre cero y uno. También puedes especificar un valor mínimo y máximo personalizado para el rango de salida normalizado.
$minMaxScaler solo está disponible en el
$setWindowFields etapa.
$minMaxScaler el operador de ventana tiene la siguiente sintaxis:
{ $minMaxScaler: <numeric expression> }
El valor puede ser:
Una expresión numérica, que es el valor que desea normalizar. Puede ser un campo numérico específico o un valor calculado a partir de tus documentos.
Un documento en el siguiente formato:
{ input: <numeric expression>, min: <constant numeric expression>, max: <constant numeric expression> } CampoDescripcióninputExpresión numérica que contiene el valor que deseas normalizar.
minValor mínimo que se desea en la salida. Si se omite, por defecto es
0.maxValor máximo que quieres obtener en el resultado. Si se omite, el valor por defecto es
1.
Comportamiento
$minMaxScaler utiliza la siguiente fórmula para normalizar la expresión numérica:
minMaxScaler(x, min, max) = ((x - min(X)) / (max(X) - min(X))) * (max - min) + min
Dónde:
| Valor a normalizar. |
| Valor mínimo deseado de outputs. |
| Valor máximo deseado de los resultados. |
| Valor mínimo en el rango. |
| Valor máximo en el rango. |
El $minMaxScaler devuelve un error si el valor input es cualquiera de los siguientes:
Non-numeric
Nulo
Arreglos vacíos
Strings
Ejemplos
Suponga que sus documentos en la colección tienen un campo llamado a con los siguientes valores:
{ "_id": 1, "a": 1 } { "_id": 2, "a": 5 } { "_id": 3, "a": 13 } { "_id": 4, "a": 21 }
Considera la siguiente etapa del pipeline y sus resultados:
db.example.aggregate([ {$setWindowFields: { sortBy: {a: 1}, output: { scaled: {$minMaxScaler: "$a"}, scaledTo100: {$minMaxScaler: {input: "$a", min: 0, max: 100}}, } }} ])
{a: 1, scaled: 0, scaledTo100: 0} {a: 5, scaled: 0.2, scaledTo100: 20} {a: 13, scaled: 0.6, scaledTo100: 60} {a: 21, scaled: 1, scaledTo100: 100}
En el ejemplo anterior, el pipeline utiliza el $minMaxScaler para calcular dos valores escalados:
scaledque aplica los valores por defecto,0y1, a escala.scaledTo100, que aplica un rango entre0y100para escalar.
La salida muestra el valor original de a y los dos valores escalados. El $minMaxScaler utiliza lo siguiente para los documentos, donde min(X) es 1 y max(X) es 21 (calculado a partir de los documentos), para devolver los valores escalados:
scaled = ((1 - 1) / (21 - 1)) * (1 - 0) + 0 = 0 scaledTo100 = ((1 - 1) / (21 - 1)) * (100 - 0) + 0 = 0
scaled = ((5 - 1) / (21 - 1)) * (1 - 0) + 0 = (4 / 20) * 1 + 0 = 0.2 scaledTo100 = ((5 - 1) / (21 - 1)) * (100 - 0) + 0 = (4 / 20) * 100 + 0 = 20
scaled = ((13 - 1) / (21 - 1)) * (1 - 0) + 0 = (12 / 20) * 1 + 0 = 0.6 scaledTo100 = ((13 - 1) / (21 - 1)) * (100 - 0) + 0 = (12 / 20) * 100 + 0 = 60
scaled = ((21 - 1) / (21 - 1)) * (1 - 0) + 0 = (20 / 20) * 1 + 0 = 1 scaledTo100 = ((21 - 1) / (21 - 1)) * (100 - 0) + 0 = (20 / 20) * 100 + 0 = 100