/// <summary> /// Infers parameters for a given cold item. /// </summary> /// <param name="itemFeatures">The item features.</param> /// <returns>A distribution over the item parameters.</returns> public ItemParameterDistribution InferItemParameters(SparseFeatureVector itemFeatures) { ItemParameterDistribution result; if (this.itemFeatureParameterPosteriors.FeatureCount == 0) { Debug.Assert( itemFeatures.FeatureCount == 0, "The number of item features passed must be equal to the number of item features learned."); result = this.itemParameterDistributionAverage; } else { GaussianArray traits; Gaussian bias; AlgorithmUtils.AddFeatureContribution( this.itemParameterDistributionAverage, this.itemFeatureParameterPosteriors, itemFeatures, out traits, out bias); result = new ItemParameterDistribution(traits, bias); } 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)); }