Caffe 中的 accuracy统计,partial_sort取TOP K 个:
函数原型有:
- partial_sort(beg,mid,end)
- partial_sort(beg,mid,end,comp)
函数作用:
对mid-beg个元素进行排序,也就是说,如果mid-beg等于5,则该函数将有序次序中的最小值元素放在序列中的前5个位置。partial_sort完成之后,从beg到mid(但不包括mid)范围内的元素是有序的,已排序范围内没有元素大于mid之后的元素。未排序元素之间的次序是未指定的。
函数实现原理:
paitical_sort的原理是堆排序!
首先创建一个堆,得到最大值。如果要得到次大值,就将头结点去掉,即调用pop_heap(),此时的头结点就是次大值,可以这样依次得到最大或者最小的几个值!
template< class ExecutionPolicy, class RandomIt, class Compare >
void partial_sort( ExecutionPolicy&& policy, RandomIt first, RandomIt middle, RandomIt last, Compare comp );
堆排序是不稳定的:
比如:3 27 36 27,
如果堆顶3先输出,则,第三层的27(最后一个27)跑到堆顶,然后堆稳定,继续输出堆顶,是刚才那个27,这样说明后面的2先于第二个位置的27输出,不稳定。
在caffe中的取topk
如果有相同的数据,取到的是相同值的最后一个。
举例:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <functional>
int main() {
int AA[10] = {1, 3, 4, 5, 7, 5, 4, 7, 3, 1};
std::vector<int> A(AA, AA + 10);
std::vector<std::pair<int, int> > bottom_data_vector;
for (int k = 0; k < 10; ++k) {
bottom_data_vector.push_back(std::make_pair(AA[k], k));
}
std::partial_sort(
bottom_data_vector.begin(), bottom_data_vector.begin() + 6,
bottom_data_vector.end(), std::greater<std::pair<int, int> >());
//bottom_data_vector.end(), std::greater_equal<std::pair<int, int> >());
for (auto a : bottom_data_vector) {
std::cout << a.first << " " << a.second << std::endl;
}
return 0;
}
结果:
这里是排序的top6, index为8的的数字7,排在最前面,然后是index为4的数字7排在后。
这里用greater 和 greater_equal 结果是一样的。