我有一个代表某些事件发生概率的双精度数组,[25,25,25,10,15] 代表事件 A,B..E。这些数字加起来是 100。
通过我的分析,我希望能够划掉某个事件发生与否的可能性。
所以,如果我发现事件 E 是不可能的,那么我将该索引设置为 0。如何重新规范化数组,使总数加起来为 100,并保持每个事件的相对概率?
我将使用 C# 或 Java。
我有一个代表某些事件发生概率的双精度数组,[25,25,25,10,15] 代表事件 A,B..E。这些数字加起来是 100。
通过我的分析,我希望能够划掉某个事件发生与否的可能性。
所以,如果我发现事件 E 是不可能的,那么我将该索引设置为 0。如何重新规范化数组,使总数加起来为 100,并保持每个事件的相对概率?
我将使用 C# 或 Java。
您可以通过多种方式重新分配已移除事件的概率,例如
p/sum(p)
,其中sum(p)
是剩余概率的总和。“正确”的答案取决于您的问题的具体情况。
sum = 100 - P(E)
for each event e:
if e is E:
P(E) = 0
else:
P(e) = P(e)*100/sum
我假设概率将保持不变(即在您的示例中,第一个双倍的新可能应该是 25/85)。然后你需要做的是保存你删除的双精度数,减去 100 并除以每个双精度数,然后乘以 100。
Java代码:
double[] doubleArray = new double[] { 25, 25 ,25, 10, 15 }; //or any other array
double temp = 100-doubleArray[4]; //or any other specific value in the array
doubleArray[4] = 0;
for (int i; i<doubleArray.length; i++) {
doubleArray[i] = doubleArray[i]/temp*100;
}
一个更通用的解决方案是对数组进行归一化以给它一个特定的总数。
public static void setTotal(double total, double[] values) {
double sum = 0;
for (double value : values) sum += value;
double factor = total / sum;
for (int i = 0; i < values.length; i++)
values[i] *= factor;
}
这允许您更改任何值并确保总数是您想要的任何值(前提是总和不为零)