Я работаю над проектом, который определяет некоторые особенности двух входных изображений (рукописные подписи) и сравнивает эти две функции с использованием косинусного сходства. Здесь, когда я имею в виду два входных изображения, одно - исходное изображение, а другое - дублированное изображение. Скажем, я извлекаю 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?