关于管理学中决策树的问题怎么做?

发布网友

我来回答

6个回答

懂视网

这次给大家带来javascript怎样做出决策树,javascript做出决策树的注意事项有哪些,下面就是实战案例,一起来看一下。

决策树算法代码实现

1.准备测试数据

这里我假设公司有个小姐姐相亲见面为例
得到以下是已经见面或被淘汰了的数据(部分数据使用mock.js来生成的):

var data =
 [
  { "姓名": "余夏", "年龄": 29, "长相": "帅", "体型": "瘦", "收入": "高", 见面: "见" },
  { "姓名": "豆豆", "年龄": 25, "长相": "帅", "体型": "瘦", "收入": "高", 见面: "见" },
  { "姓名": "帅常荣", "年龄": 26, "长相": "帅", "体型": "胖", "收入": "高", 见面: "见" },
  { "姓名": "王涛", "年龄": 22, "长相": "帅", "体型": "瘦", "收入": "高", 见面: "见" },
  { "姓名": "李东", "年龄": 23, "长相": "帅", "体型": "瘦", "收入": "高", 见面: "见" },
  { "姓名": "王五五", "年龄": 23, "长相": "帅", "体型": "瘦", "收入": "低", 见面: "见" },
  { "姓名": "王小涛", "年龄": 22, "长相": "帅", "体型": "瘦", "收入": "低", 见面: "见" },
  { "姓名": "李缤", "年龄": 21, "长相": "帅", "体型": "胖", "收入": "高", 见面: "见" },
  { "姓名": "刘明", "年龄": 21, "长相": "帅", "体型": "胖", "收入": "低", 见面: "不见" },
  { "姓名": "红鹤", "年龄": 21, "长相": "不帅", "体型": "胖", "收入": "高", 见面: "不见" },
  { "姓名": "李理", "年龄": 32, "长相": "帅", "体型": "瘦", "收入": "高", 见面: "不见" },
  { "姓名": "周州", "年龄": 31, "长相": "帅", "体型": "瘦", "收入": "高", 见面: "不见" },
  { "姓名": "李乐", "年龄": 27, "长相": "不帅", "体型": "胖", "收入": "高", 见面: "不见" },
  { "姓名": "韩明", "年龄": 24, "长相": "不帅", "体型": "瘦", "收入": "高", 见面: "不见" },
  { "姓名": "小吕", "年龄": 28, "长相": "帅", "体型": "瘦", "收入": "低", 见面: "不见" },
  { "姓名": "李四", "年龄": 25, "长相": "帅", "体型": "瘦", "收入": "低", 见面: "不见" },
  { "姓名": "王鹏", "年龄": 30, "长相": "帅", "体型": "瘦", "收入": "低", 见面: "不见" },
 ];

2.搭建决策树基本函数

代码:

function DecisionTree(config) { if (typeof config == "object" && !Array.isArray(config)) this.training(config);
};
DecisionTree.prototype = { //分割函数
 _predicates: {}, //统计属性值在数据集中的次数
 countUniqueValues(items, attr) {}, //获取对象中值最大的Key 假设 counter={a:9,b:2} 得到 "a" 
 getMaxKey(counter) {}, //寻找最频繁的特定属性值
 mostFrequentValue(items, attr) {}, //根据属性切割数据集 
 split(items, attr, predicate, pivot) {}, //计算熵
 entropy(items, attr) {}, //生成决策树
 buildDecisionTree(config) {}, //初始化生成决策树
 training(config) {}, //预测 测试
 predict(data) {},
};var decisionTree = new DecisionTree();

3.实现函数功能

由于部分函数过于简单我就不进行讲解了
可前往 JS简单实现决策树(ID3算法)_demo.html查看完整代码
里面包含注释,与每个函数的测试方法

这里的话我主要讲解下:计算熵的函数、生成决策树函数(信息增益)、与预测函数的实现

在 ID3算法 wiki 中解释了计算熵与信息增益的公式

3.1.计算熵(entropy)函数

我们可以知道计算H(S)(也就是熵)需要得到 p(x)=x/总数量 然后进行计算累加就行了
代码:

//......略//统计属性值在数据集中的次数countUniqueValues(items, attr) { var counter = {}; // 获取不同的结果值 与出现次数
 for (var i of items) { if (!counter[i[attr]]) counter[i[attr]] = 0;
 counter[i[attr]] += 1;
 } return counter;
},//......略//计算熵entropy(items, attr) { var counter = this.countUniqueValues(items, attr); //计算值的出现数
 var p, entropy = 0; //H(S)=entropy=∑(P(Xi)(log2(P(Xi))))
 for (var i in counter) {
 p = counter[i] / items.length; //P(Xi)概率值
 entropy += -p * Math.log2(p); //entropy+=-(P(Xi)(log2(P(Xi))))
 } return entropy;
},//......略var decisionTree = new DecisionTree();console.log("函数 countUniqueValues 测试:");console.log(" 长相", decisionTree.countUniqueValues(data, "长相")); //测试console.log(" 年龄", decisionTree.countUniqueValues(data, "年龄")); //测试console.log(" 收入", decisionTree.countUniqueValues(data, "收入")); //测试console.log("函数 entropy 测试:");console.log(" 长相", decisionTree.entropy(data, "长相")); //测试console.log(" 年龄", decisionTree.entropy(data, "年龄")); //测试console.log(" 收入", decisionTree.entropy(data, "收入")); //测试

3.2.信息增益

公式

根据公式我们知道要得到信息增益的值需要得到:

H(S) 训练集熵

p(t)分支元素的占比

H(t)分支数据集的熵

其中t我们就先分 match(合适的)和on match(不合适),所以H(t):

H(match) 分割后合适的数据集的熵

H(on match) 分割后不合适的数据集的熵

所以信息增益G=H(S)-(p(match)H(match)+p(on match)H(on match))
因为p(match)=match数量/数据集总项数量
信息增益G=H(S)-((match数量)xH(match)+(on match数量)xH(on match))/数据集总项数量

//......略buildDecisionTree(config){ var trainingSet = config.trainingSet;//训练集 
 var categoryAttr = config.categoryAttr;//用于区分的类别属性
 //......略
 //初始计算 训练集的熵
 var initialEntropy = this.entropy(trainingSet, categoryAttr);//<===H(S)
 //......略
 var alreadyChecked = [];//标识已经计算过了
 var bestSplit = { gain: 0 };//储存当前最佳的分割节点数据信息
 //遍历数据集
 for (var item of trainingSet) { // 遍历项中的所有属性
 for (var attr in item) {  //跳过区分属性与忽略属性
  if ((attr == categoryAttr) || (ignoredAttributes.indexOf(attr) >= 0)) continue;  var pivot = item[attr];// 当前属性的值 
  var predicateName = ((typeof pivot == 'number') ? '>=' : '=='); //根据数据类型选择判断条件
  var attrPredPivot = attr + predicateName + pivot;  if (alreadyChecked.indexOf(attrPredPivot) >= 0) continue;//已经计算过则跳过
  alreadyChecked.push(attrPredPivot);//记录
  var predicate = this._predicates[predicateName];//匹配分割方式
  var currSplit = this.split(trainingSet, attr, predicate, pivot);  var matchEntropy = this.entropy(currSplit.match, categoryAttr);// H(match) 计算分割后合适的数据集的熵
  var notMatchEntropy = this.entropy(currSplit.notMatch, categoryAttr);// H(on match) 计算分割后不合适的数据集的熵
  //计算信息增益: 
  // IG(A,S)=H(S)-(∑P(t)H(t))) 
  // t为的子集match(匹配),on match(不匹配)
  // P(match)=match的长度/数据集的长度
  // P(on match)=on match的长度/数据集的长度
  var iGain = initialEntropy - ((matchEntropy * currSplit.match.length
   + notMatchEntropy * currSplit.notMatch.length) / trainingSet.length);  //不断匹配最佳增益值对应的节点信息
  if (iGain > bestSplit.gain) {   //......略
  }
 }
 } 
 //......递归计算分支}

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

相关阅读:

如何使用canvas来制作好用的涂鸦画板

如何使用s-xlsx实现Excel 文件导入和导出(下)

热心网友

决策树法用于风险性决策,就是在比较和选择活动方案时未来情况不止一种,管理者无法确定那种情况将发生,但是知道每种情况发生的概率。


 决策树法是用树状图来描述各种方案在不同情况(或自然状态)下的收益,据此计算每种方案的期望收益从而作出决策的方法。


举例:

某企业为了扩大某产品的生产,拟建设新厂。据市场预测,产品销路好的概率为0.7,销路差的概率为0. 30有三种方案可供企业选择:

    方案1、新建大厂,需投资300万元。据初步估计,销路好时,每年可获利100万元;销路差时,每年亏损20万元。服务期为10年。

方案2、新建小厂,需投资140万元。销路好时,每年可获利40万元;销路差时,每年仍可获利30万元。服务期为10年。    

方案3 、 先建小厂,三年后销路好时再扩建,需追加投资200万元,服务期为7年,估计每年获利95万元。


问哪种方案最好?

决策树中,

矩形结点称为决策点,从决策点引出的若干条树枝枝表示若干种方案,称为方案枝。圆形结点称为状态点,从状态点引出的若干条树枝表示若干种自然状态,称为状态枝。图中有两种自然状态:销路好和销路差,自然状态后面的数字表示该种自然状态出现的概率。位于状态枝末端的是各种方案在不同自然状态下的收益或损失。据此可以算出各种方案的期望收益。


决策树如下图:


方案1的期望收益为:

[0.7×100+0.3×(-20)]×10 - 300=340(万元)

方案2的期望收益为:

(0.7×40+0.3×30) - 140= 230(万元)

    至于方案3,由于结点④的期望收益465(= 95×7- 200)万元,大于结点⑤的期望收益280(= 40×7)万元,所以销路好时,扩建比不扩建好。

方案3(结点③)的期望收益为:(0.7×40×3+0.7 X465 +0.3×30×10) - 140= 359.5(万元)


    计算结果表明,在三种方案中,方案3最好

在复杂的决策树中还会将利率(货币的时间价值因素)考虑进去,简单建模做出决策树以后计算收益或损失即可。

热心网友

1、决策树(decision tree)一般都是自上而下的来生成的。每个决策或事件(即自然状态)都可能引出两个或多个事件,导致不同的结果,把这种决策分支画成图形很像一棵树的枝干,故称决策树。决策树就是将决策过程各个阶段之间的结构绘制成一张箭线图,我们可以用下图来表示。

2、选择分割的方法有好几种,但是目的都是一致的:对目标类尝试进行最佳的分割。从根到叶子节点都有一条路径,这条路径就是一条“规则”。决策树可以是二叉的,也可以是多叉的。对每个节点的衡量:通过该节点的记录数;如果是叶子节点的话,分类的路径;对叶子节点正确分类的比例;有些规则的效果可以比其他的一些规则要好。

3、决策树的构成有四个要素:(1)决策结点;(2)方案枝;(3)状态结点;(4)概率枝。如图所示:

扩展资料:

决策树一般由方块结点、圆形结点、方案枝、概率枝等组成,方块结点称为决策结点,由结点引出若干条细支,每条细支代表一个方案,称为方案枝;圆形结点称为状态结点,由状态结点引出若干条细支,表示不同的自然状态,称为概率枝。每条概率枝代表一种自然状态。在每条细枝上标明客观状态的内容和其出现概率。在概率枝的最末稍标明该方案在该自然状态下所达到的结果(收益值或损失值)。这样树形图由左向右,由简到繁展开,组成一个树状网络图。

热心网友

你画一棵树,每个树叶,都让人的专长代替。枝是专项,杈上坐着领导,你就明白了。

热心网友

计算期望收益值来作为判断的依据

热心网友

没有具体例题不好说~

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com