この問題には、わずか2^20(100万回程度)の可能性があります。ブルートフォースはうまく動作します。ここで
n <- 15
set.seed(17)
p <- runif(n)
loss <- ceiling(rgamma(n, 3, 1/2))
signif(rbind(Probability=p, Loss=loss), 2)
は、この例の入力値は次のとおりです:
Probability 0.16 0.97 0.47 0.78 0.41 0.54 0.21 0.19 0.78 0.19 0.43 0.0023 0.83 0.83 0.96
Loss 12.00 4.00 10.00 8.00 10.00 6.00 12.00 5.00 4.00 8.00 8.00 8.0000 4.00 4.00 4.00
は、expand.grid
で設定された電力のバイナリ指標を生成してのは、適度な大きさのいくつかのデータを生成してみましょう、説明するために
可能なすべての結果の損失および可能性の比較的迅速な計算のために配列演算を使用する:
powerset <- t(expand.grid(lapply(p, function(x) 0:1)))
probability <- apply(powerset * (2*p - 1) + (1-p), 2, prod)
losses <- colSums(powerset * loss)
(n
が20である場合、このエージングのXeonワークステーションで、これは5秒までかかります)
集計tapply
を用いて損失によっては:
x <- tapply(probability, losses, sum)
n
である場合(これは別の1〜2秒を要します(a)確率和を単一性に照合し、(b)期待損失が個々の事象の予想損失の合計であることを確認することによって一貫性を確認することができる。
if(sum(probability) - 1 != 0) warning("Unnormalized probability.")
if(sum(probability * losses) - sum(p*loss) != 0) warning("Inconsistent result.")
結果の損失分布をプロットしましょう。
library(ggplot2)
ggplot(data.frame(Loss=as.numeric(names(x)), Probability=x),
aes(Loss, Probability)) +
geom_col(color="White")
おっと、それはそれをやります。とてもいいです、ありがとう! –