1 简介
Eigen 是一个高效、易于使用的C++模板库,广泛应用于线性代数计算。本文将介绍如何使用 Eigen 实现 CosineSimilarity 函数,这是一种常用的相似度度量方法,可以用于衡量两个向量之间的相似程度。通过 Eigen 的矩阵运算和向量运算,我们可以快速、准确地实现 CosineSimilarity 函数,提高机器学习模型的训练和推理效率。
2 实现 NormalizeL2
bool NormalizeL2(std::vector<float> &input_data) {if (input_data.empty()) {return false;}// 将std::vector<float> 转换为 Eigen::MapEigen::Map<Eigen::VectorXf> eigen_vector(input_data.data(), static_cast<long>(input_data.size()));eigen_vector.normalize();return true;
}
3 实现 CosineSimilarity
double CosineSimilarity(const std::vector<T> &a, const std::vector<T> &b, bool use_normalize = false) {if ((a.size() != b.size()) && (a.empty()) || (b.empty())) {BDLOGGER_ERROR("The size of Vector A and B must be equal and greater than 0. But the size of vector A is {}, while the size of vector B is also {}.",a.size(),b.size())return 0;}Eigen::Map<const Eigen::VectorXf> eigen_vector_a(a.data(), static_cast<long>(a.size()));Eigen::Map<const Eigen::VectorXf> eigen_vector_b(b.data(), static_cast<long>(b.size()));if (use_normalize) {return eigen_vector_a.dot(eigen_vector_b) / (eigen_vector_a.norm() * eigen_vector_b.norm());} else {return eigen_vector_a.dot(eigen_vector_b);}
}
4 参考文档
- 深度学习(二十四)——L2 Normalization, Attention(1)-CSDN博客
- mindspore.ops.L2Normalize — MindSpore master documentation
- 余弦相似度(Cosine Similarity)-CSDN博客
- 距离度量 —— 余弦相似度(Cosine similarity)_繁依Fanyi的技术博客_51CTO博客