Shark源码分析(十一):随机森林算法

2024-04-27 00:48

本文主要是介绍Shark源码分析(十一):随机森林算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Shark源码分析(十一):随机森林算法

关于这个算法的介绍,可以参看我之前关于集成算法的博客。因为Shark中关于决策树算法只实现了CART算法,所以随机森林算法中也只包含了CART算法。如果你已经看过了我之前写的关于CART算法源码分析的博客,看到后面就会发现它与随机森林算法的代码其实差不多。只是在选择最优划分属性时多了一个随机选取候选集的过程。这也是随机森林算法的一大特点。因为CART算法既可以用于分类任务中也可以用于回归任务中,所以基于CART算法的随机森林也能用于这两个任务。这里我们只介绍其用于分类任务中的代码。

MeanModel类

这个类应该算是集成算法的基类,表示如何将多个基学习器的输出结果综合起来。该类定义在<include/shark/Models/MeanModel.h>中。

template<class ModelType> // ModelType表示基学习器的类型
class MeanModel : public AbstractModel<typename ModelType::InputType, typename ModelType::OutputType>
{
private:typedef AbstractModel<typename ModelType::InputType, typename ModelType::OutputType> base_type;
public:MeanModel():m_weightSum(0){}std::string name() const{ return "MeanModel"; }using base_type::eval;// 输出集成学习器的结果,与决策树输出的结果一样,是对于每一个类别的所属概率void eval(typename base_type::BatchInputType const& patterns, typename base_type::BatchOutputType& outputs)const{m_models[0].eval(patterns,outputs);outputs *=m_weight[0];for(std::size_t i = 1; i != m_models.size(); i++) noalias(outputs) += m_weight[i] * m_models[i](patterns);outputs /= m_weightSum;}void eval(typename base_type::BatchInputType const& patterns, typename base_type::BatchOutputType& outputs, State& state)const{eval(patterns,outputs);}RealVector parameterVector() const {return RealVector();}void setParameterVector(const RealVector& param) {SHARK_ASSERT(param.size() == 0);}void read(InArchive& archive){archive >> m_models;archive >> m_weight;archive >> m_weightSum;}void write(OutArchive& archive)const{archive << m_models;archive << m_weight;archive << m_weightSum;}void clearModels(){m_models.clear();m_weight.clear();m_weightSum = 0.0;}// 增加一个基学习器void addModel(ModelType const& model, double weight = 1.0){SHARK_CHECK(weight > 0, "Weights must be positive");m_models.push_back(model);m_weight.push_back(weight);m_weightSum+=weight;}double const& weight(std::size_t i)const{return m_weight[i];}void setWeight(std::size_t i, double newWeight){m_weightSum=newWeight - m_weight[i];m_weight[i] = newWeight;}std::size_t numberOfModels()const{return m_models.size();}protected:// 表示所有的基学习器,这里要求它们的类型是一致的,但是在实际的应用中,其实是可以不一样的std::vector<ModelType> m_models;// 表示各个基学习器的权重std::vector<double> m_weight;// 所有权重之和double m_weightSum;
};

RFClassifier类

该类是用来表示一个随机森林,定义在<include/shark/Models/Trees/RFClassifier.h>中。

class RFClassifier : public MeanModel<CARTClassifier<RealVector> >
{
public:std::string name() const{ return "RFClassifier"; }// 计算模型的平均OOB误差,将基学习器的OOB误差累加起来,再除以基学习器的个数void computeOOBerror(){std::size_t n_trees = numberOfModels();m_OOBerror = 0;for(std::size_t j=0;j!=n_trees;++j){m_OOBerror += m_models[j].OOBerror();}m_OOBerror /= n_trees;}// 综合基学习器每一维的重要程度,得到集成学习器每一维的重要程度void computeFeatureImportances(){m_featureImportances.resize(m_inputDimension);std::size_t n_trees = numberOfModels();for(std::size_t i=0;i!=m_inputDimension;++i){m_featureImportances[i] = 0;for(std::size_t j=0;j!=n_trees;++j){m_featureImportances[i] += m_models[j].featureImportances()[i];}m_featureImportances[i] /= n_trees;}}double const OOBerror() const {return m_OOBerror;}RealVector const& featureImportances() const {return m_featureImportances;}// 统计对于所有的基学习器,每一个特征在选择最优划分属性时被使用的次数UIntVector countAttributes() const {std::size_t n = m_models.size();if(!n) return UIntVector();UIntVector r = m_models[0].countAttributes();for(std::size_t i=1; i&l

这篇关于Shark源码分析(十一):随机森林算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/939114

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2