/// <summary> /// Infers parameters for a given cold user. /// </summary> /// <param name="userFeatures">The user features.</param> /// <returns>A distribution over the user parameters.</returns> public UserParameterDistribution InferUserParameters(SparseFeatureVector userFeatures) { UserParameterDistribution result; if (this.userFeatureParameterPosteriors.FeatureCount == 0) { Debug.Assert( userFeatures.FeatureCount == 0, "The number of user features passed must be equal to the number of user features learned."); result = this.userParameterDistributionAverage; } else { GaussianArray traits; Gaussian bias; AlgorithmUtils.AddFeatureContribution( this.userParameterDistributionAverage, this.userFeatureParameterPosteriors, userFeatures, out traits, out bias); result = new UserParameterDistribution(traits, bias, this.userParameterDistributionAverage.Thresholds); } return(result); }
/// <summary> /// Adds the feature contribution for a given user/item to its traits and bias. /// </summary> /// <param name="parameters">The user/item parameters.</param> /// <param name="featureWeights">The feature weights.</param> /// <param name="featureValues">The feature values.</param> /// <param name="adjustedTraits">The resulting traits.</param> /// <param name="adjustedBias">The resulting bias.</param> public static void AddFeatureContribution( EntityParameterDistribution parameters, FeatureParameterDistribution featureWeights, SparseFeatureVector featureValues, out GaussianArray adjustedTraits, out Gaussian adjustedBias) { adjustedTraits = new GaussianArray( parameters.Traits.Count, i => DoublePlusOp.SumAverageConditional( parameters.Traits[i], ComputeFeatureContribution(featureWeights.TraitWeights[i], featureValues.NonZeroFeatureValues, featureValues.NonZeroFeatureIndices))); adjustedBias = DoublePlusOp.SumAverageConditional( parameters.Bias, ComputeFeatureContribution(featureWeights.BiasWeights, featureValues.NonZeroFeatureValues, featureValues.NonZeroFeatureIndices)); }