编写C++代码调用nmslib找k近邻

conan nmslib/2.1.1库:https://conan.io/center/nmslib nmslib/2.1.1 github:https://github.com/nmslib/nmslib需求: 我有一段python代码: def knn_nmslib(feats, k, space='cosinesimil'): index = nmslib.init(method='hnsw', space=space) # 空间名是cosinesimil,搜索方法是hnsw index.addDataPointBatch(feats) # 添加数据 index.createIndex({'post': 2}, print_progress=False) # 创建索引,不需要打印过程 neighbours = index.knnQueryBatch(feats, k=k, num_threads=multiprocessing.cpu_count()) # 查询k近邻,多进程执行 return neighbours 现在需要转为C++的代码,我尝试进行了,但是不对,下面是我的错误C++代码: //c++ void knn_nmslib(const std::vector<std::vector<float>>& feats, std::vector<std::pair<std::vector<int>, std::vector<float>>>& neighbours, int k) { // 初始化空间 std::shared_ptr<similarity::Space<float>> space = std::make_shared<similarity::CosineSimilarity>(); // 初始化索引 std::shared_ptr<Index<float>> index = std::make_shared<Index<float>>(space, "hnsw"); // 设置索引参数 index->SetQueryTimeParams(Params()); // 添加数据 for (auto& feat : feats) { index->AddDataPoint(feat); } // 创建索引 index->CreateIndex(Params()); // 查询k近邻 for (auto& feat : feats) { std::vector<std::pair<int, float>> result; index->SearchKnn(feat, k, result); std::vector<int> idx; std::vector<float> dist; for (auto& r : result) { idx.push_back(r.first); dist.push_back(r.second); } neighbours.push_back(std::make_pair(idx, dist)); } }即我拥有n个特征向量,我想用nmslib求每个特征向量的k个近邻是谁。此外,如果不用此库,这个C++代码可以这样写是没错的: float findCosineSimilarity(std::vector<float> source_representation, std::vector<float> test_representation) { float a = 0.0f; float b = 0.0f; float c = 0.0f; for (int i = 0; i < source_representation.size(); i++) { a += source_representation[i] * test_representation[i]; b += source_representation[i] * source_representation[i]; c += test_representation[i] * test_representation[i]; } return (a / (std::sqrt(b) * std::sqrt(c) + 0.000001f)); }float findCosineDistance(std::vector<float> source_representation, std::vector<float> test_representation) { return 1.0f - findCosineSimilarity(std::move(source_representation), std::move(test_representation)); } void knn_nmslib(std::vector<std::vector<float>> feats, std::vector<std::pair<std::vector<int>, std::vector<float>>> &neighbours, int k) { std::vector<std::vector<int>> indexs; std::vector<std::vector<float>> dist; //计算feats中两两距离 std::map<std::pair<int, int>, float> distance22; for (int i = 0; i < feats.size(); i++) { for (int j = i + 1; j < feats.size(); j++) { distance22[std::make_pair(i, j)] = findCosineDistance(feats[i], feats[j]); distance22[std::make_pair(j, i)] = distance22[std::make_pair(i, j)]; } } //相同index 作为pair给距离0.0f for (int i = 0; i < feats.size(); i++) distance22[std::make_pair(i, i)] = 0.0f; //为feats中每个特征,选择距离最近的k个特征,包含自己(距离是0) for (int i = 0; i < feats.size(); i++) { std::vector<std::pair<int, float>> distance2; for (int j = 0; j < feats.size(); j++) { distance2.emplace_back(j, distance22[std::make_pair(i, j)]); } //以最小的时间复杂度找到distance2中最小的k个元素 std::partial_sort(distance2.begin(), distance2.begin() + k, distance2.end(), [](const std::pair<int, float> &a, const std::pair<int, float> &b) { return a.second < b.second; }); std::vector<int> index; std::vector<float> dis; for (int j = 0; j < k; j++) { index.push_back(distance2[j].first); dis.push_back(distance2[j].second); } indexs.push_back(index); dist.push_back(dis); } for (int i = 0; i < indexs.size(); i++) { neighbours.emplace_back(indexs[i], dist[i]); } }

AI搜索工具北京市

¥500 查看详情

js调用android需求外包介绍
本页是猪八戒网为您找到的js调用android需求外包信息,包括威客参与数、剩余参与机会及截止日期等,为个人及公司、企业提供最新最全的js调用android需求外包信息,查找js调用android需求,尽在猪八戒网。
js调用android需求推荐