Definição
Novidades na versão 8.2.
Normaliza uma expressão numérica dentro de uma janela de valores. Por padrão, os valores podem variar entre zero e um. O menor valor se torna zero, o maior valor se torna um e todos os outros valores são dimensionados proporcionalmente entre zero e um. Você também pode especificar um valor mínimo e máximo personalizado para o intervalo de saída normalizado.
$minMaxScaler
está disponível somente no estágio $setWindowFields
.
$minMaxScaler
operador de blocos tem a seguinte sintaxe:
{ $minMaxScaler: <numeric expression> }
O valor pode ser:
Uma expressão numérica, que é o valor que você deseja normalizar. Pode ser um campo numérico específico ou valor calculado a partir de seus documentos.
Um documento no seguinte formato:
{ input: <numeric expression>, min: <constant numeric expression>, max: <constant numeric expression> } CampoDescriçãoinput
expressão numérica , que contém o valor que você deseja normalizar.
min
Valor mínimo que você deseja na saída. Se omitido, o padrão é
0
.max
Valor máximo que você deseja na saída. Se omitido, o padrão é
1
.
Comportamento
$minMaxScaler
usa a seguinte fórmula para normalizar a expressão numérica :
minMaxScaler(x, min, max) = ((x - min(X)) / (max(X) - min(X))) * (max - min) + min
Onde:
| Valor a normalizar. |
| Valor mínimo desejado de saídas. |
| Valor máximo desejado de saídas. |
| Valor mínimo na faixa. |
| Valor máximo no intervalo. |
O $minMaxScaler
retorna um erro se o valor input
for qualquer um dos seguintes:
Non-numeric
Zero
Arrays vazias
Strings
Exemplos
Suponha que seus documentos na sua coleção tenham um campo chamado a
com os seguintes valores:
{ "_id": 1, "a": 1 } { "_id": 2, "a": 5 } { "_id": 3, "a": 13 } { "_id": 4, "a": 21 }
Considere o seguinte estágio do pipeline e a saída:
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}
No exemplo anterior, o pipeline usa o $minMaxScaler
para calcular dois valores dimensionados:
scaled
, que aplica os valores padrão,0
e1
, à escala.scaledTo100
, que aplica um intervalo entre0
e100
à escala.
A saída mostra o valor original de a
e os dois valores dimensionados. O $minMaxScaler
utiliza o seguinte para os documentos, onde min(X)
é 1
e max(X)
é 21
(calculado a partir dos documentos), para retornar os valores dimensionados:
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