c++ - 在 C++ 中将整数数组转换为位集表示的最佳方法?

标签 c++ machine-learning data-mining bitset bitvector

我见过一些关于该主题的类似问题,但我对编程相对较新,无法理解解决方案中使用的某些语言。

假设我有 2 个有限集 A,B 表示为数组,其中:

int A[2] = {1, 3};
int B[2] = {1, 2};

我想要代表 A 和 B 的位集(列 vector V)。

    v1 v2
(1) 1, 1
(2) 0, 1
(3) 1, 0

这样我就可以轻松地对行 (k) 求和并获得值 k 在所有集合 A_1 到 A_n 中出现的次数。

我正在寻找最快的方法来做到这一点。我可以粗略地想象我如何首先初始化一个位 vector 矩阵(将每个值设置为0),然后循环遍历每个集合A_i,将矩阵的相应条目设置为1,但这个解决方案似乎没用,因为我仍然必须循环遍历每个集合 A_i 中的每个元素。

我试图避免遍历每个集合的每个元素,而是通过对位行求和来获取出现次数,但我不知道如何以高效的方式优雅地进行此转换。

动机:我正在尝试实现 ID3 决策树算法,并尝试使用位 vector 来计算标签的比例以进行熵计算。

最佳答案

演示文稿中的关键是,您不明确地形成集合只是为了从中构建位集,而是构造位集而不是集合。

简而言之,你已经

std::vector<double> unsortedDataInRow(numDataInRow) = ...;
std::vector<int> labels(numLabels) = ...;

然后你就得到了

std::vector<unsigned> sortedIndices = getSortedIndices(unsortedDataInRow);

这样unsortedDataInRow[sortedIndices[i]]已排序。但不是 build std::vector<int> sortedLabels从他们那里,你可以填写一个

std::vector<std::vector<bool>> bitsets(numLabels, std::vector<bool>(numDataInRow));
// this gets zero-initialized

以这样的方式bitsets[label][i] == (unsortedLabels[sortedIndices[i]] == label) :

for (auto sortedIndex : sortedIndices)
  bitsets[unsortedLabels[sortedIndices]][sortedIndex] = true;

这有助于提高性能,因为您(大概)在 InfoGain 中进行标签计数(即确定 P(c) ,然后通过 popcnt 比通过 counts[labels[i]]++; 更快地完成)比您执行上述操作的频率要高得多。

请注意,这只是一个草图 - std::vector<bool>没有内置的方法来获取 popcnt 。你必须希望你的编译器能够识别手写的。或者,使用 boost::dynamic_bitset ,或其他一些库,或手写的库。

关于c++ - 在 C++ 中将整数数组转换为位集表示的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59880550/

相关文章:

preprocessor - 用于预处理的良好数据集

machine-learning - 为什么一种热门编码可以提高机器学习性能?

c++ - 用于查找相似的连续类型名称的模板元程序

c++ - 间接实例化一个指针

python - Scikit Learn OneHotEncoder 拟合和变换错误 : ValueError: X has different shape than during fitting

python - 使用 GridsearchCV 调整参数未给出最佳结果

c++ - 关键点大小和倍频程之间的 OpenCV 连接

c++ - 将 ascii 'maze' 读入二维数组

matlab - 在 Matlab 中对序列进行分类的隐马尔可夫模型

python - 检查一个大文件 .csv 并替换,并将其分类在一列中