定義
バージョン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以下の条件に一致するもの。
| 正規化する値。 |
| 出力の必要な最小値。 |
| 必要な出力の最大値。 |
| 範囲内の最小値。 |
| 範囲内の最大値。 |
$minMaxScalerinputの値が次のいずれかの場合、 はエラーを返します。
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(ドキュメントから計算)で、スケーリングされた値を返します。
{a: 1}
scaled = ((1 - 1) / (21 - 1)) * (1 - 0) + 0 = 0scaledTo100 = ((1 - 1) / (21 - 1)) * (100 - 0) + 0 = 0{a: 5}
scaled = ((5 - 1) / (21 - 1)) * (1 - 0) + 0 = (4 / 20) * 1 + 0 = 0.2scaledTo100 = ((5 - 1) / (21 - 1)) * (100 - 0) + 0 = (4 / 20) * 100 + 0 = 20{a: 13}
scaled = ((13 - 1) / (21 - 1)) * (1 - 0) + 0 = (12 / 20) * 1 + 0 = 0.6scaledTo100 = ((13 - 1) / (21 - 1)) * (100 - 0) + 0 = (12 / 20) * 100 + 0 = 60{a: 21}
scaled = ((21 - 1) / (21 - 1)) * (1 - 0) + 0 = (20 / 20) * 1 + 0 = 1scaledTo100 = ((21 - 1) / (21 - 1)) * (100 - 0) + 0 = (20 / 20) * 100 + 0 = 100