classpath.addPath("../figaro_2.11-4.1.0.0.jar")
import com.cra.figaro.language.{Flip, Select}
import com.cra.figaro.library.compound.If
import com.cra.figaro.algorithm.factored.VariableElimination // 变量消除算法
import com.cra.figaro.language.{Flip, Select} import com.cra.figaro.library.compound.If import com.cra.figaro.algorithm.factored.VariableElimination
// 定义模型
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"))
val sunnyTomorrow = If(sunnyToday, Flip(0.8), Flip(0.05))
val greetingTomorrow = If(sunnyTomorrow,
Select(0.6 -> "Hello, world!", 0.4 -> "Howdy, universe!"),
Select(0.2 -> "Hello, world!", 0.8 -> "Oh no, not again"))
sunnyToday: com.cra.figaro.language.AtomicFlip = Flip(0.2) greetingToday: If[String] = If(Flip(0.2), Select(0.6 -> Hello, world!, 0.4 -> Howdy, universe!), Select(0.2 -> Hello, world!, 0.8 -> Oh no, not again)) sunnyTomorrow: If[Boolean] = If(Flip(0.2), Flip(0.8), Flip(0.05)) greetingTomorrow: If[String] = If(If(Flip(0.2), Flip(0.8), Flip(0.05)), Select(0.6 -> Hello, world!, 0.4 -> Howdy, universe!), Select(0.2 -> Hello, world!, 0.8 -> Oh no, not again))
// 用推测算法预测今天的问候语
def predict() {
val result = VariableElimination.probability(greetingToday, "Hello, world!")
println("Today's greeting is \"Hello, world!\" " +
"with probability " + result + ".")
}
defined function predict
// 根据今天的问候语是hello world,使用推理算法推理今天的天气
def infer() {
greetingToday.observe("Hello, world!")
val result = VariableElimination.probability(sunnyToday, true)
println("If today's greeting is \"Hello, world!\", today's " +
"weather is sunny with probability " + result + ".")
}
defined function infer
// 从今天的问候语是hello world这一观测中学习,用推理算法预测明天的问候语
def learnAndPredict() {
greetingToday.observe("Hello, world!")
val result = VariableElimination.probability(greetingTomorrow, "Hello, world!")
println("If today's greeting is \"Hello, world!\", " +
"tomorrow's greeting will be \"Hello, world!\" " +
"with probability " + result + ".")
}
defined function learnAndPredict
// 执行所有任务
predict()
infer()
learnAndPredict()
Today's greeting is "Hello, world!" with probability 0.27999999999999997. If today's greeting is "Hello, world!", today's weather is sunny with probability 0.4285714285714285. If today's greeting is "Hello, world!", tomorrow's greeting will be "Hello, world!" with probability 0.3485714285714286.
Figaro模型用来表达一般知识。您以证据的形式提供关于某种情况的具体知识。查询告诉系统您所感兴趣的发现。Figaro推理算法取得证据并用模型提供查询的答案。
Figaro的查询通过指明目标元素和您想知道的有关情况指明。您使用某种算法,按照证据找出有关目标元素的信息。通常,您必须实例化某种算法,运行并在之后清理。我已经提供了使用默认设置执行所有步骤的简单方法。在运行算法之后,您可以获得查询的答案。这些算法最常采取目标元素的各种取值概率。有时候,它们没有告诉您概率,而是得出每个目标元素的最可能取值。对于每个目标元素,答案告诉您最高概率的取值。