gpt4 book ai didi

c++ - C++ 中的大数问题存在余弦相似性

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:28 24 4
gpt4 key购买 nike

我正在写这个函数

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 ab 之间的余弦相似度时,以下内容为真:

CosineDistance(a*x,b*x) == CosineDinstance(a,b);

对于任何数字 x(但不是 0)。因此,您可以简单地使用 double 值和适当的比例因子 x 来避免溢出。

关于c++ - C++ 中的大数问题存在余弦相似性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37331388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com