示例#1
0
		/// <summary>
		/// Constructs a multi-component sparse Bayes Point Machine using shared variables for chunking data
		/// </summary>
		/// <param name="nClass">Number of components (classes)</param>
		/// <param name="featureCount">Number of features</param>
		/// <param name="noisePrec">Noise precision</param>
		/// <param name="trainChunkSize">Chunk size for training</param>
		/// <param name="testChunkSize">Chunk size for testing</param>
		public BPMSparse_Shared(int nClass, int featureCount, double noisePrec, int trainChunkSize, int testChunkSize)
		{
			nComponents = nClass;
			nFeatures = featureCount;
			NoisePrec = noisePrec;
			this.trainChunkSize = trainChunkSize;
			this.testChunkSize = testChunkSize;
			feature = new Range(nFeatures).Named("feature");
			w = new SharedVariableArray<double>[nComponents];
			IDistribution<double[]> wPrior0 = Distribution<double>.Array(nFeatures,
				delegate(int index) { return Gaussian.PointMass(0); });
			IDistribution<double[]> wPrior = Distribution<double>.Array(nFeatures,
				delegate(int index) { return Gaussian.FromMeanAndPrecision(0.0, 1.0); });
			for (int c = 0; c < nComponents; c++)
			{
				w[c] = (c == 0)
					? SharedVariable<double>.Random(feature, (DistributionStructArray<Gaussian,double>)wPrior0).Named("w_" + c)
					: SharedVariable<double>.Random(feature, (DistributionStructArray<Gaussian,double>)wPrior).Named("w_" + c);
			}

			trainModel = SpecifyTrainModel("_train", trainChunkSize);
			testModel = SpecifyTestModel("_test", testChunkSize);
		}
示例#2
0
		/// <summary>
		/// Specify the training model
		/// </summary>
		/// <param name="s">The name of the test model</param>
		/// <param name="nChunks">The number of chunks</param>
		/// <returns>A <see cref="BPMVarsModelForTest"/> instance</returns>
		private BPMModelVarsForTest SpecifyTestModel(string s, int nChunks)
		{
			Variable<int> nItem = Variable.New<int>().Named("nItem_" + s);
			Range item = new Range(nItem).Named("item_" + s);
			VariableArray<int> xValueCount = Variable.Array<int>(item).Named("xCount_" + s);
			Range itemFeature = new Range(xValueCount[item]).Named("itemFeature" + s);
			VariableArray<VariableArray<double>, double[][]> xValues = Variable.Array(Variable.Array<double>(itemFeature), item).Named("xValues" + s);
			VariableArray<VariableArray<int>, int[][]> xIndices = Variable.Array(Variable.Array<int>(itemFeature), item).Named("xIndices" + s);

			Model model = new Model(nChunks).Named("model" + s);
			VariableArray<double>[] wModel = new VariableArray<double>[nComponents];
			for (int c = 0; c < nComponents; c++)
			{
				wModel[c] = w[c].GetCopyFor(model).Named("model_" + c + s);
			}

			VariableArray<int> ytest = Variable.Array<int>(item).Named("ytest" + s);
			using (Variable.ForEach(item))
			{
				// The score for this item across all components
				Variable<double>[] score = BPMUtils.ComputeClassScores(wModel, xValues[item], xIndices[item], itemFeature, NoisePrec);
				ytest[item] = Variable.DiscreteUniform(nComponents);
				BPMUtils.ConstrainMaximum(ytest[item], score, nComponents);
			}
			BPMModelVarsForTest bpmVar = new BPMModelVarsForTest();
			bpmVar.ie = new InferenceEngine();
			bpmVar.dataVars = new BPMDataVars(nItem, item, xIndices, xValueCount, xValues);
			bpmVar.y = ytest;
			bpmVar.model = model;
			return bpmVar;
		}