【发布时间】:2020-02-18 06:53:54
【问题描述】:
我试图实现“Bonferroni 不等式”,它使用 Javascript UDF 对 GCP BigQuery 上的数据科学用例的许多独立事件的联合概率进行建模。但是我对 JS 很陌生,也不知道有什么好的做法。
要应用的公式如下:
P(U Ai) = SUM(P(Ai)) - SUM(P(Ai)*P(Aj)) + SUM(P(Ai)*P(Aj)*P(Ak) - ... i != j != k
我对该函数的输入是单个事件概率的数组:
[P(A1), P(A2), P(A3), ...]
我本能地在行中创建了“for循环”以获得结果,但是,看到这么丑陋的代码很痛苦,所以想知道你们中是否有人知道如何以更优雅和优化的方式实现它?
这是我为 4 级 Bonferroni 不等式编写的函数:
function unionBoundProbability(probList){
var intersection2 = 0;
var intersection3 = 0;
var intersection4 = 0;
var i = 0;
var j = 0;
var k = 0;
var l = 0;
var sum = 0;
var product = 1;
var sum = probList.reduce((a, b) => a + b, 0);
for(i = 0; i < probList.length; i++){
product *= probList[i];
for(j = i+1; j < probList.length; j++){
intersection2 += probList[i]*probList[j];
for(k = j+1; k < probList.length; k++){
intersection3 += probList[i]*probList[j]*probList[k];
for(l = k+1; l < probList.length; l++){
intersection4 += probList[i]*probList[j]*probList[k]*probList[l];
}
}
}
}
switch (probList.length) {
case 0:
return 0;
break;
case 1:
return probList[0];
break;
case 2:
return sum - product;
break;
case 3:
return sum - intersection2 + product;
break
case 4:
return sum - intersection2 + intersection3 - product;
case 5 :
return sum - intersection2 + intersection3 - intersection4 + product;
default:
return Math.max((sum - intersection2 + intersection3 - intersection4), Math.max.apply(Math, probList));
}
}
我要做的是计算作为输入传递的所有概率的并集概率的近似值。
如果我的概率小于 5,则 switch 语句将应用精确的公式。否则,默认情况下应用 Bonferroni 近似,(因为我正在对接收信号的机会进行建模,如果估计值小于使用最佳天线的概率,那么我会保留最好的天线)。
感谢您的帮助
【问题讨论】:
-
我建议你阅读递归并实现递归函数作为解决方案
-
代码有效吗?你有像
probList这样的数据吗?可能还有其他缺失的信息和想要的结果? -
您可能希望删除 JavaScript 标记,因为这是一个不特定于 JavaScript 的一般编程问题
-
层数是外部参数还是应该从probList派生?
-
你好像没有在返回值中使用
intersection4...
标签: javascript algorithm loops