Beispiel #1
0
 //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));
     }
 }