//Methods private double Compute(double[] predictors, int clusterIdx) { WeightedAvg wAvg = new WeightedAvg(); for (int readoutUnitIdx = 0; readoutUnitIdx < _clusterCollection[clusterIdx].Length; readoutUnitIdx++) { double[] outputValue = _clusterCollection[clusterIdx][readoutUnitIdx].Network.Compute(predictors); double weight = _clusterCollection[clusterIdx][readoutUnitIdx].TrainingErrorStat.NumOfSamples; if (_clusterCollection[clusterIdx][readoutUnitIdx].TestingErrorStat != null) { weight += _clusterCollection[clusterIdx][readoutUnitIdx].TestingErrorStat.NumOfSamples; } wAvg.AddSampleValue(outputValue[0], weight); // Or flat weight //wAvg.AddSampleValue(outputValue[0], 1); } return(wAvg.Avg); }
//Methods /// <summary> /// Computes weighted averaged output of the cluster member networks /// </summary> /// <param name="predictors">Input predictors</param> /// <param name="memberOutputCollection">Collection of outputs of cluster member networks</param> public double Compute(double[] predictors, out double[] memberOutputCollection) { //Init member output collection memberOutputCollection = new double[Members.Count]; if (!BinaryOutput) { //Result is exact value WeightedAvg weightedResult = new WeightedAvg(); //Loop cluster members int clusterMemberIdx = 0; foreach (TrainedNetwork clusterMember in Members) { //Compute member double computedValue = clusterMember.Network.Compute(predictors)[0]; //Store sub-results memberOutputCollection[clusterMemberIdx] = computedValue; //Add sub-result to weighted average weightedResult.AddSampleValue(computedValue, Weights[clusterMemberIdx]); ++clusterMemberIdx; } //Return weighted average result return(weightedResult.Avg); } else { //Result is a probability -> use probability mixer double[] probabilities = new double[Members.Count]; double[] weights = new double[Members.Count]; for (int i = 0; i < Members.Count; i++) { memberOutputCollection[i] = Members[i].Network.Compute(predictors)[0]; probabilities[i] = PMixer.ProbabilityRange.Rescale(memberOutputCollection[i], DataRange); weights[i] = Weights[i]; } //Scale weights to ensure their sum is equal to 1 weights.Scale(1d / weights.Sum()); //Return resulting mixed probability rescalled back to members' result range return(DataRange.Rescale(PMixer.MixP(probabilities, weights), PMixer.ProbabilityRange)); } }