余弦相似度计算及实现

2020-02-26  本文已影响0人  AI秘籍

0.绪

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


image.png

1.推导公式

image.png
image.png
image.png

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

上一篇 下一篇

猜你喜欢

热点阅读