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