Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package cc.factorie.example
- import cc.factorie.directed.{DirectedFactorWithStatistics1, DirectedFactorWithStatistics3, DirectedModel}
- import cc.factorie.infer.Maximize
- import cc.factorie.model.{Factor1, ItemizedModel, TupleFactorWithStatistics3}
- import cc.factorie.variable.{BooleanValue, BooleanVariable, MaximizeDiscrete, RefVariable}
- import scala.util.Random
- /**
- * Created by ali on 1/13/15.
- */
- object SimpleVDirected {
- def main(args: Array[String]) {
- implicit val model = DirectedModel()
- implicit val random = new Random(0)
- val rain = new BooleanVariable()
- val sprinkler = new BooleanVariable()
- val wet = new BooleanVariable()
- val f1 = new DirectedFactorWithStatistics1(rain) {
- val probability = 0.7
- override def pr(v1: BooleanVariable#Value): Double = {
- if (v1.booleanValue)
- probability
- else
- 1 - probability
- }
- override def sampledValue(implicit random: Random): BooleanVariable#Value = {
- BooleanValue(random.nextDouble() < probability)
- }
- }
- val f2 = new DirectedFactorWithStatistics1(sprinkler) {
- val probability = 0.3
- override def pr(v1: BooleanVariable#Value): Double = {
- if (v1.booleanValue)
- probability
- else
- 1 - probability
- }
- override def sampledValue(implicit random: Random): BooleanVariable#Value = {
- BooleanValue(random.nextDouble() < probability)
- }
- }
- val f3 = new DirectedFactorWithStatistics3(wet, rain, sprinkler) {
- val cpt = Array(
- // (sprinkler=f,sprinkler=t)
- Array(0.1, 0.7), // no rain
- Array(0.8, 0.9) // rain
- )
- override def pr(v1: BooleanVariable#Value, rainVal: BooleanVariable#Value, sprinklerVal: BooleanVariable#Value): Double = {
- val probability = cpt(rainVal.intValue)(sprinklerVal.intValue)
- if (v1.booleanValue) probability else 1 - probability
- }
- override def sampledValue(p1: BooleanVariable#Value, p2: BooleanVariable#Value)(implicit random: Random): BooleanVariable#Value = {
- val probability = cpt(p1.intValue)(p2.intValue)
- BooleanValue(random.nextDouble() < probability)
- }
- }
- // add factors to model
- model ++= Seq(f1, f2, f3)
- // observed variables
- wet := true
- val t = new RefVariable[BooleanVariable]()
- t := rain
- Maximize(t.value)
- // When add more observation, the result without maximize in equal to maximize result
- println("Max " + t.value + " " + t.value.proportions(model))
- }
- }
- object SimpleVFactor {
- def main(args: Array[String]) {
- implicit val model = new ItemizedModel()
- implicit val random = new Random(0)
- val rain = new BooleanVariable()
- val sprinkler = new BooleanVariable()
- val wet = new BooleanVariable()
- val f1 = new Factor1(rain) {
- val probability = 0.7
- override def score(v1: BooleanVariable#Value): Double = {
- if (v1.booleanValue)
- probability
- else
- 1 - probability
- }
- override type StatisticsType = this.type
- }
- val f2 = new Factor1(rain) {
- val probability = 0.3
- override def score(v1: BooleanVariable#Value): Double = {
- if (v1.booleanValue)
- probability
- else
- 1 - probability
- }
- override type StatisticsType = this.type
- }
- val f3 = new TupleFactorWithStatistics3(wet, rain, sprinkler) {
- val cpt = Array(
- // (sprinkler=f,sprinkler=t)
- Array(0.1, 0.7), // no rain
- Array(0.8, 0.9) // rain
- )
- override def score(v1: BooleanVariable#Value, v2: BooleanVariable#Value, v3: BooleanVariable#Value): Double = {
- val probability = cpt(v2.intValue)(v3.intValue)
- if (v1.booleanValue)
- math.log(probability)
- else
- math.log(1 - probability)
- }
- }
- model ++= Seq(f1, f2, f3)
- wet := true
- val t = new RefVariable[BooleanVariable]()
- t := rain
- MaximizeDiscrete(rain, model)
- println("Max " + t.value + " " + t.value.proportions(model))
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement