发布网友 发布时间:2022-04-24 14:01
共6个回答
懂视网 时间:2022-04-23 11:35
这次给大家带来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 文件导入和导出(下)
热心网友 时间:2022-04-23 08:43
决策树法用于风险性决策,就是在比较和选择活动方案时未来情况不止一种,管理者无法确定那种情况将发生,但是知道每种情况发生的概率。
决策树法是用树状图来描述各种方案在不同情况(或自然状态)下的收益,据此计算每种方案的期望收益从而作出决策的方法。
举例:
某企业为了扩大某产品的生产,拟建设新厂。据市场预测,产品销路好的概率为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最好
在复杂的决策树中还会将利率(货币的时间价值因素)考虑进去,简单建模做出决策树以后计算收益或损失即可。
热心网友 时间:2022-04-23 10:01
1、决策树(decision tree)一般都是自上而下的来生成的。每个决策或事件(即自然状态)都可能引出两个或多个事件,导致不同的结果,把这种决策分支画成图形很像一棵树的枝干,故称决策树。决策树就是将决策过程各个阶段之间的结构绘制成一张箭线图,我们可以用下图来表示。
2、选择分割的方法有好几种,但是目的都是一致的:对目标类尝试进行最佳的分割。从根到叶子节点都有一条路径,这条路径就是一条“规则”。决策树可以是二叉的,也可以是多叉的。对每个节点的衡量:通过该节点的记录数;如果是叶子节点的话,分类的路径;对叶子节点正确分类的比例;有些规则的效果可以比其他的一些规则要好。
3、决策树的构成有四个要素:(1)决策结点;(2)方案枝;(3)状态结点;(4)概率枝。如图所示:
扩展资料:
决策树一般由方块结点、圆形结点、方案枝、概率枝等组成,方块结点称为决策结点,由结点引出若干条细支,每条细支代表一个方案,称为方案枝;圆形结点称为状态结点,由状态结点引出若干条细支,表示不同的自然状态,称为概率枝。每条概率枝代表一种自然状态。在每条细枝上标明客观状态的内容和其出现概率。在概率枝的最末稍标明该方案在该自然状态下所达到的结果(收益值或损失值)。这样树形图由左向右,由简到繁展开,组成一个树状网络图。
热心网友 时间:2022-04-23 11:36
你画一棵树,每个树叶,都让人的专长代替。枝是专项,杈上坐着领导,你就明白了。热心网友 时间:2022-04-23 13:27
计算期望收益值来作为判断的依据热心网友 时间:2022-04-23 15:35
没有具体例题不好说~