1

我有下表:

产品名称 特征 概率_for_feature
一个 w 0.2
一个 z 0.8
w 0.2
z 0.8
X 0.3

我想为每个产品名称获取其特征的概率乘积,这意味着产品名称 A 具有概率为 0.2 的特征 w 和概率为 0.8 的特征 z,因此特征 A 的乘积将是 0.2*0.8= 0.16。因此,在上表中,我将得到:

产品名称 特征 概率_for_feature
一个 [w,z] 0.16
[w,z,x] 0.048

要不就 :

产品名称 可能性
一个 0.16
0.048

我没有找到任何产品或乘法函数作为聚合函数,并希望得到一些帮助。谢谢 !

4

2 回答 2

1

这是一个选项,使用累积和并利用以下事实log(x1) + log(x2) … + log(xN) == log(x1 * x2 * … * xN)

datatable(productName:string, feature:string, probability_for_feature:double)
[
    'A', 'w', 0.2,
    'A', 'z', 0.8,
    'B', 'w', 0.2,
    'B', 'z', 0.8,
    'B', 'x', 0.3,
]
| order by productName asc 
| extend l = log10(probability_for_feature), rn = row_number()
| extend cumsum = row_cumsum(l, productName != prev(productName))
| summarize arg_max(rn, *), features = make_list(feature) by productName
| project productName, features, product = exp10(cumsum)
产品名称 特征 产品
一个 [
“w”,
“z”
]
0.16
[
“w”、
“z”、
“x”
]
0.048
于 2022-01-25T15:55:32.230 回答
1

对于任何函数的聚合,您可以使用扫描运算符。
扫描运算符示例累积和
乘法示例:

datatable (productName: string, feature: string, probability_for_feature: double)
[
        'A', 'w', 0.2,
        'A', 'z', 0.8,
        'B', 'w', 0.2,
        'B', 'z', 0.8,
        'B', 'x', 0.3,
]
| sort by productName asc
| partition by productName
(
    // for every productName scan all rows
    scan declare (probability: double= 1.0) with 
    (
        // multiply probability for every row and return last result
        step s1 output=last: true => probability = probability_for_feature * s1.probability;
    )
)
| project productName, probability
于 2022-01-25T16:03:25.837 回答