您的位置:首页 > 其它

结构化随机森林源码分析

2016-07-15 20:21 183 查看
转载:http://blog.csdn.net/wdhxek/article/details/50437556

文章信息与源码来源

<Structured Class-Labels in Random Forests for Semantic Image Labelling> http://www.dsi.unive.it/~srotabul/#publications
Random Tree 类库设计分析

看完作者的源码,对C++的继承与派生,派生,更为深刻的理解。基类指定规则,固定好程序的算法框架或者是逻辑流程,派生类则给出一个具体的细节化的方案,使用什么样的数据类型,具体每一步的执行过程怎么定义;使用模板类给出抽象化的类型,使用virtual函数给出抽象的流程,比如在RT中的split虚函数,作为构树过程中很重要的一环,基类指定了这个函数实现的是对当前节点的数据分流功能,规定函数的输入是当前节点Node,返回值是数据的分流结果,左右数据流的统计信息,当前节点的路径选择函数的参数,但是至于怎样的实现,是在派生类中完成的。
几个具体的RT成员分析:RT在设计过程中更加注重的是构树这个过程以及树本身的物理含义,从数据结构的角度分析:与上一篇文章相似,节点在构树过程中需要保存哪些信息,路径选择函数的参数信息,自己的左右两个孩子节点的链接信息,自己要处理的数据流的头尾信息,如果是leaf节点,自己对应做出的预测是什么?驱动节点生成的结构:程序逻辑上是非leaf节点都要加入队列建立自己的孩子节点。
①建立root节点,使用这棵树的全部训练样本初始化root节点
② 将root 加入到驱动队列vec_0中
③ 检测驱动队列vec_0中有节点存在,逐个为所有的节点选择最优的数据流分割方案,保存最优的路径分割函数的参数,输出分割后的数据流(已经完成了重排序,排序总是一个焊好的功能),如果能并生成自己的左右孩子节点(构建好链接关系),使用分流的数据分别初始化孩子节点,leaf == false;如果当下节点不能生成孩子节点, leaf==true;
④检测vec_0中的所有节点,如果是非leaf节点,将孩子节点全部放入vec_1中,如果是leaf节点,依据该节点的所有数据流,生成节点标签Prediction,但是不加入vec;
⑤ vec_0 vec_1 地位交替,清空已经处理完的那个vec,作为下一层孩子节点加入训练的驱动结构,直到另一个vec也是空,只有leaf==false 的节点才会有子节点,才能把子节点加入到vec中继续对数据进行分流。

RT或者Random Foresrt引入结构化信息

pixel - image patch - feature patch - RF - label patch - label ;
所谓的结构化信息,在这篇文章中指的是上下像素类别的位置信息,原来对于一个点pt(x,y),取出局部patch,计算feature vector ,按照pt对应的类别标签完成训练,训练样本是从Rn -> R ; 机构化的信息,类别不再是real value ,而是一个具有相互制约关系的vector,反应在图像上就是像素与其邻域像素的各自类别的对应关系信息,从feature patch ==> label  变化 feature patch ==》 label patch ;输出的变化带来的问题
① 对于分流评价的指标:information gain 的计算
② 训练过程中随机树的leaf节点的输出怎样计算:从leaf的数据流中找出最好的一个作为标签
③ 使用过程中,一个样本使用RF,每一个RT都会有个标签输出,怎样进行merge model 
④ 一个像素点pt 使用Structured RF 后会产生一个label patch , 相邻位置的像素点pt-0也会产生label patch 来影响当前节点的label,怎样确定!

源码分析

虚函数的使用
模板类的构建与使用
面型对象的多态机制,什么时候 以及为什么使用多态
怎样阅读C++的类库?流程!
基于RT实现自己的解决方案,需要考虑哪些问题?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: