余弦相似度的计算——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));
}
智能推荐

注意!

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



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

赞助商广告