1、SQUARED_LOSS为平方损失函数,CvGBTrees:ABSOLUTE_LOSS为绝对值损失函数,CvGBTrees:HUBER_LOSS为Huber损失函数,CvGBTrees:DEVIANCE_LOSS为偏差损失函数,前三种用于回归问题,后一种用于分类问题weak_count表示GBT的优化迭代次数,对于回归问题来说,weak_count也就是决策树的数量,对于分类问题来说,weak_countK为决策树的数量,K表示类别数量shrinkage表示收缩因子vsubsample_portion表示训练样本占全部样本的比例,为不大于1的正数max_depth表示决策树的最大深度use_s
2、urrogates表示是否使用替代分叉节点,为true,表示使用替代分叉节点CvDTreeParams结构详见我的关于决策树的文章CvGBTrees类的一个构造函数:CvGBTrees:CvGBTrees( const cv:Mat& trainData, int tflag, const cv: responses, const cv: varIdx, sampleIdx, const cv: varType, missingDataMask, CvGBTreesParams _params ) data = 0; /表示样本数据集合 weak = 0; /表示一个弱学习器 default_
3、model_name = my_boost_tree; / orig_response表示样本的响应值,sum_response表示拟合函数Fm(x),sum_response_tmp表示Fm+1(x) orig_response = sum_response = sum_response_tmp = 0; / subsample_train和subsample_test分别表示训练样本集和测试样本集 subsample_train = subsample_test = 0; / missing表示缺失的特征属性,sample_idx表示真正用到的样本的索引 missing = sample_
4、idx = 0; class_labels = 0; /表示类别标签 class_count = 1; /表示类别的数量 delta = 0.0f; /表示Huber损失函数中的参数 clear(); /清除一些全局变量和已有的所有弱学习器 /GBT算法的学习 train(trainData, tflag, responses, varIdx, sampleIdx, varType, missingDataMask, _params, false);GBT算法的学习构建函数:bool train( const CvMat* _train_data, int _tflag, const CvMa
5、t* _responses, const CvMat* _var_idx, const CvMat* _sample_idx, const CvMat* _var_type, const CvMat* _missing_mask, CvGBTreesParams _params, bool /*_update*/ ) /update is not supported /_train_data表示样本数据集合 /_tflag表示样本矩阵的存储格式 /_responses表示样本的响应值 /_var_idx表示要用到的特征属性的索引 /_sample_idx表示要用到的样本的索引 /_var_ty
6、pe表示特征属性的类型,是连续值还是离散值 /_missing_mask表示缺失的特征属性的掩码 /_params表示构建GBT模型的一些必要参数 CvMemStorage* storage = 0; /开辟一块内存空间 params = _params; /构建GBT模型所需的参数 bool is_regression = problem_type(); /表示该GBT模型是否用于回归问题 /清空一些全局变量和已有的所有弱学习器 /* n - count of samples m - count of variables */ int n = _train_data-rows; /n表示训练
7、样本的数量 int m = _train_data-cols; /m表示样本的特征属性的数量 /如果参数_tflag为CV_ROW_SAMPLE,则表示训练样本以行的形式储存的,即_train_data矩阵的每一行为一个样本,那么n和m无需交换;否则如果_tflag为CV_COL_SAMPLE,则表示样本是以列的形式储存的,那么n和m就需要交换。总之,在后面的程序中,n表示训练样本的数量,m表示样本的特征属性的数量 if (_tflag != CV_ROW_SAMPLE) int tmp; CV_SWAP(n,m,tmp); / new_responses表示每个样本的伪响应值,因为构建GBT
8、决策树使用的是伪响应值 CvMat* new_responses = cvCreateMat( n, 1, CV_32F); cvZero(new_responses); /伪响应值初始为零 /实例化CvDTreeTrainData类,并通过该类内的set_data函数设置用于决策树的训练样本数据data data = new CvDTreeTrainData( _train_data, _tflag, new_responses, _var_idx, _sample_idx, _var_type, _missing_mask, _params, true, true ); if (_miss
9、ing_mask) /如果给出了缺失特征属性的掩码 missing = cvCreateMat(_missing_mask-rows, _missing_mask-cols, _missing_mask-type); /初始化missing cvCopy( _missing_mask, missing); /赋值_missing_mask给missing /初始化orig_response矩阵的大小,该变量表示样本的原始真实响应值 orig_response = cvCreateMat( 1, n, CV_32F ); /step表示样本响应值的步长 int step = (_response
10、s-cols _responses-rows) ? 1 :step / CV_ELEM_SIZE(_responses- /根据样本响应值_responses的数据类型,为orig_response赋值 switch (CV_MAT_TYPE(_responses-type) case CV_32FC1: /32位浮点型数据 for (int i=0; idata.fli = _responses-data.fli*step; ; break; case CV_32SC1: /32位整型数据 data.fli = (float) _responses-data.ii*step; default
11、: /其他数据类型报错 CV_Error(CV_StsUnmatchedFormats, Response should be a 32fC1 or 32sC1 vector.); if (!is_regression) /如果构建的GBT模型是用于分类问题 class_count = 0; /表示样本类别的数量 /为每个样本定义一个掩码,用于判断样本的类别 unsigned char * mask = new unsigned charn; memset(mask, 0, n); /掩码清零 / compute the count of different output classes +i
12、) /遍历所有样本,得到类别的数量 /如果当前样本的掩码没有被置1,则说明当前样本属于新的类别 maski) class_count+; /样本类别数加1 /判断当前样本以后的所有样本的响应值是否与当前样本的响应值相同,即是否属于同一类,如果是同一类,则把样本掩码置1,说明它不再是新的类别 for (int j=i; jdata.flj) = int(orig_response-data.fli) maskj = 1; delete mask; /删除mask变量 /初始化样本类别标签,并赋首地址指针 class_labels = cvCreateMat(1, class_count, CV_
13、32S); class_labels-data.i0 = int(orig_response-data.fl0); int j = 1; /表示所有样本类别标签的索引值 for (int i=1; +i) /遍历所有样本,为样本类别标签赋值 int k = 0; /表示已得到的样本类别标签的索引值 /while循环用于判断是否有新的类别标签出现。如果orig_response-data.fli等于class_labels-data.ik,说明当前样本的类别存在于已经得到的类别标签中,则退出while循环,继续for循环;如果kj,说明已经遍历完类别标签 while (int(orig_resp
14、onse-data.fli) - class_labels-data.ik) & (kdata.fli); j+; / inside gbt learning proccess only regression decision trees are built /GBT模型用到的是回归树,所以要把data-is_classifier赋值为false data-is_classifier = false; / preproccessing sample indices /如果_sample_idx不为0,需要预处理那些被指定使用的样本数据 if (_sample_idx) int sample_i
15、dx_len = get_len(_sample_idx); /被指定的要使用的样本数据的数量 switch (CV_MAT_TYPE(_sample_idx-type) /判断样本的数据类型 /32位整型 sample_idx = cvCreateMat( 1, sample_idx_len, CV_32S ); /初始化 /遍历指定的样本数据,赋值 sample_idx_len; sample_idx-data.ii = _sample_idx-data.ii; break; /8位有、无符号位的整型,8位样本数据存储在32位数据中,即每32位数据包括4个8位样本数据,以节省内存空间 ca
16、se CV_8S: case CV_8U: /变量active_samples_count表示8位样本数据需要多少个32位数据 int active_samples_count = 0; +i) /得到active_samples_count值 active_samples_count += int( _sample_idx-data.ptri ); sample_idx = cvCreateMat( 1, active_samples_count, CV_32S ); active_samples_count = 0; /为sample_idx赋值,赋的不是真正的样本值,而是索引值 if (
17、int( _sample_idx-data.ptri ) data.iactive_samples_count+ = i;_sample_idx should be a 32sC1, 8sC1 or 8uC1 vector. /按从小到大的顺序对样本数据进行排序存放,以便后续处理 icvSortFloat(sample_idx-data.fl, sample_idx_len, 0); else /全体样本数据都用于构建GBT模型 sample_idx = cvCreateMat( 1, n, CV_32S );data.ii = i; /赋样本的索引值 /初始化矩阵变量sum_response
18、和sum_response_tmp sum_response = cvCreateMat(class_count, n, CV_32F); sum_response_tmp = cvCreateMat(class_count, n, CV_32F); cvZero(sum_response); /sum_response矩阵清零 /Huber损失函数的参数赋值为0 in the case of a regression problem the initial guess (the zero term in the sum) is set to the mean of all the train
19、ing responses, that is the best constant model / base_value表示F0(x) /如果是回归问题,通过调用find_optimal_value函数得到F0(x),find_optimal_value函数详见后面的介绍 if (is_regression) base_value = find_optimal_value(sample_idx); in the case of a classification problem the initial guess (the zero term in the sum) is set to zero
20、for all the trees sequences /如果是分类问题,F0(x)设置为0 else base_value = 0.0f; current predicition on all training samples is set to be equal to the base_value cvSet( sum_response, cvScalar(base_value) ); /使sum_response等于base_value /初始化弱学习器weak,如果是回归问题,class_count为1,即一个弱学习器就是一个决策树;如果是分类问题,class_count为类别的数量,
21、即一个弱学习器是由class_count个决策树构成 weak = new pCvSeqclass_count; /初始化弱学习器 class_count; storage = cvCreateMemStorage(); weaki = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvDTree*), storage ); storage = 0; / subsample params and data rng = &cv:theRNG(); /实例化RNG类,用于得到随机数,以便随机选取训练样本数据 int samples_count = get_len(sa
22、mple_idx); /得到样本总数 /如果subsample_portion太接近0或太接近1,则subsample_portion重新赋值为1 params.subsample_portion = params.subsample_portion = FLT_EPSILON | 1 - params.subsample_portion = FLT_EPSILON ? params.subsample_portion; /得到训练样本的数量 int train_sample_count = cvFloor(params.subsample_portion * samples_count);
23、/ train_sample_count为0,则样本总数就是训练样本数量 if (train_sample_count = 0) train_sample_count = samples_count; int test_sample_count = samples_count - train_sample_count; /得到测试样本数量 /开辟一个大小为samples_count内存空间,idx_data指向该空间的首地址,该空间的前train_sample_count个单位存放着训练样本所对应的全体样本的索引值,后test_sample_count个单位存放着测试样本所对应的全体样本的索引值 int* idx_data = new intsamples_count; /初始化subsample_train subsample_train = cvCreateMatHeader( 1, train_sample_count, CV_32SC1 ); *subsample_train = cvMat( 1, train_sample_count, CV_32SC1, idx_data ); /初始化subsample_test if (test_sample_count) subsample_test = cvCreateMatHeader( 1, test_sam
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1