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

📄 form1.cs

📁 使用C#实现的决策树算法实例
💻 CS
📖 第 1 页 / 共 4 页
字号:
                giniSplit.giniSplitCriterion.attribute = "income";
                giniSplit.giniSplitCriterion.descriptionList.Add("medium");
                giniSplit.giniSplitCriterion.descriptionList.Add("low,high");
                giniSplit.giniSplitCriterion.splitList.Add(D3);
                giniSplit.giniSplitCriterion.splitList.Add(D4);
            }
            //计算"high"+"low+middel_aged"的gini
            D5 = new 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 = "income";
                giniSplit.giniSplitCriterion.descriptionList.Add("high");
                giniSplit.giniSplitCriterion.descriptionList.Add("low,medium");
                giniSplit.giniSplitCriterion.splitList.Add(D5);
                giniSplit.giniSplitCriterion.splitList.Add(D6);
            }
            else
            {
                D5.Clear();
                D6.Clear();
            }

            return giniSplit;
        }

        //计算"student"属性的Gini
        private GiniSplit GiniStudent(ArrayList d)
        {
            double gini;
            ArrayList d1, d2;
            GiniSplit giniSplit = new GiniSplit();
            d1 = CopySmallCollection(d, "student", studentType.yes);
            d2 = CopySmallCollection(d, "student", studentType.no);
            //计算"yes"+"no"的gini
            gini = (double)d1.Count / d.Count * Gini(d1) + (double)d2.Count / d.Count * Gini(d2);
            giniSplit.giniSplitCriterion.descriptionList.Clear();
            giniSplit.giniSplitCriterion.splitList.Clear();
            giniSplit.gini = gini;
            giniSplit.giniSplitCriterion.attribute = "student";
            giniSplit.giniSplitCriterion.descriptionList.Add("yes");
            giniSplit.giniSplitCriterion.descriptionList.Add("no");
            giniSplit.giniSplitCriterion.splitList.Add(d1);
            giniSplit.giniSplitCriterion.splitList.Add(d2);

            return giniSplit;
        }

        //计算"creditRating"属性的GiniCreditRating
        private GiniSplit GiniCreditRating(ArrayList d)
        {
            double gini;
            ArrayList d1, d2;
            GiniSplit giniSplit = new GiniSplit();
            d1 = CopySmallCollection(d, "creditRating", creditRatingType.excellent);
            d2 = CopySmallCollection(d, "creditRating", creditRatingType.fair);
            //计算"excellent"+"fair"的gini
            gini = (double)d1.Count / d.Count * Gini(d1) + (double)d2.Count / d.Count * Gini(d2);
            giniSplit.giniSplitCriterion.descriptionList.Clear();
            giniSplit.giniSplitCriterion.splitList.Clear();
            giniSplit.gini = gini;
            giniSplit.giniSplitCriterion.attribute = "creditRating";
            giniSplit.giniSplitCriterion.descriptionList.Add("excellent");
            giniSplit.giniSplitCriterion.descriptionList.Add("fair");
            giniSplit.giniSplitCriterion.splitList.Add(d1);
            giniSplit.giniSplitCriterion.splitList.Add(d2);

            return giniSplit;
        }

        //按A划分的最小Gini
        private GiniSplit GiniA(string a, ArrayList d)
        {
            GiniSplit giniSplit;
            switch (a)
            {
                case "age":
                    giniSplit = GiniAge(d);
                    break;
                case "income":
                    giniSplit = GiniIncome(d);
                    break;
                case "student":
                    giniSplit = GiniStudent(d);
                    break;
                case "creditRating":
                    giniSplit = GiniCreditRating(d);
                    break;
                default:
                    MessageBox.Show("error");
                    giniSplit = new GiniSplit();
                    break;
            }
            return giniSplit;
        }

        //计算Gini
        private double Gini(ArrayList d)
        {
            double gini = 1;
            double countYes = 0;
            for (int i = 0; i < d.Count; i++)
            {
                if (((Item)d[i]).buysComputer == buysComputerType.yes)
                    countYes++;
            }
            if (countYes != 0)
                gini += -(countYes / d.Count) * (countYes / d.Count);
            if (countYes != d.Count)
                gini += -((d.Count - countYes) / d.Count) * ((d.Count - countYes) / d.Count);
            return gini;
        }

        //按规则复制D
        private ArrayList CopySmallCollection(ArrayList d, string attribute, Enum type)
        {
            ArrayList newD = new ArrayList();
            for (int i = 0; i < d.Count; i++)
            {
                switch (attribute)
                {
                    case "age":
                        if (((Item)d[i]).age == (ageType)type)
                            newD.Add(d[i]);
                        break;
                    case "income":
                        if (((Item)d[i]).income == (incomeType)type)
                            newD.Add(d[i]);
                        break;
                    case "student":
                        if (((Item)d[i]).student == (studentType)type)
                            newD.Add(d[i]);
                        break;
                    case "creditRating":
                        if (((Item)d[i]).creditRating == (creditRatingType)type)
                            newD.Add(d[i]);
                        break;
                    default:
                        MessageBox.Show("error");
                        break;
                }
            }
            return newD;
        }

        private ArrayList CopySmallCollection(ArrayList d, string attribute, string type)
        {
            ArrayList newD = new ArrayList();
            for (int i = 0; i < d.Count; i++)
            {
                switch (attribute)
                {
                    case "age":
                        if (((Item)d[i]).age.ToString() == type)
                            newD.Add(d[i]);
                        break;
                    case "income":
                        if (((Item)d[i]).income.ToString() == type)
                            newD.Add(d[i]);
                        break;
                    case "student":
                        if (((Item)d[i]).student.ToString() == type)
                            newD.Add(d[i]);
                        break;
                    case "creditRating":
                        if (((Item)d[i]).creditRating.ToString() == type)
                            newD.Add(d[i]);
                        break;
                    default:
                        MessageBox.Show("error");
                        break;
                }
            }
            return newD;
        }

        private Type GetEnumType(string name)
        {
            switch (name)
            {
                case "age":
                    return typeof(ageType);
                case "income":
                    return typeof(incomeType);
                case "student":
                    return typeof(studentType);
                case "creditRating":
                    return typeof(creditRatingType);
                case "buysComputer":
                    return typeof(buysComputerType);
                default:
                    MessageBox.Show("error");
                    return null;
            }
        }

        private void inportToolStripMenuItem_Click(object sender, EventArgs e)
        {
            test1();
        }

        private void addToolStripMenuItem_Click(object sender, EventArgs e)
        {
            lblAge.Visible = true;
            lblIncome.Visible = true;
            lblStudent.Visible = true;
            lblCredit.Visible = true;
            lblBuysComputer.Visible = true;
            cbAge.Visible = true;
            comboBox2.Visible = true;
            comboBox3.Visible = true;
            comboBox4.Visible = true;
            comboBox5.Visible = true;
            button1.Visible = true;
            
        }

        private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            int j = 0;
            for (int i = 0; i < Testdata.Items.Count; i++)
            {
                if (Testdata.SelectedIndex==i)
                {
                    Testdata.Items.RemoveAt(i);
                    al.RemoveAt(i);
                    j = i;
                }
            }
            this.Testdata.Items.Clear();
            this.Testdata.Items.Add("RID\tage\t\tincome\tstudent\tcredit_rating\tClass:buys_computer\n");
            Item testItem;
            for (int i = 0; i < al.Count; i++)
            {
                string temp = "";
                testItem = (Item)al[i];
                if (i+1> j)
                {
                    testItem.ID = testItem.ID - 1;
                    temp += testItem.ID.ToString();
                }
                else
                    temp += testItem.ID.ToString();

                temp += "\t";
                temp += testItem.age.ToString();
                temp += "\t";
                if (testItem.age.ToString().Length < 8)
                    temp += "\t";
                temp += testItem.income.ToString();
                temp += "\t";
                temp += testItem.student.ToString();
                temp += "\t";
                temp += testItem.creditRating.ToString();
                temp += "\t";
                if (testItem.creditRating.ToString().Length < 8)
                    temp += "\t";
                temp += testItem.buysComputer.ToString();
                temp += "\n";
                this.Testdata.Items.Add(temp);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Item testItem = new Item();
            testItem.ID = al.Count+1;
            if (cbAge.SelectedItem.ToString() == "youth")
                testItem.age = ageType.youth;
            else if (cbAge.SelectedItem.ToString() == "middle_aged")
                testItem.age = ageType.middle_aged;
            else
                testItem.age = ageType.senior;
            if (comboBox2.SelectedItem.ToString() == "high")
                testItem.income = incomeType.high;
            else if (comboBox2.SelectedItem.ToString() == "low")
                testItem.income =incomeType.low;
            else
                testItem.income = incomeType.medium;
            if(comboBox3.SelectedItem.ToString()=="no")
                testItem.student = studentType.no;
            else
                testItem.student = studentType.yes;
            if(comboBox4.SelectedItem.ToString()=="fair")
                testItem.creditRating = creditRatingType.fair;
            else 
                testItem.creditRating=creditRatingType.excellent;
            if (comboBox5.SelectedItem.ToString() == "no")
                testItem.buysComputer = buysComputerType.no;
            else if (comboBox5.SelectedItem.ToString() == "yes")
                testItem.buysComputer = buysComputerType.yes;
            al.Add(testItem);
            this.Testdata.Items.Clear();
            this.Testdata.Items.Add("RID\tage\t\tincome\tstudent\tcredit_rating\tClass:buys_computer\n");
            AddDataToListbox(al);

        }

        private void button2_Click(object sender, EventArgs e)
        {
            al.Clear();
            if(this.Testdata.Items.Count==0)
            this.Testdata.Items.Add("RID\tage\t\tincome\tstudent\tcredit_rating\tClass:buys_computer\n");
        }
    }
}

⌨️ 快捷键说明

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