余弦相似度的計算——C++


余弦相似度的計算——C++

​ 計算特征向量的相似度的手段有很多種,例如歐氏距離皮爾遜相關系數tanimoto系數曼哈頓距離漢明距離等等。

​ 下面先記錄下余弦相似度的計算。

​ 根據向量間的余弦定理

這里寫圖片描述

在C++里面實現就很容易了

1,opencv中封裝了矩陣運算,可以直接調用

//簡單明了,一步到位
float getSimilarity(const cv::Mat& first,const cv::Mat& second)
{
double dotSum=first.dot(second);//內積
double normFirst=cv::norm(first);//取模
double normSecond=cv::norm(second);
if(normFirst!=0 && normSecond!=0){
return dotSum/(normFirst*normSecond);
}
}

2,如果特征向量不是Mat類型,是vector類型,那就自己實現吧,也不復雜

    float getMold(const vector<float>& vec){   //求向量的模長
int n = vec.size();
float sum = 0.0;
for (int i = 0; i<n; ++i)
sum += vec[i] * vec[i];
return sqrt(sum);
}

float getSimilarity(const vector<float>& lhs, const vector<float>& rhs){
int n = lhs.size();
assert(n == rhs.size());
float tmp = 0.0; //內積
for (int i = 0; i<n; ++i)
tmp += lhs[i] * rhs[i];
return tmp / (getMold(lhs)*getMold(rhs));
}
关注微信公众号

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com