一个月前的C语言程序设计课上学习了决策树ID3算法
然后自己用了两个多星期的时间开始用C语言实现,结果由于过程太过于复杂,写出来的东西就跟屎一样。
可能是自己对于这个算法理解的不够深刻,或者是在设计的时候没有构思好。
所以决定在这里写一写大概的构思然后再去用C实现。
这样可能会更加有效率一点。
决策树之ID3算法:
ID3算法的实质是检索哪个属性的分类能力更强,然后用拿个分类能力强的属性将数据分类,然后继续检索继续分类。
这样最后分完之后就会是一个树的结构。
分到最后的时候数据会到达一定的纯度。
之后你拿一个样本过来,顺着这个树往下找,找到它所属于的那一堆数据里,也就是叶节点上。
就能根据这一堆数据生和死的比例来对样本进行判断。
如何判断一个属性的分类能力?
根据香农的信息论。香农定义了一个名叫信息熵的东西,来说明一个系统的信息稳定程度。
一个系统的信息熵越小,那么用它分类出的系统就越稳定,它的分类能力就比较强。
信息熵的计算公式:(n1 / m) * log2(n1 / m) + (n2 / m) * log2(n2 / m) + ........... + (nn / m) * log2(nn / m)
具体的构建步骤:(以泰坦尼克号的数据为训练模型)
训练数据的结构:(第一列是生死标签)
//上一节课老师跟我说可以不用树的结构去构建数据结构,但是我实在不知道该怎么写,在他的口中用所谓字符数组的结构去做要比我这个简单很多。
//所以在这里还是采用我以前想的那个树的结构去做。
第一步,我们需要有一个函数来读取文件数据,我们选择一个二维数组去储存。
我觉得这个函数还是不错的。
int getData()//获取数据
{
FILE *p;
if (auto err = fopen_s(&p, "C:\\Users\\XueChuanyu\\Desktop\\test.txt", "r") == NULL)
{
printf("\nNo sucn a file");
}
int i = 0, k = 0;
for (i = 0; i < DATASIZE; i++)
{
for (k = 0; k < 8; k++)
{
fscanf_s(p, "%lf", &data[i][k]);
if (k == 3)
{
disperseAge(data[i][3], 15);
}
if (k == 6)
{
disperseAge(data[i][6], 70);
}
}
}
fclose(p);
return 0;
}
但是我们有 很多数据都是连续的数据,所以要先进行离散化:
这个函数也还算能用的。
double disperseAge(double x, int different)// 根据离散间隔值离散化
{
if (x < different)
{
x = 0;
return x;
}
else
{