/// <summary> /// Applies the specified inputs. /// </summary> /// <param name="inputs">The inputs.</param> /// <param name="featureSet">The feature set.</param> /// <param name="priors">The priors.</param> /// <param name="results">The results.</param> /// <param name="mode">The mode.</param> /// <param name="showFactorGraph">if set to <c>true</c> [show factor graph].</param> public void Apply(Inputs inputs, FeatureSet featureSet, CommunityPriors priors, ref Results results, InputMode mode, bool showFactorGraph = false) { this.Engine.ShowFactorGraph = showFactorGraph; if (mode.HasFlag(InputMode.Validation)) { this.SetObservedValues(new[] { inputs.Validation.Instances }, featureSet, InputMode.Validation, priors); results.Validation = new Results.ResultsSet { IsRepliedTo = this.Engine.Infer <Bernoulli[][]>(this.RepliedTo)[0] }; } if (mode.HasFlag(InputMode.Testing)) { this.SetObservedValues(new[] { inputs.Test.Instances }, featureSet, InputMode.Testing, priors); results.Test = new Results.ResultsSet { IsRepliedTo = this.Engine.Infer <Bernoulli[][]>(this.RepliedTo)[0] }; } this.Engine.ShowFactorGraph = this.ShowFactorGraph; }
/// <summary> /// Sets the observed values. /// </summary> /// <param name="instances">The instances.</param> /// <param name="featureSet">The feature set.</param> /// <param name="mode">The mode.</param> /// <param name="communityPriors">The community priors.</param> public abstract void SetObservedValues(IList <IList <Inputs.Instance> > instances, FeatureSet featureSet, InputMode mode, CommunityPriors communityPriors);
/// <summary> /// Sets the observed values. /// </summary> /// <param name="instances">The instances.</param> /// <param name="featureSet">The feature set.</param> /// <param name="mode">The mode.</param> /// <param name="communityPriors">The community priors.</param> /// <exception cref="System.InvalidOperationException">Data is null</exception> public override void SetObservedValues(IList <IList <Inputs.Instance> > instances, FeatureSet featureSet, InputMode mode, CommunityPriors communityPriors) { // This is for personalisation training and testing if (instances == null) { throw new InvalidOperationException("Data is null"); } this.NumberOfPeople.ObservedValue = instances.Count; this.NumberOfMessages.ObservedValue = instances.Select(ia => ia.Count).ToArray(); this.NumberOfFeatures.ObservedValue = mode == InputMode.CommunityTraining ? featureSet.SharedFeatureVectorLength : featureSet.FeatureVectorLength; this.NoiseVariance.ObservedValue = communityPriors.NoiseVariance; if (mode == InputMode.CommunityTraining || mode == InputMode.Training) { this.RepliedTo.ObservedValue = instances.Select(inner => inner.Select(ia => ia.Label).ToArray()).ToArray(); } this.WeightMeanPriors.ObservedValue = DistributionArrayHelpers.Copy(communityPriors.WeightMeans.Values); this.WeightPrecisionPriors.ObservedValue = DistributionArrayHelpers.Copy(communityPriors.WeightPrecisions.Values); // If this is community training, we only want shared features Func <KeyValuePair <FeatureBucket, double>, bool> predicate = fbv => mode != InputMode.CommunityTraining || fbv.Key.Feature.IsShared; this.FeatureIndices.ObservedValue = instances.Select( inner => inner.Select( ia => ia.FeatureValues.Where(predicate).Select(fbv => featureSet.FeatureBuckets.IndexOf(fbv.Key)).ToArray()) .ToArray()).ToArray(); this.FeatureValue.ObservedValue = instances.Select( inner => inner.Select(ia => ia.FeatureValues.Where(predicate).Select(fbv => fbv.Value).ToArray()).ToArray()).ToArray(); this.FeatureCounts.ObservedValue = this.FeatureValue.ObservedValue.Select(inner => inner.Select(ia => ia.Length).ToArray()).ToArray(); }