从大样本中均匀提取子集的算法

来源:互联网 发布:华为 java工程师 编辑:程序博客网 时间:2024/05/01 12:50

转自:从大样本中均匀提取子集的算法,保存在此以学习。

在一些计算中,我们可能会遇到这样的问题:
    我们可能会拿到一个数据量很大的样本,但是算法的时间对数据量很敏感而精度不太敏感,过多的数据会严重降低算法的效率,此时我们可以从这个大样本中取出一部分数据,代入算法进行运算.比如在计算机视觉中,如果摄像机只做旋转运动和变焦,要从两幅视图中的特征点以及它们之间的单应矩阵H,非线性优化摄像机的内参数矩阵K和两视图之间的相对旋转dR,必然会用到LM(Levenberg-Marquardt)优化.而LM优化对于大量的点来说,会变得很慢.这个时候,我们可以考虑从大量的特征点中均匀地选取几十个点作为参数传给LM优化,以提高运算效率.同时,均匀地采样也可以在一定程度上表征这个大样本,不会使精度明显下降.

    仍然以LM优化为例,假设我们在这两幅图像中找到了N个匹配好的特征点对,它们构成集合S,现在我们要从这N个点对中均匀提取m个点对,m<N,构成子集S_sub.

[思路]:

    首先将这N个点对均匀分割成m份,得到每一份之间的间隔dx,然后从第一个点对开始取,每隔一个步长dx就取一个点对,直到取得m个点对.思路很简单,但是如果dx不是整数,可能会带来一些麻烦,需要进行一些其他处理.

[算法]:

    1. 计算步长: dx = N/m;

    2. 计算将被采样的第n个点对在大样本中的位置: index(n) = n*dx = n*N/m, (0<=n<m).此时得到的index可能不是整数,所以做四舍五入,得到: index(n) = int(n*dx + 0.5), (0<=n<m);

    3. 提取子集: {S_sub(n) | S_sub(n) = S(index(n)), (0<=n<m)}.

[讨论]:

    算法其实很简单,但是有一个问题值得讨论.

    问题: 计算index时用到了四舍五入,这样会不会导致子集中取到重复的样本?

    我们通过计算来分析,什么时候才可能取到重复的样本.因为做四舍五入,只有当两个数之差小于等于0.9的时候才可能被舍入为同一个数,所以,在做四舍五入前,只有当下列不等式成立时,index重复:

    0 <= index(n+1) - index(n) <= 0.9

因为: index(n+1) - index(n) = (n+1)*dx - n*dx = dx = N/m,

所以当 0 <= N/m <= 0.9 成立时,index重复.

又因为: m<N, 所以, N/m > 1, 故上面的不等式永远不成立,所以这个算法永远不会出现index重复的情况.

 

[程序]:

void Sample(const vector< point2D<double> > &x1, const vector< point2D<double> > &x2,

            vector< point2D<double> > &x1_sample, vector< point2D<double> > &x1_sample,

            int sampleLen)

{

    x1_sample.clear();

    x2_sample.clear();

    int pointNum = x1.size();
    if (pointNum>sampleLen)
    {
        float dx = pointNum/(float)sampleLen;
        int nIndex = 0;
        for (int i=0; i<sampleLen; i++)
        {
            nIndex = int(i*dx + 0.5);
            x1_sample.push_back(x1[nIndex]);
            x2_sample.push_back(x2[nIndex]);
        }

    }
    else
    {
        x1_sample = x1;
        x2_sample = x2;
    }

    return;

}

 

    在实际应用中,我开始的时候使用全部300多个特征点对,LM优化算法耗时大于5秒.改用下均匀采样之后,将点对缩减到50个左右,LM耗时约1秒.当我把采样点降到20个时,基本可以达到实时,而计算结果并没有明显变差.可见从大样本中均匀提取小样本子集,在不影响精度的前提下,可以极大地提高运算效率.

0 0
原创粉丝点击