首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > 云计算 >

mahout源码分析之Decision Forest 三部曲之二BuildForest(三)Step1Mapper(1)

2013-10-08 
mahout源码分析之Decision Forest 三部曲之二BuildForest(3)Step1Mapper(1)Mahout版本:0.7,hadoop版本:1.0

mahout源码分析之Decision Forest 三部曲之二BuildForest(3)Step1Mapper(1)

Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit。

今天到BuildForest的主要Mapper操作,前面也说到BuildForest主要的操作都在Mapper里面,而reducer是没有的。本篇介绍其Mapper,Step1Mapper。首先贴上其仿制代码,如下:


假如我传入的字符串是:[1,1.52101,13.64,4.49,1.10,71.78,0.06,8.75,0.00,0.00,1],那么convert函数首先使用逗号把字符串解析到数组中,然后根据ignored的值把数组中对应的下标的值忽略,再次根据attributes的值进行匹配,如果是Numerical的话直接把值加入vector中,如果是categorical的话就按照values里面的数组进行匹配,比如如果是字符串“3”的话,那么就把其下标值加入vector中,比如上面的数据是1,那么加入字符串中的值就是2。可以通过debug方式查看添加这行输入后vector的值:

mahout源码分析之Decision Forest 三部曲之二BuildForest(三)Step1Mapper(1)

这里可以看到字符串1(这里一定要看做是字符串,而不是数字)的确是被转换为了2了,而且可以看到由于第7、8的值为0,所以这里就没有显示了。

(3)cleanup函数

看cleanup函数,刚开始新建了几个变量、Data、Bagging、TreeID,然后循环调用build函数建立树并输出每棵树,每棵树是由Node类带出的。所以这里的重点是build函数。

Bagging.build函数传入一个随机种子,然后返回一个Node,这个Node就是一个树了,这个Node可以往左、右继续添加Node。继续看这个函数的代码:



下面到了treeBuilder.build方法,这个方法被两个类覆写,分别是DecisionTreeBuilder、DefaultTreeBuilder,这里调用的是DecisionTreeBuilder的build方法。

刚开始是如下的代码:

Split numericalSplit(Data data, int attr) {    double[] values = sortedValues(data, attr);    initCounts(data, values);    computeFrequencies(data, attr, values);    int size = data.size();    double hy = entropy(countAll, size);    double invDataSize = 1.0 / size;    int best = -1;    double bestIg = -1.0;    // try each possible split value    for (int index = 0; index < values.length; index++) {      double ig = hy;      // instance with attribute value < values[index]      size = DataUtils.sum(countLess);      ig -= size * invDataSize * entropy(countLess, size);      // instance with attribute value >= values[index]      size = DataUtils.sum(countAll);      ig -= size * invDataSize * entropy(countAll, size);      if (ig > bestIg) {        bestIg = ig;        best = index;      }      DataUtils.add(countLess, counts[index]);      DataUtils.dec(countAll, counts[index]);    }    if (best == -1) {      throw new IllegalStateException("no best split found !");    }    return new Split(attr, bestIg, values[best]);  }

尼玛,好长呀。晚上回去再看。。。


分享,成长,快乐

转载请注明blog地址:http://blog.csdn.net/fansy1990


热点排行