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 Sólo está disponible en el
$setWindowFields escenario.
$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 se desea normalizar.
minValor mínimo deseado en la salida. Si se omite, el valor predeterminado 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
Donde:
| Valor a normalizar. |
| Valor mínimo deseado de salidas. |
| Valor máximo deseado de salidas. |
| 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
Matrices vacías
Instrumentos de cuerda
Ejemplos
Supongamos que los documentos de su 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:
scaled, que aplica los valores predeterminados,0y1, para escalar.scaledTo100, que aplica un rango entre0y100para escalar.
La salida muestra el valor original de a y los dos valores escalados. utiliza lo siguiente para los documentos,$minMaxScaler 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