栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 【欧式距离、余弦相似度】相似度计算理解(附源码)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 【欧式距离、余弦相似度】相似度计算理解(附源码)

1、区别

        

        欧式距离衡量空间点的直线距离,预想距离衡量点在空间的方向差异。欧式距离越小相似,余弦值越大越相似

        理解:欧氏度量衡量数值上差异的绝对值,余弦相似度衡量的是维度间相对层面的差异

2、计算公式

        欧式距离:

        

        余弦相似度:

                 

3、取值范围

        欧式距离取值范围:[0, +∞)

        余弦相似度取值范围:[-1, 1]

4、源码        欧式距离

       【Mat类型】

double euclidean_distance(Mat baseImg, Mat targetImg)
{
	double sumDescriptor = 0;
	for (int i = 0; i < baseImg.cols; i++)
	{
		double numBase = abs(baseImg.at(0, i));
		double numTarget = abs(targetImg.at(0, i));
		sumDescriptor += pow(numBase - numTarget, 2);
	}
	double simility = sqrt(sumDescriptor);
	return simility;
}

        【vector类型】

double euclidean_distance(vector& base, vector& target)
{
	double sumDescriptor = 0;
	for (int i = 0; i < base.size(); i++)
	{
		sumDescriptor += std::pow(base[i] - target[i], 2);
	}
	double simility = std::pow(sumDescriptor, 0.5);
	return simility;
}
        余弦相似度

        【Mat类型】

double cos_distance(Mat baseImg, Mat targetImg)
{
	double squSumB = 0;
	double squSumT = 0;
	double innerPro = 0;
	for (int i = 0; i < baseImg.cols; i++)
	{
		double numBase = abs(baseImg.at(0, i));
		double numTarget = abs(targetImg.at(0, i));
		squSumB = squSumB + numBase * numBase;
		squSumT = squSumT + numTarget * numTarget;

		innerPro = innerPro + numBase * numTarget;
	}
	double modB = sqrt(squSumB);
	double modT = sqrt(squSumT);
	double simility = innerPro / (modB*modT);
	return simility;
}

        【vector类型】

double getMold(const vector& vec)
{
	int n = vec.size();
	double sum = 0.0;
	for (int i = 0; i < n; ++i)
		sum += vec[i] * vec[i];
	return sqrt(sum);
}
double cos_distance(const vector& base, const vector& target)
{
	int n = base.size();
	assert(n == target.size());
	double tmp = 0.0;
	for (int i = 0; i < n; ++i)
		tmp += base[i] * target[i];
	double simility =  tmp / (getMold(base)*getMold(target));
	return simility;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1009396.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号