Definición
Nuevo en la versión 8.2.
Normaliza una expresión numérica dentro de una ventana de valores. De forma predeterminada, los valores pueden oscilar entre cero y uno. El valor más pequeño se convierte en cero, el más grande en uno y todos los demás valores se escalan proporcionalmente entre cero y uno. También puede especificar un valor mínimo y máximo personalizados 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 sus 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 deseado en la salida. Si se omite, el valor predeterminado 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. |
$minMaxScaler devuelve un error si el input valor es alguno 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