概率编程——Figaro的基础示例

概率编程——Figaro的基础示例

0. 导包

import com.cra.figaro.algorithm.factored.VariableElimination
import com.cra.figaro.algorithm.sampling.Importance
import com.cra.figaro.language._
import com.cra.figaro.library.atomic.continuous.{Normal, Uniform}
import com.cra.figaro.library.atomic.discrete.Binomial
import com.cra.figaro.library.compound.If

1. 原子元素

  • 离散型
    • Flip
    val sunnyToday = Flip(0.2)
    println(VariableElimination.probability(sunnyToday, true))
    
    • Select
    val language = Select(
      0.5 -> "Java",
      0.3 -> "Scala",
      0.2 -> "Python"
    )
    println(VariableElimination.probability(language, "Scala"))
    
    • Binomial
    val numSunnyDayInWeek = Binomial(7, 0.5)
    println(VariableElimination.probability(numSunnyDayInWeek, 3))
    
  • 连续型
    • Normal 正态分布
    val temperature = Normal(40, 100)
    val greaterThan50 = (d: Double) => d > 50
    println(Importance.probability(temperature, greaterThan50))
    
    • Uniform 连续均匀分布
    val temperature2 = Uniform(10, 81)
    println(Importance.probability(temperature2, greaterThan50))
    

2. 复合元素

  • If
    val sunnyToday = Flip(0.2)
    val greetingToday = If(sunnyToday,
      Select(0.6 -> "Hello World!", 0.4 -> "Howdy, universe!"),
      Select(0.2 -> "Hello World!", 0.8 -> "Oh no, not again!")
    )
    println(VariableElimination.probability(greetingToday, "Hello World!"))
    
    sunnyToday.observe(true)
    println(VariableElimination.probability(greetingToday, "Hello World!"))
    
  • Dist
    val goodMood = Dist(
      0.2 -> Flip(0.6),
      0.8 -> Flip(0.2)
    )
    println(VariableElimination.probability(goodMood, true))
    
  • 原子复合
    val sunnyTodayProbability = Uniform(0, 0.6)
    val sunnyToday2 = Flip(sunnyTodayProbability)
    println(Importance.probability(sunnyToday2, true))
    
    val tempMean = Normal(40, 36)
    val temperature = Normal(tempMean, 100)
    println(Importance.probability(temperature, (d: Double) => d > 50))
    
  • Apply
    val sunnyDaysInMonth = Binomial(30, 0.2)
    val getQuality = (i: Int) => if (i > 10) "good" else if (i > 5) "average" else "poor"
    val monthQuality = Apply(sunnyDaysInMonth, getQuality)
    println(VariableElimination.probability(monthQuality, "good"))
    
    val teamWinsInMonth = Binomial(5, 0.4)
    val monthQuality2 = Apply(sunnyDaysInMonth, teamWinsInMonth,
      (days: Int, wins: Int) => {
        val x = days * wins
        if (x > 20) "good" else if (x > 10) "average" else "poor"
      })
    println(VariableElimination.probability(monthQuality2, "good"))
    
  • Chain
    val goodMood2 = Chain(monthQuality,
      (s: String) =>
        if (s == "good") Flip(0.9)
        else if (s == "average") Flip(0.6)
        else Flip(0.1)
    )
    println(VariableElimination.probability(goodMood2, true))
    
    val sunnyToday3 = Flip(0.2)
    val goodMood3 = Chain(monthQuality, sunnyToday3,
      (quality: String, sunny: Boolean) => {
        (quality, sunny) match {
          case ("good", true) => Flip(0.9)
          case ("average", true) => Flip(0.7)
          case (_, true) => Flip(0.4)
          case ("good", false) => Flip(0.6)
          case ("average", false) => Flip(0.3)
          case (_, false) => Flip(0.05)
        }
      })
    println(VariableElimination.probability(goodMood3, true))
    

3. 条件与约束

  • 条件
    val sunntDayInMonth = Binomial(30, 0.2)
    val monthQuality = Apply(sunntDayInMonth,
      (i: Int) => if (i > 10) "good" else if (i > 5) "average" else "poor"
    )
    val goodMood = Chain(monthQuality,
      (s: String) => {
        if (s == "good") Flip(0.9)
        else if (s == "average") Flip(0.6)
        else Flip(0.1)
      })
    println(VariableElimination.probability(goodMood, true))
    
    // 设置条件,会清楚之前所有的条件
    sunntDayInMonth.setCondition((i: Int) => i > 8)
    println(VariableElimination.probability(goodMood, true))
    
    // 添加条件
    sunntDayInMonth.addCondition((i: Int) => i % 3 == 2)
    println(VariableElimination.probability(goodMood, true))
    
    // 移除条件
    sunntDayInMonth.removeConditions()
    println(VariableElimination.probability(goodMood, true))
    
  • 约束
    goodMood.setConstraint((b: Boolean) => if (b) 0.5 else 1.0)
    println(VariableElimination.probability(goodMood, true))
    
    val result1 = Flip(0.4)
    val result2 = Flip(0.4)
    val result3 = Flip(0.4)
    
    val allWins = Apply(result1, result2, result3,
      (w1: Boolean, w2: Boolean, w3: Boolean) => w1 && w2 && w3
    )
    println(VariableElimination.probability(allWins, true))
    
    def makeStreaky(r1: Element[Boolean], r2: Element[Boolean]): Unit = {
      val pair = Apply(r1, r2, (b1: Boolean, b2: Boolean) => (b1, b2))
      pair.setConstraint((bb: (Boolean, Boolean)) => if (bb._1 == bb._2) 1.0 else 0.5)
    }
    
    makeStreaky(result1, result2)
    makeStreaky(result2, result3)
    println(VariableElimination.probability(allWins, true))
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值