Asked by:
Learning Mixture of Gamma Distribution
Question

Hi, Infer.net people,
I cant get rid of a exception(due to Factor.Difference) for implementing two mixtures of Gamma. The code is below, and I want to estimate the rate parameter, and the data is generated by two gamma distribution , which is mirror to each other. I have tried all 3 inference algorithms.
Thank you for the help.
double[] data = new double[100]; double shape = 2; double rate = 0.5; for (int i = 0; i < data.Length; i++) data[i] = Math.Pow(1,i)*Rand.Gamma(shape) / rate; var rateRandV = Variable.Random<double>(Gamma.Uniform());// Variable.GammaFromMeanAndVariance(rate * 2, 10); for (int i = 0; i < data.Length; i++) { var Z = Variable.Bernoulli(0.5); Variable<double> x; using(Variable.If(Z)) { x = Variable.GammaFromShapeAndRate(shape, rateRandV); } using (Variable.IfNot(Z)) { x = Variable.GammaFromShapeAndRate(shape, rateRandV); } x.ObservedValue = data[i]; } InferenceEngine engine = new InferenceEngine(new VariationalMessagePassing()); Console.WriteLine("rate=" + engine.Infer(rateRandV));
Friday, October 24, 2014 8:46 PM
All replies

 Edited by Yordan ZaykovMicrosoft employee Saturday, October 25, 2014 12:35 AM
Friday, October 24, 2014 10:24 PM 
Thanks for the reply. But the exception is not due to the SetTo Issue. And it is a compile fail.
Error 0: This model is not supported with VariationalMessagePassing due to Factor.Difference(double difference, double a, double b). Try using a different algorithm or expressing the model differently in
Factor.Difference(0.0, vdouble5_use)
Details: [0] System.ArgumentException: Gamma is not assignable from Gaussian for result of method DoubleMinusVmpOp.BAverageLogarithm// Sample data from standard Gaussian double[] data = new double[100]; double shape = 2; double rate = 0.5; for (int i = 0; i < data.Length; i++) data[i] = Math.Pow(1,i)*Rand.Gamma(shape) / rate; var rateRandV = Variable.Random<double>(Gamma.Uniform()); for (int i = 0; i < data.Length; i++) { var Z = Variable.Bernoulli(0.5); Variable<double> x = Variable.New<double>(); using(Variable.If(Z)) { x.SetTo(Variable.GammaFromShapeAndRate(shape, rateRandV)); } using (Variable.IfNot(Z)) { x.SetTo( Variable.GammaFromShapeAndRate(shape, rateRandV)); } x.ObservedValue = data[i]; } InferenceEngine engine = new InferenceEngine(new VariationalMessagePassing()); Console.WriteLine("rate=" + engine.Infer(rateRandV));
Saturday, October 25, 2014 1:12 AM 
Negating a Gamma variable is not supported.Saturday, October 25, 2014 11:53 AMOwner