/** * {@inheritDoc} */ @Override public double getValue(Variable key){ Double val = assignment.get(key); if (val!=null){ return val.doubleValue(); } else { return Utils.missingValue(); } }
/** * Return the list of non-observed variables for Time 0. * @return a {@code List} of {@link Variable}. */ private List<Variable> getTargetVarsTime0(){ return this.model.getDynamicVariables().getListOfDynamicVariables().stream() .filter(var -> Utils.isMissingValue(this.assignment.getValue(var))) .collect(Collectors.toList()); }
public MAPDynamicInstancesSampler(BayesianNetwork bn, Attributes attributes, Map<Variable,Boolean> hiddenVars, Map<Variable,Double> marVars, int seed) { this.bn = bn; this.seed = seed; this.attributes = attributes; this.hiddenVars = hiddenVars; this.marVars = marVars; this.causalOrder = Utils.getTopologicalOrder(this.bn.getDAG()); }
@Override public Multinomial predict(DataInstance instance) { if (!Utils.isMissingValue(instance.getValue(classVar))) System.out.println("Class Variable can not be set."); inferenceAlgoPredict.setModel(this.getModel()); this.inferenceAlgoPredict.setEvidence(instance); System.out.println(instance); this.inferenceAlgoPredict.runInference(); List<Multinomial> posteriors = new ArrayList<>(); for (Variable classVariable : classVariables) { posteriors.add(this.inferenceAlgoPredict.getPosterior(classVariable)); } double[] vectorPosteriors = new double[classVar.getNumberOfStates()]; for (Multinomial posterior : posteriors) { for (int i = 0; i < classVar.getNumberOfStates(); i++) { vectorPosteriors[i] += posterior.getParameters()[i]; } } posteriors.get(0).setProbabilities(Utils.normalize(vectorPosteriors)); return posteriors.get(0); }
Node huginVar = (Node)huginNodes.get(i); int type = Utils.getConditionalDistributionType(amidstVar, amidstBN);
switch (Utils.getConditionalDistributionType(amidstVar, amidstBN)) { case 0: this.setMultinomial_MultinomialParents(amidstBN.getConditionalDistribution(amidstVar));
/** * Filters a given {@link HashMapAssignment} object, i.e., sets the values assigned to either missing or noisy variables to Double.NaN. * @param assignment a given {@link HashMapAssignment} object. * @return a filtered {@link HashMapAssignment} object. */ private HashMapAssignment filter(HashMapAssignment assignment){ hiddenVars.keySet().stream().forEach(var -> assignment.setValue(var,Utils.missingValue())); marNoise.entrySet().forEach(e -> { if (random.nextDouble()<e.getValue()) assignment.setValue(e.getKey(),Utils.missingValue()); }); if (!latentVars.isEmpty()){ HashMapAssignment newassignment = new HashMapAssignment(); for (Variable variable : assignment.getVariables()) { if (!this.latentVars.containsKey(variable)) newassignment.setValue(variable,assignment.getValue(variable)); } } return assignment; }
/** * Return the list of non-observed and temporally connected variables for time T. * @return a {@code List} of {@link Variable}. */ private List<Variable> getTargetVarsTimeT(){ return this.model.getDynamicVariables().getListOfDynamicVariables().stream() .filter(var -> !var.isInterfaceVariable()) .filter(var -> Utils.isMissingValue(this.assignment.getValue(var))) .filter(var -> { boolean notContainInterfaceVar = true; for (Variable variable : this.model.getDynamicDAG().getParentSetTimeT(var)) { notContainInterfaceVar = notContainInterfaceVar && !variable.isInterfaceVariable(); } return !notContainInterfaceVar; }) .collect(Collectors.toList()); }
List<Variable> topologicalOrder = Utils.getTopologicalOrder(bn.getDAG());
/** * Returns the log probability of a valid assignment at Time T. * @param assignment an object of type {@link Assignment}. * @return a {@code double} that represents the log probability of the assignment. */ public double getLogProbabiltyOfFullAssignmentTimeT(Assignment assignment){ double logProb = 0; for (Variable var: this.getDynamicVariables()){ if (assignment.getValue(var)== Utils.missingValue()) { throw new UnsupportedOperationException("This method can not compute the probabilty of a partial assignment."); } logProb += this.distributionsTimeT.get(var.getVarID()).getLogConditionalProbability(assignment); } return logProb; }
/** * Predicts the class membership probabilities for a given instance. * @param instance the data instance to be classified. * @return an array of doubles containing the estimated membership probabilities of the data instance for each class label. */ public double[] predict(DataInstance instance) { if (learnedBN==null) throw new IllegalArgumentException("The model has not been learned"); if (!Utils.isMissingValue(instance.getValue(targetVar))) System.out.println("Class Variable can not be set."); this.inference.setEvidence(instance); this.inference.runInference(); Multinomial dist = this.inference.getPosterior(targetVar); return dist.getParameters(); }
List<Variable> topologicalOrder = Utils.getTopologicalOrder(bn.getDAG());
/** * Returns the log probability of a valid assignment at Time 0. * @param assignment an object of type {@link Assignment}. * @return a {@code double} that represents the log probability of the assignment. */ public double getLogProbabiltyOfFullAssignmentTime0(Assignment assignment){ double logProb = 0; for (Variable var: this.getDynamicVariables()){ if (assignment.getValue(var) == Utils.missingValue()) { throw new UnsupportedOperationException("This method can not compute the probabilty of a partial assignment."); } logProb += this.distributionsTime0.get(var.getVarID()).getLogConditionalProbability(assignment); } return logProb; }
/** * Predicts the class membership probabilities for a given instance. * @param instance the data instance to be classified. The value associated to the class variable must be * a missing value (i.e. a NaN) * @return the posterior probability of the class variable */ public Multinomial predict(DataInstance instance) { if (!Utils.isMissingValue(instance.getValue(classVar))) System.out.println("Class Variable can not be set."); inferenceAlgoPredict.setModel(this.getModel()); this.inferenceAlgoPredict.setEvidence(instance); //System.out.println(instance); this.inferenceAlgoPredict.runInference(); return this.inferenceAlgoPredict.getPosterior(classVar); }
@Override public void mapPartition(Iterable<DynamicDataInstance> values, Collector<DynamicDataInstance> out) throws Exception { values.forEach(d -> { HashMapAssignment pastAssignment = new HashMapAssignment(); for (Attribute att : d.getAttributes().getListOfNonSpecialAttributes()){ pastAssignment.setValue(bn.getVariables().getVariableByName(att.getName()+ DynamicVariables.INTERFACE_SUFFIX),d.getValue(att)); } Assignment assignment = sample(bn, causalOrder, random, pastAssignment); hiddenVars.keySet().stream().forEach(var -> assignment.setValue(bn.getVariables().getVariableByName(var.getName()),Utils.missingValue())); marVars.entrySet().forEach(e -> { if (random.nextDouble()<e.getValue()) assignment.setValue(bn.getVariables().getVariableByName(e.getKey().getName()),Utils.missingValue()); }); DataInstance dataInstanceNew = new DataStreamFromStreamOfAssignments.DataInstanceFromAssignment(assignment,attributes, bn.getVariables().getListOfVariables()); DynamicDataInstanceWrapper wrapper = new DynamicDataInstanceWrapper(dataInstanceNew,attributes,d.getSequenceID(), d.getTimeID()+1); out.collect(wrapper); }); }
/** * Predicts the class membership probabilities for a given instance. * @param instance the data instance to be classified. The value associated to the class variable must be * a missing value (i.e. a NaN) * @return the posterior probability of the class variable */ public Multinomial predict(DynamicDataInstance instance) { if (!Utils.isMissingValue(instance.getValue(classVar))) System.out.println("Class Variable can not be set."); InferenceEngineForDBN.setModel(this.getModel()); if (instance.getTimeID()==0) { InferenceEngineForDBN.reset(); } InferenceEngineForDBN.addDynamicEvidence(instance); System.out.println(instance); InferenceEngineForDBN.runInference(); return InferenceEngineForDBN.getFilteredPosterior(classVar); } }
/** * {@inheritDoc} */ @Override default double getValue(Variable var) { if (!var.isObservable()) return Utils.missingValue(); if (var.isInterfaceVariable()) { return this.getValue(var.getAttribute(),false); } else { return this.getValue(var.getAttribute(),true); } }
try { double val = assignment.getValue(var); if (!Utils.isMissingValue(val)) this.setVarEvidence(var,val); } catch (ExceptionHugin exceptionHugin) { Variable var = this.getOriginalModel().getVariables().getVariableByName(att.getName()); double val = assignment.getValue(var); if (!Utils.isMissingValue(val)) this.setVarEvidence(var, val); } catch (ExceptionHugin exceptionHugin) {
double predValue; d.setValue(nb.getClassVar(), Utils.missingValue()); Multinomial posteriorProb = nb.predict(d);
/** * Samples an {@link Assignment} randomly from a {@link BayesianNetwork} conditioned to a given Assignment. * The assignment must only contains assignments from head nodes. * @param random, a random number generator * @param conditionAssignment, an {@link Assignment} object. * @return A sampled Assignment */ public static Assignment sample(BayesianNetwork network, List<Variable> causalOrder, Random random, Assignment conditionAssignment) { HashMapAssignment assignment = new HashMapAssignment(network.getNumberOfVars()); for (Variable var : causalOrder) { if (Utils.isMissingValue(conditionAssignment.getValue(var))) { double sampledValue = network.getConditionalDistribution(var).getUnivariateDistribution(assignment).sample(random); assignment.setValue(var, sampledValue); }else{ assignment.setValue(var,conditionAssignment.getValue(var)); } } return assignment; }