⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 使用C#实现的决策树算法实例
💻 CS
📖 第 1 页 / 共 4 页
字号:
                switch (((Item)d[i]).creditRating)
                {
                    case creditRatingType.excellent:
                        excellent++;
                        break;
                    case creditRatingType.fair:
                        fair++;
                        break;
                    default:
                        MessageBox.Show("error");
                        break;
                }
            }
            return excellent / d.Count * Info(CopySmallCollection(d, "creditRating", creditRatingType.excellent)) + fair / d.Count * Info(CopySmallCollection(d, "creditRating", creditRatingType.fair));
        }

        //按属性A计算Gain
        private double GainA(string a, ArrayList d)
        {
            double info;           //按类划分的期望信息
            double infoA;          //按A划分的期望信息
            double gainA;           //信息增益


            //计算Info
            info = Info(d);

            //计算最小的InfoA和选择的属性
            {
                infoA = 1;
                switch (a)
                {
                    case "age":
                        infoA = InfoAge(d);
                        break;
                    case "income":
                        infoA = InfoIncome(d);
                        break;
                    case "student":
                        infoA = InfoStudent(d);
                        break;
                    case "creditRating":
                        infoA = InfoCreditRating(d);
                        break;
                    default:
                        MessageBox.Show("error");
                        break;
                }
            }

            //计算GainA
            gainA = info - infoA;

            return gainA;
        }

        //计算"age"属性的SplitInfo
        private double SplitInfoAge(ArrayList d)
        {
            double youth = 0, middle_aged = 0, senior = 0;
            for (int i = 0; i < d.Count; i++)
            {
                switch (((Item)d[i]).age)
                {
                    case ageType.youth:
                        youth++;
                        break;
                    case ageType.middle_aged:
                        middle_aged++;
                        break;
                    case ageType.senior:
                        senior++;
                        break;
                    default:
                        MessageBox.Show("error");
                        break;
                }
            }
            return -youth / d.Count * Math.Log(youth / d.Count, 2) - middle_aged / d.Count * Math.Log(middle_aged / d.Count, 2) - senior / d.Count * Math.Log(senior / d.Count, 2);
        }

        //计算"income"属性的SplitInfo
        private double SplitInfoIncome(ArrayList d)
        {
            double low = 0, medium = 0, high = 0;
            for (int i = 0; i < d.Count; i++)
            {
                switch (((Item)d[i]).income)
                {
                    case incomeType.low:
                        low++;
                        break;
                    case incomeType.medium:
                        medium++;
                        break;
                    case incomeType.high:
                        high++;
                        break;
                    default:
                        MessageBox.Show("error");
                        break;
                }
            }
            return -low / d.Count * Math.Log(low / d.Count, 2) - medium / d.Count * Math.Log(medium / d.Count, 2) - high / d.Count * Math.Log(high / d.Count, 2);
        }

        //计算"student"属性的SplitInfo
        private double SplitInfoStudent(ArrayList d)
        {
            double yes = 0, no = 0;
            for (int i = 0; i < d.Count; i++)
            {
                switch (((Item)d[i]).student)
                {
                    case studentType.yes:
                        yes++;
                        break;
                    case studentType.no:
                        no++;
                        break;
                    default:
                        MessageBox.Show("error");
                        break;
                }
            }
            return -yes / d.Count * Math.Log(yes / d.Count, 2) - no / d.Count * Math.Log(no / d.Count, 2);
        }

        //计算"creditRating"属性的SplitInfo
        private double SplitInfoCreditRating(ArrayList d)
        {
            double excellent = 0, fair = 0;
            for (int i = 0; i < d.Count; i++)
            {
                switch (((Item)d[i]).creditRating)
                {
                    case creditRatingType.excellent:
                        excellent++;
                        break;
                    case creditRatingType.fair:
                        fair++;
                        break;
                    default:
                        MessageBox.Show("error");
                        break;
                }
            }
            return -excellent / d.Count * Math.Log(excellent / d.Count, 2) - fair / d.Count * Math.Log(fair / d.Count, 2);
        }

        //按属性A计算SplitInfo
        private double SplitInfoA(string a, ArrayList d)
        {
            switch (a)
            {
                case "age":
                    return SplitInfoAge(d);
                case "income":
                    return SplitInfoIncome(d);
                case "student":
                    return SplitInfoStudent(d);
                case "creditRating":
                    return SplitInfoCreditRating(d);
                default:
                    MessageBox.Show("error");
                    break;
            }
            return 0;
        }

        //计算平均增益SplitInfo(未完成)
        private double SplitInfo(ArrayList d)
        {
            return 0;
        }

        //计算"age"属性的Gini
        private GiniSplit GiniAge(ArrayList d)
        {
            double gini;
            ArrayList d1, d2, d3;
            ArrayList D1, D2;
            GiniSplit giniSplit = new GiniSplit();
            giniSplit.gini = 1;
            D1 = new ArrayList();
            D2 = new ArrayList();
            d1 = CopySmallCollection(d, "age", ageType.youth);
            d2 = CopySmallCollection(d, "age", ageType.middle_aged);
            d3 = CopySmallCollection(d, "age", ageType.senior);
            //计算"youth"+"middle_aged,senior"的gini
            D1.Clear();
            D2.Clear();
            D1.AddRange(d1);
            D2.AddRange(d2);
            D2.AddRange(d3);
            gini = (double)D1.Count / d.Count * Gini(D1) + (double)D2.Count / d.Count * Gini(D2);
            if (gini < giniSplit.gini)
            {
                giniSplit.giniSplitCriterion.descriptionList.Clear();
                giniSplit.giniSplitCriterion.splitList.Clear();
                giniSplit.gini = gini;
                giniSplit.giniSplitCriterion.attribute = "age";
                giniSplit.giniSplitCriterion.descriptionList.Add("youth");
                giniSplit.giniSplitCriterion.descriptionList.Add("middle_aged,senior");
                giniSplit.giniSplitCriterion.splitList.Add(D1);
                giniSplit.giniSplitCriterion.splitList.Add(D2);
            }
            else
            {
                D1.Clear();
                D2.Clear();
            }
            //计算"middle_aged"+"youth,senior"的gini
            ArrayList D3 = new ArrayList();
            ArrayList D4 = new ArrayList();
            D3.Clear();
            D4.Clear();
            D3.AddRange(d2);
            D4.AddRange(d1);
            D4.AddRange(d3);
            gini = (double)D3.Count / d.Count * Gini(D3) + (double)D4.Count / d.Count * Gini(D4);
            if (gini < giniSplit.gini)
            {
                giniSplit.giniSplitCriterion.descriptionList.Clear();
                giniSplit.giniSplitCriterion.splitList.Clear();
                giniSplit.gini = gini;
                giniSplit.giniSplitCriterion.attribute = "age";
                giniSplit.giniSplitCriterion.descriptionList.Add("middle_aged");
                giniSplit.giniSplitCriterion.descriptionList.Add("youth,senior");
                giniSplit.giniSplitCriterion.splitList.Add(D3);
                giniSplit.giniSplitCriterion.splitList.Add(D4);
            }
            else
            {
                D3.Clear();
                D4.Clear();
            }
            //计算"senior"+"youth+middel_aged"的gini
            ArrayList D5 = new ArrayList();
            ArrayList D6 = new ArrayList();
            D5.Clear();
            D6.Clear();
            D5.AddRange(d3);
            D6.AddRange(d1);
            D6.AddRange(d2);
            gini = (double)D5.Count / d.Count * Gini(D5) + (double)D6.Count / d.Count * Gini(D6);
            if (gini < giniSplit.gini)
            {
                giniSplit.giniSplitCriterion.descriptionList.Clear();
                giniSplit.giniSplitCriterion.splitList.Clear();
                giniSplit.gini = gini;
                giniSplit.giniSplitCriterion.attribute = "age";
                giniSplit.giniSplitCriterion.descriptionList.Add("senior");
                giniSplit.giniSplitCriterion.descriptionList.Add("youth,middle_aged");
                giniSplit.giniSplitCriterion.splitList.Add(D5);
                giniSplit.giniSplitCriterion.splitList.Add(D6);
            }
            else
            {
                D5.Clear();
                D6.Clear();
            }

            return giniSplit;
        }

        //计算"income"属性的Gini
        private GiniSplit GiniIncome(ArrayList d)
        {
            double gini;
            ArrayList d1, d2, d3;
            ArrayList D1, D2, D3, D4, D5, D6;
            GiniSplit giniSplit = new GiniSplit();
            giniSplit.gini = 1;
            D1 = new ArrayList();
            D2 = new ArrayList();
            d1 = CopySmallCollection(d, "income", incomeType.low);
            d2 = CopySmallCollection(d, "income", incomeType.medium);
            d3 = CopySmallCollection(d, "income", incomeType.high);
            //计算"low"+"medium,high"的gini
            D1.Clear();
            D2.Clear();
            D1.AddRange(d1);
            D2.AddRange(d2);
            D2.AddRange(d3);
            gini = (double)D1.Count / d.Count * Gini(D1) + (double)D2.Count / d.Count * Gini(D2);
            if (gini < giniSplit.gini)
            {
                giniSplit.giniSplitCriterion.descriptionList.Clear();
                giniSplit.giniSplitCriterion.splitList.Clear();
                giniSplit.gini = gini;
                giniSplit.giniSplitCriterion.attribute = "income";
                giniSplit.giniSplitCriterion.descriptionList.Add("low");
                giniSplit.giniSplitCriterion.descriptionList.Add("medium,high");
                giniSplit.giniSplitCriterion.splitList.Add(D1);
                giniSplit.giniSplitCriterion.splitList.Add(D2);
            }
            else
            {
                D1.Clear();
                D2.Clear();
            }
            //计算"medium"+"low,high"的gini
            D3 = new ArrayList();
            D4 = new ArrayList();
            D3.Clear();
            D4.Clear();
            D3.AddRange(d2);
            D4.AddRange(d1);
            D4.AddRange(d3);
            gini = (double)D3.Count / d.Count * Gini(D3) + (double)D4.Count / d.Count * Gini(D4);
            if (gini < giniSplit.gini)
            {
                giniSplit.giniSplitCriterion.descriptionList.Clear();
                giniSplit.giniSplitCriterion.splitList.Clear();
                giniSplit.gini = gini;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -