我正在写这个函数
double long CosineDistance(const vector<unsigned long>& a,const vector<unsigned long>& b){
double long num = 0.0, den1 = 0.0, den2 = 0.0 ;
for(int i = 0; i < a.size(); ++i) {
num+=a[i]*b[i] ;
den1+=a[i]*a[i] ;
den2+=b[i]*b[i] ;
}
return num/(sqrt(den1)*sqrt(den2));
}
对于少量数据,它可以正常工作:
即传递 {1,3,8}
和 {5,4,9}
返回 0.936686 (这是正确的)
现在我正在构建的项目使用大数字(它们是散列字符串)并使用类似的数字
{3337682107,92015386,2479056,2478761,4153082938}
和
{104667454,92015386,150359366,2225484100,2479056}
它返回给我 1,根据 WolframAlpha 的说法,我认为这是 0.968597 的近似值。
已经检查了溢出情况,但没有发生。
有办法解决这个问题吗?
谢谢
最佳答案
当您计算两个 vector a
和 b
之间的余弦相似度时,以下情况成立:
CosineDistance(a*x,b*x) == CosineDinstance(a,b);
对于任何数字x(但不是0)。因此,您可以简单地使用 double 和适当的缩放因子x
来避免溢出。
关于c++ - C++ 中的大数余弦相似度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37331388/