cvTrimWeights函数详细解读

原创 2015年07月10日 15:35:06

cvTrimWeights的源码在opencv的cvboost.cpp文件之中,具体内容和部分注释如下所

/*
 *cvTrimWeights
 *作用:对小于一定阈值的权重剔除,因为权重较小的样本对训练结果影响很小,剔除后,这样在训练样本时可以缩短训练时间
 */
CV_BOOST_IMPL
CvMat* cvTrimWeights( CvMat* weights,//训练样本的权重矩阵
                      CvMat* idx,    //训练样本的索引序列矩阵
                      float factor ) //剔除小权重的样本后剩余样本的比例,根据这个参数来计算需要剔除较小样本的阈值
{
    CvMat* ptr = 0;

    CV_FUNCNAME( "cvTrimWeights" );
    __BEGIN__;
    int i, index, num;
    float sum_weights;
    uchar* wdata;
    size_t wstep;
    int wnum;
    float threshold;
    int count;
    float* sorted_weights;

    CV_ASSERT( CV_MAT_TYPE( weights->type ) == CV_32FC1 );

    ptr = idx;
    sorted_weights = NULL;

    if( factor > 0.0F && factor < 1.0F )
    {
        size_t data_size;

        CV_MAT2VEC( *weights, wdata, wstep, wnum );
        num = ( idx == NULL ) ? wnum : MAX( idx->rows, idx->cols );

        data_size = num * sizeof( *sorted_weights );
        sorted_weights = (float*) cvAlloc( data_size );
        memset( sorted_weights, 0, data_size );

        sum_weights = 0.0F;
        for( i = 0; i < num; i++ )
        {
            index = icvGetIdxAt( idx, i );//将矩阵idx中第i个位置上的样本序列取出
            sorted_weights[i] = *((float*) (wdata + index * wstep));//取出idx第i个位置上的权重
            sum_weights += sorted_weights[i];//样本的权重和
        }

        icvSort_32f( sorted_weights, num, 0 );//对样本排序

        sum_weights *= (1.0F - factor);      //根据训练样本总的权重和factor来计算需要剔除的小权重训练样本的权重和

        i = -1;
        do { sum_weights -= sorted_weights[++i]; }//对排序后的样本从最小的小权重的样本开始减去,直到while中条件结束
        while( sum_weights > 0.0F && i < (num - 1) );

        threshold = sorted_weights[i];      
       /*跳出do-while循环后,把没有被剔除权重的样本中,最小权重的那个样本的权重赋给threshold。对外表现为:凡是样本的权重小于
        这个阈值,就直接剔除*/

        while( i > 0 && sorted_weights[i-1] == threshold ) i--;//剔除小权重的样本后,再对原来剔除的那部分中等于阈值的样本捡回来,挺人性化的哈

        if( i > 0 || ( idx != NULL && CV_MAT_TYPE( idx->type ) != CV_32FC1 ) )
        {
            CV_CALL( ptr = cvCreateMat( 1, num - i, CV_32FC1 ) );
            count = 0;
            for( i = 0; i < num; i++ )
            {
                index = icvGetIdxAt( idx, i );
                if( *((float*) (wdata + index * wstep)) >= threshold )//只对阈值>threshold的权重操作
                {
                    CV_MAT_ELEM( *ptr, float, 0, count ) = (float) index;
                    count++;
                }
            }

            assert( count == ptr->cols );
        }
        cvFree( &sorted_weights );
    }

    __END__;

    return ptr;     //只返回权重大于阈值的样本
}




相关文章推荐

opencv学习笔记(十五)利用cvSetImageROI()对图像部分区域进行操作

这是一个对图像部分区域进行操作的程序

opencv knn,svm,ann,人脸识别类的使用总结

1、 knn 需要引用的头文件  #include 用到的opencv类:KNearest   *knn;          得到训练数据和相应的标记:trainData,将每一个训练矩阵归一化为...

详细解读Jquery中Ajax的各个函数

一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表(是可选的,也可以将要传的参数写在url里面),callback为请求成功后的回调函数,...

select函数详细解读

在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核:       •我们所关心的文件描述符       •对每个描述符,我们所关心的...

memset函数详细解读

需要的头文件    or 编辑本段函数原型   void *memset(void *s, int ch, unsigned n);memest原型 (please type "man mem...
  • rxm1989
  • rxm1989
  • 2014年09月25日 13:24
  • 283

详细解读jQuery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON()

引言:对于jQuery各Ajax函数只会简单的使用几个,至于详细使用方法一直也不是很了解,今天转载了别人的一篇日志,希望能和大家相互学习。 一,$.get(url,[data],[callback]...

详细解读SQL Server 函数

一旦成功地从表中检索出数据,就需要进一步操纵这些数据,以获得有用或有意义的结果。这些要求包括:执行计算与数学运算、转换数据、解析数值、组合值和聚合一个范围内的值等。 下表给出了T-SQL函数的类别和...
  • pepcod
  • pepcod
  • 2013年01月21日 18:10
  • 656

详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON()

一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表,callback为请求成功后的回调函数,该函数接受两个参数,第一个为服务器返回的数据,...

详细解读Jquery各Ajax函数:

详细解读Jquery各Ajax函数: $.get(),$.post(),$.ajax(),$.getJSON() 详细解读Jquery各Ajax函数: $.get(),$.post(),$...

sprintf函数详细介绍

  • 2017年02月21日 13:47
  • 179KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cvTrimWeights函数详细解读
举报原因:
原因补充:

(最多只允许输入30个字)