📄 form1.cs
字号:
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 + -