【发布时间】:2015-08-04 21:55:13
【问题描述】:
我正在做一个项目,该项目检测两个输入图像(手写签名)的一些特征,并使用余弦相似度比较这两个特征。这里当我指的是两个输入图像时,一个是原始图像,另一个是复制图像。 假设我正在提取一张图像(原始图像)的 15 个这样的特征并将其存储在一个数组中(例如,Array_ORG),而其他图像的特征类似地存储在 Array_DUP 中。 现在,我正在尝试计算这两个数组之间的余弦相似度。这些数组是双精度数据类型。
我列出了我遵循的两种方法:
1)手动计算余弦相似度:
main(){
for(int i=0;i<15;i++)
sum_org += (Array_org[i]*Array_org[i]);
for(int i=0;i<15;i++)
sum_dup += (Array_dup[i]*Array_dup[i]);
double magnitude = sqrt(sum_org +sum_dup );
double cosine_similarity = dot_product(Array_org, Array_dup, sizeof(Array_org)/sizeof(Array_org[0]))/magnitude;
}
double dot_product(double *a, double* b, size_t n){
double sum = 0;
size_t i;
for (i = 0; i < n; i++) {
sum += a[i] * b[i];
}
return sum;
}
2) 将值存储到 Mat 中并调用点函数:
Mat A = Mat(1,15,CV_32FC1,&Array_org);
Mat B = Mat(1,15,CV_32FC1,&Array_dup);
double similarity = cal_theta(A,B);
double cal_theta(Mat A, Mat B){
double ab = A.dot(B);
double aa = A.dot(A);
double bb = B.dot(B);
return -ab / sqrt(aa*bb);
}
我读过余弦相似度值的范围是 -1 到 1,-1 表示两者完全相反,1 表示两者相等。但是第一个函数给了我 1000 的值,第二个函数给了我超过 1 的值。
请指导我哪个过程是正确的,为什么?
另外,如果余弦相似度值大于 1,我如何推断相似度?
【问题讨论】:
标签: c++ arrays opencv mat cosine-similarity