0.绪
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。

1.推导公式



2.代码示例
/*
特征向量相似度和距离的计算
相似度:
·夹角余弦
·相关系数
·Dice
·Jaccard
距离
·明氏距离
·欧氏距离
·马氏距离
·Jffreys & Matusita 距离
·Mahalanobis 距离,未实现,协方差矩阵
·Camberra 距离(Lance 距离,Williams 距离)
*/
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
// ret = v1[0]*v2[0]+v1[1]*v2[1]+...
double dot_product(
const vector<double> &v1,
const vector<double> &v2)
{
assert(v1.size() == v2.size());
double ret=0.0;
for (size_t i = 0; i < v1.size(); i++)
{
ret += v1[i]*v2[i];
}
return ret;
}
//sqrt(sum(v*v))
double module(const vector<double> &v)
{
double ret=0.0;
for (size_t i = 0; i < v.size(); i++)
{
ret += v[i]*v[i];
}
return sqrt(ret);
}
// 余弦相似性计算
double cosine(
const vector<double> &v1,
const vector<double> &v2)
{
assert(v1.size() == v2.size());
double ret = dot_product(v1,v2)/(module(v1)*module(v2));
return ret;
}
int main()
{
//当向量归一化时,只需计算ret = v1[0]*v2[0]+v1[1]*v2[1]+...
//当向量没归一化时,... ...
vector<double> v1{1,2,3,4,5};
vector<double> v2{5,4,3,2,1};
double ret = cosine(v1,v2);
std::cout<<"cosine= "<<ret<<std::endl;
return 0;
}
参考:
1.https://blog.csdn.net/qq_26295547/article/details/79645479
2.https://blog.csdn.net/baidu_38172402/article/details/97627774
网友评论