有没有c#的python 决策树代码分类的代码

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
标签:至少1个,最多5个
决策树(decision tree)是一个树结构,可以是二叉树或非二叉树,也可以把他看作是 if-else 规则的集合,也可以认为是在特征空间上的条件概率分布。
决策树的结构
以一个简单的用于是否买电脑预测的决策树为例子:
树中的内部节点代表一个属性,节点引出的分支表示这个属性的所有可能的值,叶节点表示最终的分类结果。从根节点到叶节点的每一条路径构建一条规则,并且这些规则具有 互斥且完备 的性质,即每一个样本均被且只有一条路径所覆盖。
决策树的创建是根据给定的训练数据来完成的,给出下面的训练集(本章都是围着这个例子进行讲解):
这是一个是否买电脑的一个数据,数据上有4个特征:年龄( age ),收入( income ),是否学生( student ),信用度( credit_rating )。
案例的决策树中,为什么是以年龄作为第一个进行分类的特征呢?
特征的分类能力
如果一个特征对结果影响比较大,那么就可以认为这个特征的分类能力比较大。相亲时候一般会先问收入,再问长相,然后问其家庭情况。也就是说在这边收入情况影响比较大,所以作为第一个特征判断,如果不合格那可能连后续都不用询问了。
有什么方法可以表明特征的分类能力呢?这时候,需要引入一个概念,熵 。
熵(entropy)
1948年,香农提出“信息熵”的概率。一条信息的信息量大小和它的不确定性有直接的关系,要搞清楚一件不确定的事,需要了解大量信息。熵(entropy)用于表示 随机变量不确定性的度量, 如果熵越大,表示不确定性越大。
假设变量X,它有Xi(i=1,2,3...n)种情况,pi表示第i情况的概率,那么随机变量X的熵定义为:
H(X) = -\sum_{i=1}^np_i\log_2{(p_i)}
熵的单位是比特(bit)。
比如当随机变量X只有0,1两种取值,则有: H(x) = -plog(p) - (1-p)log(1-p) , 可以画出一个二维坐标表示他们的关系:
从而可知,当 p=0.5 时,熵取值最大,随机变量不确定性最大。
回到买电脑的例子,在是否购买电脑这个结果中,数据集D,有 9 个yes,5 个no。因此它的熵是:
info(D) = H(D) = - \frac{9}{14}\log_2(\frac{9}{14}) - \frac5{14}\log_2(\frac5{14}) = 0.940 bits
条件熵(conditional entropy)
随机变量X给定的条件下,随机变量Y的条件熵 H(Y|X) 定义为:
H(Y|X) = \sum_{i=1}^np_iH(Y|X=x_i)
信息增益 (Information gain)
信息增益表示的是:得知 特征X 的信息而使得 分类Y 的信息的不确定性减少的程度。如果某个特征的信息增益比较大,就表示该特征对结果的影响较大,特征A对数据集D的信息增益表示为:
gain(A) = H(D) - H(D|A)
以那个买电脑的数据集为例,我们来计算下 age 这个特征的信息增益,将数据再展示一下:
从图中可以看出,有14条数据 age 这个特征中,年轻人 youth 有5人, 中年人 middle_aged 有4人,老年人 senior 有5人。分别计算这三种情况下的信息熵,再将信息熵相加就能得到 H(D|A):
\begin{align*}
info_{age}(D) = H(D|A) &= \frac5{14}\times (-\frac25\log_2\frac25 - \frac35\log_2\frac35) \\
&+\frac4{14}\times (-\frac44\log_2\frac44 - \frac04\log_2\frac04) \\
&+\frac5{14}\times (-\frac35\log_2\frac35 - \frac25\log_2\frac25) \\
&=0.694 bits
\end{align*}
因此,gain(age) 的信息增益就是:
gain(age) = info(D) - info_{age}(D) = 0.940 - 0.694 = 0.246 bits
决策树归纳算法 (ID3)
ID3算法的核心是在决策树的各个结点上应用 信息增益 准则进行特征选择。这个算法也是本章主要介绍的算法。具体做法是:
从根节点开始,对结点计算所有可能特征的信息增益,选择信息增益最大的特征作为结点的特征,并由该特征的不同取值构建子节点;
对子节点递归地调用以上方法,构建决策树;
直到所有特征的信息增益均很小或者没有特征可选时为止。
根据上面的计算信息增量的方法,可以得出其他特征的信息增量:gain(income) = 0.029, gain(student) = 0.151, gain(credit_rating)=0.048 。
age 这个特征的信息增益是最大的(0.246 bits),选择age作为第一个根节点进行分类:
然后再每个子树中,再根据其特征的信息增益量进行每个划分,递归地形成每个划分上的样本判定树。
递归的停止条件
递归划分步骤仅当下列条件之一成立停止:(a) 给定结点的所有样本属于同一类。(b) 没有剩余属性可以用来进一步划分样本。在此情况下,使用多数表决。这涉及将给定的结点转换成树叶,并用样本中的多数所在的类标记它。替换地,可以存放结点样本的类分布。(c) 分枝,当所有特征的信息增益都很小,也就是没有再计算的必要了,就创建一个树叶,也是用多数表决。
其他决策树归纳算法
C4.5算法与ID3算法的区别主要在于它在生产决策树的过程中,使用信息增益比来进行特征选择。
分类与回归树(classification and regression tree,CART)与C4.5算法一样,由ID3算法演化而来。CART假设决策树是一个二叉树,它通过递归地二分每个特征,将特征空间划分为有限个单元,并在这些单元上确定预测的概率分布。
CART算法中,对于回归树,采用的是平方误差最小化准则;对于分类树,采用基尼指数最小化准则。
这些算法共同点:都是贪心算法,自上而下的创建决策树。不同点是在于对特征的选择度量方法不同。
决策树的剪枝
如果树长到叶子深度太大,就会造成一种情况,在训练集上表现非常好,但是因为分的太细了,在新的数据上就表现不好了。就是出现过度拟合的现象。为了避免这个问题,有两种解决办法:
先剪枝:当熵减少的数量小于某一个阈值时,就停止分支的创建。这是一种贪心算法。
后剪枝:先创建完整的决策树,然后再尝试消除多余的节点,也就是采用减枝的方法。
总结:决策树的优缺点
易于理解和解释,甚至比线性回归更直观;
与人类做决策思考的思维习惯契合;
模型可以通过树的形式进行可视化展示;
可以直接处理非数值型数据,不需要进行哑变量的转化,甚至可以直接处理含缺失值的数据;
处理连续变量不好;
不好处理变量之间存在许多错综复杂的关系,如金融数据分析;
决定分类的因素取决于更多变量的复杂组合时;
可规模性一般。
0 收藏&&|&&4
你可能感兴趣的文章
99 收藏,8.3k
2 收藏,67
9 收藏,592
本作品采用 署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。>> 经典决策树分类和规则学习模式
经典决策树分类和规则学习模式
所属分类:
下载地址:
ID3.rar文件大小:1.60 kB
分享有礼! 》
请点击右侧的分享按钮,把本代码分享到各社交媒体。
通过您的分享链接访问Codeforge,每来2个新的IP,您将获得0.1 积分的奖励。
通过您的分享链接,每成功注册一个用户,该用户在Codeforge上所获得的每1个积分,您都将获得0.2 积分的分成奖励。
决策树算法 经典的ID3算法 用于决策树规则学习等等 在规则学习以及分类中有重要的作用-classic decision tree mode
for classification and rule learning
Sponsored links
源码文件列表
温馨提示: 点击源码文件名可预览文件内容哦 ^_^
4.31 kB26-07-07 16:31
(提交有效评论获得积分)
评论内容不能少于15个字,不要超出160个字。
评价成功,多谢!
下载ID3.rar
CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了
您的积分不足,优惠套餐快速获取 30 积分
10积分 / ¥100
30积分 / ¥200原价 ¥300 元
100积分 / ¥500原价 ¥1000 元
订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。
支付宝支付宝付款
微信钱包微信付款
更多付款方式:、
您本次下载所消耗的积分将转交上传作者。
同一源码,30天内重复下载,只扣除一次积分。
鲁ICP备号-3 runtime:Elapsed:78.910ms - init:0.1;find:0.7;t:0.5;tags:0.2;related:42.0;comment:0.2; 5.8
登录 CodeForge
还没有CodeForge账号?
Switch to the English version?
^_^"呃 ...
Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧数据挖掘课上面老师介绍了下决策树ID3算法,我抽空余时间把这个算法用C++实现了一遍。
决策树算法是非常常用的分类算法,是逼近离散目标函数的方法,学习得到的函数以决策树的形式表示。其基本思路是不断选取产生信息增益最大的属性来划分样例集和,构造决策树。信息增益定义为结点与其子结点的信息熵之差。信息熵是香农提出的,用于描述信息不纯度(不稳定性),其计算公式是
Pi为子集合中不同性(而二元分类即正样例和负样例)的样例的比例。这样信息收益可以定义为样本按照某属性划分时造成熵减少的期望,可以区分训练样本中正负样本的能力,其计算公司是
我实现该算法针对的样例集合如下
该表记录了在不同气候条件下是否去打球的情况,要求根据该表用程序输出决策树
C++代码如下,程序中有详细注释
#include &iostream&#include &string&#include &vector&#include &map&#include &algorithm&#include &cmath&#define MAXLEN 6//输入每行的数据个数//多叉树的实现 //1 广义表//2 父指针表示法,适于经常找父结点的应用//3 子女链表示法,适于经常找子结点的应用//4 左长子,右兄弟表示法,实现比较麻烦//5 每个结点的所有孩子用vector保存//教训:数据结构的设计很重要,本算法采用5比较合适,同时//注意维护剩余样例和剩余属性信息,建树时横向遍历考循环属性的值,//纵向遍历靠递归调用vector &vector &string& &//实例集vector &string& item(MAXLEN);//对应一行实例集vector &string& attribute_//保存首行即属性行数据string end(&end&);//输入结束string yes(&yes&);string no(&no&);string blank(&&);map&string,vector & string & & map_attribute_//存储属性对应的所有的值int tree_size = 0;struct Node{//决策树节点 //属性值 string arrived_//到达的属性值 vector&Node *&//所有的孩子 Node(){
attribute =
arrived_value = }};Node *//根据数据实例计算属性与值组成的mapvoid ComputeMapFrom2DVector(){ unsigned int i,j,k; bool exited = vector&string& for(i = 1; i & MAXLEN-1; i++){//按照列遍历
for (j = 1; j & state.size(); j++){
for (k = 0; k & values.size(); k++){
if(!values[k].compare(state[j][i])) exited =
if(!exited){
values.push_back(state[j][i]);//注意Vector的插入都是从前面插入的,注意更新it,始终指向vector头
map_attribute_values[state[0][i]] =
values.erase(values.begin(), values.end()); } }//根据具体属性和值来计算熵double ComputeEntropy(vector &vector &string& & remain_state, string attribute, string value,bool ifparent){ vector&int& count (2,0); unsigned int i,j; bool done_flag =//哨兵值 for(j = 1; j & MAXLEN; j++){
if(done_flag)
if(!attribute_row[j].compare(attribute)){
for(i = 1; i & remain_state.size(); i++){
if((!ifparent&&!remain_state[i][j].compare(value)) || ifparent){//ifparent记录是否算父节点
if(!remain_state[i][MAXLEN - 1].compare(yes)){
count[0]++;
else count[1]++;
done_flag =
} } if(count[0] == 0 || count[1] == 0 ) return 0;//全部是正实例或者负实例 //具体计算熵 根据[+count[0],-count[1]],log2为底通过换底公式换成自然数底数 double sum = count[0] + count[1]; double entropy = -count[0]/sum*log(count[0]/sum)/log(2.0) - count[1]/sum*log(count[1]/sum)/log(2.0); } //计算按照属性attribute划分当前剩余实例的信息增益double ComputeGain(vector &vector &string& & remain_state, string attribute){ unsigned int j,k,m; //首先求不做划分时的熵 double parent_entropy = ComputeEntropy(remain_state, attribute, blank, true); double children_entropy = 0; //然后求做划分后各个值的熵 vector&string& values = map_attribute_values[attribute]; vector&double& vector&int& count_
for(m = 0; m & values.size(); m++){
tempint = 0;
for(k = 1; k & MAXLEN - 1; k++){
if(!attribute_row[k].compare(attribute)){
for(j = 1; j & remain_state.size(); j++){
if(!remain_state[j][k].compare(values[m])){
tempint++;
count_values.push_back(tempint); }
for(j = 0; j & values.size(); j++){
ratio.push_back((double)count_values[j] / (double)(remain_state.size()-1)); } double temp_ for(j = 0; j & values.size(); j++){
temp_entropy = ComputeEntropy(remain_state, attribute, values[j], false);
children_entropy += ratio[j] * temp_ } return (parent_entropy - children_entropy); }int FindAttriNumByName(string attri){ for(int i = 0; i & MAXLEN; i++){
if(!state[0][i].compare(attri)) } cerr&&&can't find the numth of attribute&&&
return 0;}//找出样例中占多数的正/负性string MostCommonLabel(vector &vector &string& & remain_state){ int p = 0, n = 0; for(unsigned i = 0; i & remain_state.size(); i++){
if(!remain_state[i][MAXLEN-1].compare(yes)) p++;
else n++; } if(p &= n) }//判断样例是否正负性都为labelbool AllTheSameLabel(vector &vector &string& & remain_state, string label){ int count = 0; for(unsigned int i = 0; i & remain_state.size(); i++){
if(!remain_state[i][MAXLEN-1].compare(label)) count++; } if(count == remain_state.size()-1) }//计算信息增益,DFS构建决策树//current_node为当前的节点//remain_state为剩余待分类的样例//remian_attribute为剩余还没有考虑的属性//返回根结点指针Node * BulidDecisionTreeDFS(Node * p, vector &vector &string& & remain_state, vector &string& remain_attribute){ //if(remain_state.size() & 0){
//printv(remain_state); //} if (p == NULL)
p = new Node(); //先看搜索到树叶的情况 if (AllTheSameLabel(remain_state, yes)){
p-&attribute =
} if (AllTheSameLabel(remain_state, no)){
p-&attribute =
} if(remain_attribute.size() == 0){//所有的属性均已经考虑完了,还没有分尽
string label = MostCommonLabel(remain_state);
p-&attribute =
} double max_gain = 0, temp_ vector &string&::iterator max_ vector &string&::iterator it1; for(it1 = remain_attribute.begin(); it1 & remain_attribute.end(); it1++){
temp_gain = ComputeGain(remain_state, (*it1));
if(temp_gain & max_gain) {
max_gain = temp_
max_it = it1;
} } //下面根据max_it指向的属性来划分当前样例,更新样例集和属性集 vector &string& new_ vector &vector &string& & new_ for(vector &string&::iterator it2 = remain_attribute.begin(); it2 & remain_attribute.end(); it2++){
if((*it2).compare(*max_it)) new_attribute.push_back(*it2); } //确定了最佳划分属性,注意保存 p-&attribute = *max_ vector &string& values = map_attribute_values[*max_it]; int attribue_num = FindAttriNumByName(*max_it); new_state.push_back(attribute_row); for(vector &string&::iterator it3 = values.begin(); it3 & values.end(); it3++){
for(unsigned int i = 1; i & remain_state.size(); i++){
if(!remain_state[i][attribue_num].compare(*it3)){
new_state.push_back(remain_state[i]);
Node * new_node = new Node();
new_node-&arrived_value = *it3;
if(new_state.size() == 0){//表示当前没有这个分支的样例,当前的new_node为叶子节点
new_node-&attribute = MostCommonLabel(remain_state);
BulidDecisionTreeDFS(new_node, new_state, new_attribute);
//递归函数返回时即回溯时需要1 将新结点加入父节点孩子容器 2清除new_state容器
p-&childs.push_back(new_node);
new_state.erase(new_state.begin()+1,new_state.end());//注意先清空new_state中的前一个取值的样例,准备遍历下一个取值样例 } }void Input(){
while(cin&&s,s.compare(end) != 0){//-1为输入结束
for(int i = 1;i & MAXLEN; i++){
cin&&item[i];
state.push_back(item);//注意首行信息也输入进去,即属性 } for(int j = 0; j & MAXLEN; j++){
attribute_row.push_back(state[0][j]); }}void PrintTree(Node *p, int depth){ for (int i = 0; i & i++) cout && '\t';//按照树的深度先输出tab if(!p-&arrived_value.empty()){
cout&&p-&arrived_value&&
for (int i = 0; i & depth+1; i++) cout && '\t';//按照树的深度先输出tab } cout&&p-&attribute&& for (vector&Node*&::iterator it = p-&childs.begin(); it != p-&childs.end(); it++){
PrintTree(*it, depth + 1); }}void FreeTree(Node *p){ if (p == NULL)
for (vector&Node*&::iterator it = p-&childs.begin(); it != p-&childs.end(); it++){
FreeTree(*it); }
tree_size++;}int main(){ Input(); vector &string& remain_
string outlook(&Outlook&); string Temperature(&Temperature&); string Humidity(&Humidity&); string Wind(&Wind&); remain_attribute.push_back(outlook); remain_attribute.push_back(Temperature); remain_attribute.push_back(Humidity); remain_attribute.push_back(Wind); vector &vector &string& & remain_ for(unsigned int i = 0; i & state.size(); i++){
remain_state.push_back(state[i]);
} ComputeMapFrom2DVector(); root = BulidDecisionTreeDFS(root,remain_state,remain_attribute); cout&&&the decision tree is :&&& PrintTree(root,0); FreeTree(root); cout&& cout&&&tree_size:&&&tree_size&& return 0;}
输入的训练数据如下
Day Outlook Temperature Humidity Wind PlayTennis1 Sunny Hot High Weak no2 Sunny Hot High Strong no3 Overcast Hot High Weak yes4 Rainy Mild High Weak yes5 Rainy Cool Normal Weak yes6 Rainy Cool Normal Strong no7 Overcast Cool Normal Strong yes8 Sunny Mild High Weak no9 Sunny Cool Normal Weak yes10 Rainy Mild Normal Weak yes11 Sunny Mild Normal Strong yes12 Overcast Mild High Strong yes13 Overcast Hot Normal Weak yes14 Rainy Mild High Strong noend
程序输出决策树如下
可以用图形表示为
有了决策树后,就可以根据气候条件做预测了
例如如果气候数据是{Sunny,Cool,Normal,Strong} ,根据决策树到左侧的yes叶节点,可以判定会去游泳。
另外在编写这个程序时在数据结构的设计上面走了弯路,多叉树的实现有很多方法,本算法采用每个结点的所有孩子用vector保存比较合适,同时注意维护剩余样例和剩余属性信息,建树时横向遍历靠循环属性的值,纵向遍历靠递归调用 ,总体是DFS,树和图的遍历在编程时经常遇到,得熟练掌握。程序有些地方的效率还得优化,有不足的点地方还望大家拍砖。
本文转载自:
欢迎加入我爱机器学习QQ14群:
微信扫一扫,关注我爱机器学习公众号
欢迎加入我爱机器学习QQ14群:
最新文章列表
NIPS 2016 — Day 1 Highlights NIPS 2016 — Day 2 Highlights:...
2018年五月 &(4)
2018年四月 &(21)
2018年三月 &(21)
2018年二月 &(20)
2018年一月 &(21)
2017年十二月 &(19)
2017年十一月 &(20)
2017年十月 &(31)
2017年九月 &(47)
2017年八月 &(58)
2017年七月 &(60)
2017年六月 &(67)
2017年五月 &(66)
2017年四月 &(65)
2017年三月 &(54)
2017年二月 &(48)
2017年一月 &(54)
2016年十二月 &(62)
2016年十一月 &(97)
2016年十月 &(97)
2016年九月 &(124)
2016年八月 &(83)
2016年七月 &(13)
2016年六月 &(10)
2016年五月 &(7)
2016年四月 &(9)
2016年三月 &(7)
2016年二月 &(2)
2016年一月 &(3)
2015年十二月 &(5)
2015年十一月 &(4)
2015年十月 &(2)
2015年九月 &(2)
2015年八月 &(3)
2015年七月 &(6)
2015年六月 &(8)
2015年五月 &(4)
2015年四月 &(1)
2015年三月 &(3)
2015年二月 &(1)
2015年一月 &(2)
2014年十二月 &(4)
2014年十一月 &(2)
2014年十月 &(3)
2014年九月 &(4)
2014年八月 &(22)
2014年七月 &(40)
2014年六月 &(61)
2014年五月 &(63)
2014年四月 &(187)
2014年三月 &(4798)
2014年二月 &(764)
2014年一月 &(330)
2013年十二月 &(145)
2013年十一月 &(126)
2013年十月 &(216)
2013年九月 &(284)
2013年八月 &(327)
2013年七月 &(275)
2013年六月 &(315)
2013年五月 &(228)
2013年四月 &(175)
2013年三月 &(186)
2013年二月 &(118)
2013年一月 &(210)
2012年十二月 &(221)
2012年十一月 &(155)
2012年十月 &(143)
2012年九月 &(98)
2012年八月 &(99)
2012年七月 &(109)
2012年六月 &(75)
2012年五月 &(88)
2012年四月 &(78)
2012年三月 &(78)
2012年二月 &(50)
2012年一月 &(17)
2011年十二月 &(27)
2011年十一月 &(6)
2011年十月 &(11)
2011年九月 &(13)
2011年八月 &(13)
2011年七月 &(19)
2011年六月 &(18)
2011年五月 &(6)
2011年四月 &(12)
2011年三月 &(15)
2011年二月 &(6)
2011年一月 &(9)
2010年十二月 &(6)
2010年十一月 &(11)
2010年十月 &(5)
2010年九月 &(8)
2010年八月 &(5)
2010年七月 &(12)
2010年六月 &(4)
2010年五月 &(7)
2010年四月 &(6)
2010年三月 &(12)
2010年二月 &(7)
2010年一月 &(2)
2009年十二月 &(5)
2009年十一月 &(16)
2009年十月 &(6)
2009年九月 &(7)
2009年八月 &(7)
2009年七月 &(5)
2009年六月 &(6)
2009年五月 &(6)
2009年四月 &(4)
2009年三月 &(7)
2009年二月 &(6)
2009年一月 &(1)
2008年十二月 &(4)
2008年十一月 &(5)
2008年十月 &(1)
2008年八月 &(1)
2008年七月 &(3)
2008年六月 &(3)
2008年五月 &(3)
2008年三月 &(1)
2007年十二月 &(1)
2007年十月 &(1)
2007年八月 &(4)
2007年七月 &(1)决策树与规则引擎人们对决策树的使用决策树常常被应用于数据挖掘之中,是最基础的算法之一,几乎每一个学习过数据挖掘的朋友都知道决策树。但还原决策树本来的用途,它被用于一些决策或决定时,还是比较实用和直观的。其树型结构指导人们进行在面对某个决策时,先关注其中几个最重要的方向,这几方向定下来后,再细分下去。近年来泳道路,思维导向图之类的图形/办公自动化工具慢慢兴起,得到大家的广泛好评,也就是决策树的一个很好的实现。不过在各企业的应用系统中,又决策树又不是很常用,归根到底,决策树是思维导向的内容,是飘忽不定的东西,要形成结构化的内容非常困难。而且市面上大多数的业务系统都是使用关系型,在处理格式数据时非常的方法,但处理树形数据就不一定性。所以也慢慢有部分技术公司开始使用对象型数据库。另一方面,决策树中的决策和判断都比较不规则,很多内容更像是程序员在编程,是一些规则,不是信息,这导致了传统的业务系统处理困难。决策树的组成与程序表现决策树使用一个树型结构来表达业务规则。如下图所示。每一个非叶子结点都代码一个决策/决定,而叶子结点执行动作。而每一条边表达决策的可选定值,可以理解为判断。如下图,A=red或=blue是可选值,而B属于决策结点。但在程序实现中,就不一定是这样的组织方式,一般而言,结点的文字会比线上的文字更容易看清楚,加上各种编程语言都基于上有树型控件的处理,都是以结点的形式表达,很少使用连接线来表来。所以上图在程序中,最常见的表示方法,是把大量信息都集中在结果中。如A=red的结点,就直接写A=red,而不是另外命名,而对于叶子结点,则需要有更详细的地方显示其执行的动作(Action),实现的效果可能如下部分决策表的数据,其实也可以组织为决策树,或使用决策树来表达更加的合适。决策树可以快捷有效地关联多个相关的规则,通过树型的关系,可能非常清晰地查看各个层级的决策逻辑。运算执行时,可以快速遍历各个决策结点,检查是否符合条件,如果符合条件再往下遍历。最终找到适用的条件和适用的操作动作。停车场收费例子使用决策树业务系统的调用方不用填空任何代码,所有的计算都在CKRule中进行了。CKRule中的设置正如上图。
ParkFee _pf = new ParkFee();
_pf.ParkType = cmbParkType.T
_pf.DistType = cmbDistType.T
_pf.CardType = cmbCardType.T
_pf.PartTime = Convert.ToDouble(numericUpDown1.Value);
_pf = new RuleFacade().Exec("费用-停车费计算-决策树", _pf);
txtFee.Text = _pf.Fee + "";要查看规则的设置内容,请使用CKRule编辑器,打开&费用-停车费计算-决策树.ckp&文件,找到决策树和主规则进行查看。相关源代码,Demo下载:http://www.ckrule.com/cn/demo.html
优质网站模板

我要回帖

更多关于 决策树分类算法代码 的文章

 

随机推荐