定義
バージョン8.2の新機能。
値のウィンドウ内で数値式を正規化します。デフォルトでは 、値は 0 から 1 の範囲で指定できます。最小値は 0、最大値は 1 になり、その他すべての値は 0 から 1 の間で比例的に増やす。正規化された出力範囲のカスタム最小値と最大値を指定することもできます。
$minMaxScaler
は $setWindowFields
ステージでのみ使用できます。
$minMaxScaler
ウィンドウオペレーターの構文は次のとおりです。
{ $minMaxScaler: <numeric expression> }
値は次のとおりです。
正規化する値である数値式。ドキュメントから計算された特定の数値フィールドまたは値を指定できます。
次の形式のドキュメント:
{ input: <numeric expression>, min: <constant numeric expression>, max: <constant numeric expression> } フィールド説明input
正規化する値を含む数値式。
min
出力に含める最小値。省略した場合、デフォルトは
0
になります。max
出力に含める最大値。省略した場合、デフォルトは
1
になります。
動作
$minMaxScaler
は、次の式を使用して数値式を正規化します。
minMaxScaler(x, min, max) = ((x - min(X)) / (max(X) - min(X))) * (max - min) + min
以下の条件に一致するもの。
| 正規化する値。 |
| 出力の必要な最小値。 |
| 必要な出力の最大値。 |
| 範囲内の最小値。 |
| 範囲内の最大値。 |
$minMaxScaler
input
の値が次のいずれかの場合、 はエラーを返します。
Non-numeric
null
空の配列
文字列
例
コレクション内のドキュメントには、次の値を持つ a
という名前のフィールドがあるとします。
{ "_id": 1, "a": 1 } { "_id": 2, "a": 5 } { "_id": 3, "a": 13 } { "_id": 4, "a": 21 }
次のパイプラインステージと 出力について考えてみましょう。
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}
前の例では、パイプラインは$minMaxScaler
を使用して 2 つのスケーリングされた値を計算します。
scaled
は、を増やすためにデフォルト値である0
と1
を適用します。scaledTo100
は、 を増やすするために0
と100
の間の範囲を適用します。
出力には、a
の元の値と 2 つのスケーリングされた値が表示されます。$minMaxScaler
は、ドキュメントに対して次の を使用します。ここでは、min(X)
は 1
、max(X)
は 21
(ドキュメントから計算)で、スケーリングされた値を返します。
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