1

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!

0 Answers0