Docs 菜单
Docs 主页
/
数据库手册
/ / /

$minMaxScaler(窗口函数)

8.2版本新增

$minMaxScaler

对值窗口内的数值表达式进行规范化。默认下,值的范围可以范围0 和 1 之间。最小值变为零,最大值变为 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

其中:

x

要标准化的值。

min

所需的输出最小值。

max

所需的输出最大值。

min(X)

范围中的最小值。

max(X)

范围中的最大值。

$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 计算两个换算后的值:

  • scaled,这会对扩展应用默认值 01

  • scaledTo100,它将 0100 之间的范围应用于扩展。

输出显示a 的原始值和两个缩放后的值。$minMaxScaler 将以下内容用于文档,其中min(X)1max(X)21 (根据文档计算得出),以返回换算后的值:

{a: 1}
scaled = ((1 - 1) / (21 - 1)) * (1 - 0) + 0 = 0
scaledTo100 = ((1 - 1) / (21 - 1)) * (100 - 0) + 0 = 0
{a: 5}
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
{a: 13}
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
{a: 21}
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

后退

$minN-array-element

在此页面上