I made a program for banking loan approval on C# that using Accord Fuzzy library. Input parameters: Age (range 16 - 100); Income (range 0 - 100); Credit Score (range 0 - 100); Employment (0 - 10) Output: Approval (range 0 - 100).
So when I set inputs like this:
IS.SetInput("Age", 23);
IS.SetInput("Income", 70);
IS.SetInput("CreditScore", 59);
IS.SetInput("Employment", 8);
I can get the result in console: Current Approval of credit: 80.00012969970703
If I set inputs like this:
IS.SetInput("Age", 16);
IS.SetInput("Income", 70);
IS.SetInput("CreditScore", 59);
IS.SetInput("Employment", 8);
or
IS.SetInput("Age", 23);
IS.SetInput("Income", 70);
IS.SetInput("CreditScore", 100);
IS.SetInput("Employment", 8);
or
IS.SetInput("Age", 23);
IS.SetInput("Income", 70);
IS.SetInput("CreditScore", 59);
IS.SetInput("Employment", 10);
Then I receive notification Line 115: "double currentApproval = IS.Evaluate("Approval");" - System.Exception: 'The numerical output in unavailable. All memberships are zero.'
The code of my program:
using System;
using Accord.Fuzzy;
namespace Test
{
class Program
{
static void Main(string[] args)
{
//input parameters:
//age:
FuzzySet fsYoung = new FuzzySet("Young", new TrapezoidalFunction(16, 22, 28));
FuzzySet fsAdult = new FuzzySet("Adult", new TrapezoidalFunction(22, 61, 100));
LinguisticVariable lvAge = new LinguisticVariable("Age", 16, 100);
lvAge.AddLabel(fsYoung);
lvAge.AddLabel(fsAdult);
//income:
FuzzySet fsLow = new FuzzySet("Low", new TrapezoidalFunction(0, 8, 16));
FuzzySet fsMiddle = new FuzzySet("Middle", new TrapezoidalFunction(8, 40, 60, 92));
FuzzySet fsHigh = new FuzzySet("High", new TrapezoidalFunction(72, 90, 100));
LinguisticVariable lvIncome = new LinguisticVariable("Income", 0, 100);
lvIncome.AddLabel(fsLow);
lvIncome.AddLabel(fsMiddle);
lvIncome.AddLabel(fsHigh);
//credit_score:
FuzzySet fsMin = new FuzzySet("Min", new TrapezoidalFunction(0, 30, 60));
FuzzySet fsNormal = new FuzzySet("Normal", new TrapezoidalFunction(50, 60, 80, 90));
FuzzySet fsMax = new FuzzySet("Max", new TrapezoidalFunction(80, 90, 100));
LinguisticVariable lvCreditScore = new LinguisticVariable("CreditScore", 0, 100);
lvCreditScore.AddLabel(fsMin);
lvCreditScore.AddLabel(fsNormal);
lvCreditScore.AddLabel(fsMax);
//employment:
FuzzySet fsShort = new FuzzySet("Short", new TrapezoidalFunction(0, 2, 4));
FuzzySet fsMedium = new FuzzySet("Medium", new TrapezoidalFunction(3, 5, 7));
FuzzySet fsLong = new FuzzySet("Long", new TrapezoidalFunction(6, 9, 10));
LinguisticVariable lvEmployment = new LinguisticVariable("Employment", 0, 10);
lvEmployment.AddLabel(fsShort);
lvEmployment.AddLabel(fsMedium);
lvEmployment.AddLabel(fsLong);
//Output parameter:
//Approval:
FuzzySet fsReject = new FuzzySet("Reject", new TrapezoidalFunction(0, 30, 40, 70));
FuzzySet fsApproveH = new FuzzySet("ApproveH", new TrapezoidalFunction(60, 70, 80));
FuzzySet fsApproveSt = new FuzzySet("ApproveSt", new TrapezoidalFunction(70, 80, 90));
FuzzySet fsApproveLow = new FuzzySet("ApproveLow", new TrapezoidalFunction(85, 95, 100));
LinguisticVariable lvApproval = new LinguisticVariable("Approval", 0, 100);
lvApproval.AddLabel(fsReject);
lvApproval.AddLabel(fsApproveH);
lvApproval.AddLabel(fsApproveSt);
lvApproval.AddLabel(fsApproveLow);
// The database
Database fuzzyDB = new Database();
fuzzyDB.AddVariable(lvAge);
fuzzyDB.AddVariable(lvIncome);
fuzzyDB.AddVariable(lvCreditScore);
fuzzyDB.AddVariable(lvEmployment);
fuzzyDB.AddVariable(lvApproval);
// Creating the inference system
InferenceSystem IS = new InferenceSystem(fuzzyDB, new CentroidDefuzzifier(1000));
// Add rules
IS.NewRule("Rule 1", "IF Age IS Young AND Income IS Middle AND CreditScore IS Max AND Employment IS Medium THEN Approval IS ApproveLow");
IS.NewRule("Rule 2", "IF Age IS Young AND Income IS Middle AND CreditScore IS Max AND Employment IS Short THEN Approval IS ApproveH");
IS.NewRule("Rule 3", "IF Age IS Young AND Income IS High AND CreditScore IS Max AND Employment IS Short THEN Approval IS ApproveSt");
IS.NewRule("Rule 4", "IF Age IS Young AND Income IS High AND CreditScore IS Normal AND Employment IS Short THEN Approval IS ApproveH");
IS.NewRule("Rule 5", "IF Age IS Young AND Income IS High AND CreditScore IS Min AND Employment IS Short THEN Approval IS Reject");
IS.NewRule("Rule 6", "IF Age IS Young AND Income IS Middle AND CreditScore IS Min AND Employment IS Short THEN Approval IS Reject");
IS.NewRule("Rule 7", "IF Age IS Young AND Income IS Middle AND CreditScore IS Min AND Employment IS Medium THEN Approval IS Reject");
IS.NewRule("Rule 8", "IF Age IS Young AND Income IS Middle AND CreditScore IS Normal AND Employment IS Medium THEN Approval IS ApproveH");
IS.NewRule("Rule 9", "IF Age IS Young AND Income IS Low AND CreditScore IS Max AND Employment IS Medium THEN Approval IS ApproveSt");
IS.NewRule("Rule 10", "IF Age IS Young AND Income IS Low AND CreditScore IS Normal AND Employment IS Medium THEN Approval IS ApproveH");
IS.NewRule("Rule 11", "IF Age IS Young AND Income IS Low AND CreditScore IS Min AND Employment IS Medium THEN Approval IS Reject");
IS.NewRule("Rule 12", "IF Age IS Young AND Income IS Low AND CreditScore IS Min AND Employment IS Short THEN Approval IS Reject");
IS.NewRule("Rule 13", "IF Age IS Adult AND Income IS High AND CreditScore IS Max AND Employment IS Long THEN Approval IS ApproveLow");
IS.NewRule("Rule 14", "IF Age IS Adult AND Income IS High AND CreditScore IS Max AND Employment IS Medium THEN Approval IS ApproveLow");
IS.NewRule("Rule 15", "IF Age IS Adult AND Income IS High AND CreditScore IS Max AND Employment IS Short THEN Approval IS ApproveSt");
IS.NewRule("Rule 16", "IF Age IS Adult AND Income IS High AND CreditScore IS Normal AND Employment IS Short THEN Approval IS ApproveH");
IS.NewRule("Rule 17", "IF Age IS Adult AND Income IS High AND CreditScore IS Min AND Employment IS Short THEN Approval IS Reject");
IS.NewRule("Rule 18", "IF Age IS Adult AND Income IS High AND CreditScore IS Min AND Employment IS Medium THEN Approval IS Reject");
IS.NewRule("Rule 19", "IF Age IS Adult AND Income IS High AND CreditScore IS Min AND Employment IS Medium THEN Approval IS ApproveH");
IS.NewRule("Rule 20", "IF Age IS Adult AND Income IS High AND CreditScore IS Normal AND Employment IS Medium THEN Approval IS ApproveSt");
IS.NewRule("Rule 21", "IF Age IS Adult AND Income IS Middle AND CreditScore IS Max AND Employment IS Long THEN Approval IS ApproveLow");
IS.NewRule("Rule 22", "IF Age IS Adult AND Income IS Middle AND CreditScore IS Normal AND Employment IS Long THEN Approval IS ApproveSt");
IS.NewRule("Rule 23", "IF Age IS Adult AND Income IS Middle AND CreditScore IS Normal AND Employment IS Medium THEN Approval IS ApproveSt");
IS.NewRule("Rule 24", "IF Age IS Adult AND Income IS Low AND CreditScore IS Normal AND Employment IS Medium THEN Approval IS ApproveH");
IS.NewRule("Rule 25", "IF Age IS Adult AND Income IS Low AND CreditScore IS Normal AND Employment IS Short THEN Approval IS ApproveH");
IS.NewRule("Rule 26", "IF Age IS Adult AND Income IS Middle AND CreditScore IS Min AND Employment IS Medium THEN Approval IS Reject");
IS.NewRule("Rule 27", "IF Age IS Adult AND Income IS Middle AND CreditScore IS Min AND Employment IS Short THEN Approval IS Reject");
IS.NewRule("Rule 28", "IF Age IS Adult AND Income IS Middle AND CreditScore IS Max AND Employment IS Medium THEN Approval IS ApproveLow");
IS.NewRule("Rule 29", "IF Age IS Adult AND Income IS Middle AND CreditScore IS Max AND Employment IS Short THEN Approval IS ApproveSt");
IS.NewRule("Rule 30", "IF Age IS Adult AND Income IS Low AND CreditScore IS Max AND Employment IS Short THEN Approval IS ApproveSt");
IS.NewRule("Rule 31", "IF Age IS Adult AND Income IS Low AND CreditScore IS Min AND Employment IS Medium THEN Approval IS Reject");
IS.NewRule("Rule 32", "IF Age IS Adult AND Income IS Low AND CreditScore IS Min AND Employment IS Short THEN Approval IS Reject");
// Set inputs
IS.SetInput("Age", 23);
IS.SetInput("Income", 70);
IS.SetInput("CreditScore", 59);
IS.SetInput("Employment", 8);
// Get output
double currentApproval = IS.Evaluate("Approval");
// Approval:
Console.WriteLine("Current Approval of credit: " + currentApproval);
}
}
}
Why I cannot use numbers for input from all range? Why some numbers give results and others give such exception. How to avoid this mistake? What I did wrong in my code? Even if you have a guess, but you are not sure, please share your point of view. Thank you!