/// <summary> /// Centroid method to obtain the numerical representation of a fuzzy output. The numerical /// value will be the center of the shape formed by the several fuzzy labels with their /// constraints. /// </summary> /// /// <param name="fuzzyOutput">A <see cref="FuzzyOutput"/> containing the output of several /// rules of a Fuzzy Inference System.</param> /// <param name="normOperator">A <see cref="INorm"/> operator to be used when constraining /// the label to the firing strength.</param> /// /// <returns>The numerical representation of the fuzzy output.</returns> /// /// <exception cref="Exception">The numerical output is unavaliable. All memberships are zero.</exception> /// public float Defuzzify( FuzzyOutput fuzzyOutput, INorm normOperator ) { // results and accumulators float weightSum = 0, membershipSum = 0; // speech universe float start = fuzzyOutput.OutputVariable.Start; float end = fuzzyOutput.OutputVariable.End; // increment float increment = ( end - start ) / this.intervals; // running through the speech universe and evaluating the labels at each point for ( float x = start; x < end; x += increment ) { // we must evaluate x membership to each one of the output labels foreach ( FuzzyOutput.OutputConstraint oc in fuzzyOutput.OutputList ) { // getting the membership for X and constraining it with the firing strength float membership = fuzzyOutput.OutputVariable.GetLabelMembership( oc.Label, x ); float constrainedMembership = normOperator.Evaluate( membership, oc.FiringStrength ); weightSum += x * constrainedMembership; membershipSum += constrainedMembership; } } // if no membership was found, then the membershipSum is zero and the numerical output is unknown. if ( membershipSum == 0 ) throw new Exception( "The numerical output in unavaliable. All memberships are zero." ); return weightSum / membershipSum; }
/// <summary> /// Executes the fuzzy inference, obtaining the <see cref="FuzzyOutput"/> of the system for the required /// <see cref="LinguisticVariable"/>. /// </summary> /// /// <param name="variableName">Name of the <see cref="LinguisticVariable"/> to evaluate.</param> /// /// <returns>A <see cref="FuzzyOutput"/> containing the fuzzy output of the system for the /// <see cref="LinguisticVariable"/> specified in <paramref name="variableName"/>.</returns> /// /// <exception cref="KeyNotFoundException">The variable indicated was not found in the database.</exception> /// public FuzzyOutput ExecuteInference(string variableName) { // gets the variable LinguisticVariable lingVar = database.GetVariable(variableName); // object to store the fuzzy output FuzzyOutput fuzzyOutput = new FuzzyOutput(lingVar); // select only rules with the variable as output Rule[] rules = rulebase.GetRules( ); foreach (Rule r in rules) { if (r.Output.Variable.Name == variableName) { string labelName = r.Output.Label.Name; float firingStrength = r.EvaluateFiringStrength( ); if (firingStrength > 0) { fuzzyOutput.AddOutput(labelName, firingStrength); } } } // returns the fuzzy output obtained return(fuzzyOutput); }
/// <summary> /// Centroid method to obtain the numerical representation of a fuzzy output. The numerical /// value will be the center of the shape formed by the several fuzzy labels with their /// constraints. /// </summary> /// /// <param name="fuzzyOutput">A <see cref="FuzzyOutput"/> containing the output of several /// rules of a Fuzzy Inference System.</param> /// <param name="normOperator">A <see cref="INorm"/> operator to be used when constraining /// the label to the firing strength.</param> /// /// <returns>The numerical representation of the fuzzy output.</returns> /// /// <exception cref="Exception">The numerical output is unavaliable. All memberships are zero.</exception> /// public float Defuzzify(FuzzyOutput fuzzyOutput, INorm normOperator) { // results and accumulators float weightSum = 0f, membershipSum = 0f; // speech universe var start = fuzzyOutput.OutputVariable.Start; var end = fuzzyOutput.OutputVariable.End; // increment var increment = (end - start) / intervals; // running through the speech universe and evaluating the labels at each point for (var x = start; x < end; x += increment) { // we must evaluate x membership to each one of the output labels foreach (var oc in fuzzyOutput.OutputList) { // getting the membership for X and constraining it with the firing strength var membership = fuzzyOutput.OutputVariable.GetLabelMembership(oc.Label, x); var constrainedMembership = normOperator.Evaluate(membership, oc.FiringStrength); weightSum += x * constrainedMembership; membershipSum += constrainedMembership; } } // if no membership was found, then the membershipSum is zero and the numerical output is unknown. if (membershipSum == 0) { throw new Exception("The numerical output in unavaliable. All memberships are zero."); } return(weightSum / membershipSum); }
public double Defuzzify(FuzzyOutput fuzzyOutput, INorm normOperator) { double blackMembership = 0; double grayMembership = 0; double whiteMembership = 0; foreach (FuzzyOutput.OutputConstraint constraint in fuzzyOutput.OutputList) { if (constraint.Label == "Gray") { grayMembership = constraint.FiringStrength; } if (constraint.Label == "Black") { blackMembership = constraint.FiringStrength; } if (constraint.Label == "White") { whiteMembership = constraint.FiringStrength; } } return (128*grayMembership + 255*whiteMembership)/ (blackMembership + grayMembership + whiteMembership); }
/// <summary> /// Executes the fuzzy inference, obtaining a numerical output for a choosen output /// linguistic variable. /// </summary> /// /// <param name="variableName">Name of the <see cref="LinguisticVariable"/> to evaluate.</param> /// /// <returns>The numerical output of the Fuzzy Inference System for the choosen variable.</returns> /// /// <exception cref="KeyNotFoundException">The variable indicated was not found in the database.</exception> /// public float Evaluate(string variableName) { // call the defuzzification on fuzzy output FuzzyOutput fuzzyOutput = ExecuteInference(variableName); float res = defuzzifier.Defuzzify(fuzzyOutput, normOperator); return(res); }
/// <summary> /// Executes the fuzzy inference, obtaining the <see cref="FuzzyOutput"/> of the system for the required /// <see cref="LinguisticVariable"/>. /// </summary> /// /// <param name="variableName">Name of the <see cref="LinguisticVariable"/> to evaluate.</param> /// /// <returns>A <see cref="FuzzyOutput"/> containing the fuzzy output of the system for the /// <see cref="LinguisticVariable"/> specified in <paramref name="variableName"/>.</returns> /// /// <exception cref="KeyNotFoundException">The variable indicated was not found in the database.</exception> /// public FuzzyOutput ExecuteInference( string variableName ) { // gets the variable LinguisticVariable lingVar = database.GetVariable( variableName ); // object to store the fuzzy output FuzzyOutput fuzzyOutput = new FuzzyOutput( lingVar ); // select only rules with the variable as output Rule[] rules = rulebase.GetRules( ); foreach ( Rule r in rules ) { if ( r.Output.Variable.Name == variableName ) { string labelName = r.Output.Label.Name; float firingStrength = r.EvaluateFiringStrength( ); if ( firingStrength > 0 ) fuzzyOutput.AddOutput( labelName, firingStrength ); } } // returns the fuzzy output obtained return fuzzyOutput; }
public double Defuzzify(FuzzyOutput fuzzyOutput, INorm normOperator) { // results and accumulators double weightSum = 0, membershipSum = 0; // speech universe double start = fuzzyOutput.OutputVariable.Start; double end = fuzzyOutput.OutputVariable.End; // increment double increment = (end - start)/intervals; // running through the speech universe and evaluating the labels at each point for (double x = start; x < end; x += increment) { // we must evaluate x membership to each one of the output labels foreach (FuzzyOutput.OutputConstraint oc in fuzzyOutput.OutputList) { // getting the membership for X and constraining it with the firing strength double membership = fuzzyOutput.OutputVariable.GetLabelMembership(oc.Label, x); double constrainedMembership = normOperator.Evaluate(membership, oc.FiringStrength); weightSum += x*constrainedMembership; membershipSum += constrainedMembership; } } // if no membership was found, then the membershipSum is zero and the numerical output is unknown. if (membershipSum == 0) return 0; return weightSum/membershipSum; }