向量相似度java_特征向量相似度和距离的计算-程序员宅基地

技术标签: 向量相似度java  

1 /*2 特征向量相似度和距离的计算3 4 相似度:5 ·夹角余弦6 ·相关系数7 ·Dice8 ·Jaccard9 10 距离11 ·明氏距离12 ·欧氏距离13 ·马氏距离14 ·Jffreys & Matusita 距离15 ·Mahalanobis 距离,未实现,协方差矩阵16 ·Camberra 距离(Lance 距离,Williams 距离)17 */18 19 #include20 #include21 #include22 #include23 usingnamespacestd;24 25 doubledotProduct(constvector&v1,constvector&v2)26 {27 assert(v1.size()==v2.size());28 doubleret=0.0;29 for(vector::size_type i=0; i!=v1.size();++i)30 {31 ret+=v1[i]*v2[i];32 }33 returnret;34 }35 36 doublemodule(constvector&v)37 {38 doubleret=0.0;39 for(vector::size_type i=0; i!=v.size();++i)40 {41 ret+=v[i]*v[i];42 }43 returnsqrt(ret);44 }45 46 //夹角余弦47 doublecosine(constvector&v1,constvector&v2)48 {49 assert(v1.size()==v2.size());50 returndotProduct(v1, v2)/(module(v1)*module(v2));51 }52 53 doublemean(constvector&v)54 {55 assert(v.size()!=0);56 doubleret=0.0;57 for(vector::size_type i=0; i!=v.size();++i)58 {59 ret+=v[i];60 }61 returnret/v.size();62 }63 64 doublecov(constvector&v1,constvector&v2)65 {66 assert(v1.size()==v2.size()&&v1.size()>1);67 doubleret=0.0;68 doublev1a=mean(v1), v2a=mean(v2);69 70 for(vector::size_type i=0; i!=v1.size();++i)71 {72 ret+=(v1[i]-v1a)*(v2[i]-v2a);73 }74 75 returnret/(v1.size()-1);76 }77 78 //相关系数79 doublecoefficient(constvector&v1,constvector&v2)80 {81 assert(v1.size()==v2.size());82 returncov(v1, v2)/sqrt(cov(v1, v1)*cov(v2, v2));83 }84 85 //Dice 系数86 doubledice(constvector&v1,constvector&v2)87 {88 assert(v1.size()==v2.size());89 return2.0*dotProduct(v1, v2)/(dotProduct(v1, v1)+dotProduct(v2, v2));90 }91 92 //Jaccard 系数93 doublejaccard(constvector&v1,constvector&v2)94 {95 assert(v1.size()==v2.size());96 returndotProduct(v1, v2)/(dotProduct(v1, v2)+dotProduct(v2, v2)-dotProduct(v1, v2));97 }98 99 //Minkowsky 距离100 doubleminkowsky(constvector&v1,constvector&v2,doublem)101 {102 assert(v1.size()==v2.size());103 doubleret=0.0;104 for(vector::size_type i=0; i!=v1.size();++i)105 {106 ret+=pow(abs(v1[i]-v2[i]), m);107 }108 returnpow(ret,1.0/m);109 }110 111 //Euclidean 距离112 doubleeuclidean(constvector&v1,constvector&v2)113 {114 assert(v1.size()==v2.size());115 returnminkowsky(v1, v2,2.0);116 }117 118 //Manhattan 距离119 doublemanhattan(constvector&v1,constvector&v2)120 {121 assert(v1.size()==v2.size());122 returnminkowsky(v1, v2,1.0);123 }124 125 //Jffreys & Matusita 距离126 doublejffreysMatusita(constvector&v1,constvector&v2)127 {128 assert(v1.size()==v2.size());129 doubleret=0.0;130 for(vector::size_type i=0; i!=v1.size();++i)131 {132 ret+=(sqrt(v1[i])-sqrt(v2[i]))*(sqrt(v1[i])-sqrt(v2[i]));133 }134 returnsqrt(ret);135 }136 137 //Mahalanobis 距离138 doublemahalanobis(constvector&v1,constvector&v2)139 {140 assert(v1.size()==v2.size());141 return0.0;142 }143 144 //Camberra 距离(Lance 距离,Williams 距离)145 doublecamberra(constvector&v1,constvector&v2)146 {147 assert(v1.size()==v2.size());148 doubleret=0.0;149 for(vector::size_type i=0; i!=v1.size();++i)150 {151 ret+=abs(v1[i]-v2[i])/abs(v1[i]+v2[i]);152 }153 returnret;154 }155 156 intmain()157 {158 doublea[]={1,2,3,4,5};159 doubleb[]={5,4,3,2,1};160 vectorv1(a, a+sizeof(a)/sizeof(*a)), v2(b, b+sizeof(b)/sizeof(*b));161 162 cout<

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34702885/article/details/114810457

智能推荐

Git使用心得_echo "# oneupyenova" >> readme.md git init git add-程序员宅基地

文章浏览阅读170次。Github使用记录最近对github的一些使用心得清除git工程的git信息rm -rf .git本地创建git项目并push到远程echo "# Readme" >> README.mdgit initgit add README.mdgit commit -m "first commit"git remote add origin [email protected]:addressgit push -u origin masterpush一个已经存在的库git rem_echo "# oneupyenova" >> readme.md git init git add readme.md git commit -m

java代码动态注入与class文件热加载实现_java 运行时 注入新类-程序员宅基地

文章浏览阅读5.8k次,点赞3次,收藏18次。一、java代码动态注入在本文中,我们将研究如何将Java代码动态加载到正在运行的jvm中。 该代码可能是全新的,或者我们可能想更改程序中某些现有代码的功能。(在开始之前,您可能想知道为什么到底有人会这样做。显而易见的示例是规则引擎之类的东西。规则引擎希望为用户提供添加或更改规则的能力,而不必重新启动规则。您可以通过将DSL脚本作为规则注入规则库来执行此操作,这种方法的真正问题在于,必须对DSL脚本进行解释,使其运行起来极其缓慢。然后可以像程序中的任何其他代码一样编译和运行该程序,效率将提高几个数量级。_java 运行时 注入新类

用pip安装pymongo模块报错:Could not find a version that satisfies the requirement pymongo(from version:)-程序员宅基地

文章浏览阅读10w+次,点赞28次,收藏40次。安装VN.PY时,进行到安装pymongo步骤出现错误Could not find a version that satisfies the requirement pymongo(from version:)_could not find a version that satisfies the requirement pymongo (from versio

YV12,I420,YUV420P的区别-程序员宅基地

文章浏览阅读43次。2019独角兽企业重金招聘Python工程师标准>>> ..._yv12和iyuv的区别

ubuntu安装neo4j数据库-直接安装与docker方式_neo4j: line 418: /data/workspace/datafactory/neo4j-程序员宅基地

文章浏览阅读568次。本文介绍了ubuntu下分别使用源安装和docker安装neo4j的方法添加下载源安装wget -O - https://debian.neo4j.org/neotechnology.gpg.key | sudo apt-key add -echo 'deb https://debian.neo4j.org/repo stable/' | sudo tee /etc/apt/sources...._neo4j: line 418: /data/workspace/datafactory/neo4j/neo4j-community-3.4.5/run

正则表达式(一)——验证电话号码_判断电话号码的正则表达式-程序员宅基地

文章浏览阅读3.3w次。正则表达式:注意:1.比如你要验证电话号码是否正确,要求是:以1开头,第2位是3,5,8,总共11位 正则表达式应该书写成 ^[1]+[3,8]+\d{9}$package com.ld.num;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Telephone {..._判断电话号码的正则表达式

随便推点

关于HashMap的加载因子相关理解_hashmap加载因子-程序员宅基地

文章浏览阅读399次。HashMap在JDK1.7是以数组加链表的形式组成,JDK1.8后新增了红黑树结构,当链表大于8并且容量大于64时,链表结构会转成红黑树结构。JDK1.8 之所以会加入红黑树是因为当链表过长是会严重影响HashMap的性能,而红黑树具有快速增删改查的特点。关于加载因子加载因子也叫作扩容因子,用来判断什么时候进行扩容,假设加载因子为0.75,HashMap的初始容量为16,当HashMap中有16 * 0.75 = 12个容量时,HashMap就会进行扩容。如果加载因子越大,扩容发生的频率就会比较低_hashmap加载因子

python一二三【warning模块使用】_import warnings-程序员宅基地

文章浏览阅读1.3w次,点赞2次,收藏10次。warning模块使用目的和exception异常要求用户立刻进行处理不同,warning通常用于提示用户一些错误或者过时的用法。casescrapy源码中用到了继承了Warning类创建了一个提醒对象ScrapyDeprecationWarning,用于提醒过时的用户操作,在新版本可能会直接去除支持。用户感知warningspython参数控制warning输出 ..._import warnings

ssm常用的注解_ssm框架注解-程序员宅基地

文章浏览阅读2.3k次。@RestController此注解有两个目的。首先他是一个类似于@controller和@Service的构造型注解,能够让类被组件扫描功能发现。但是,与REST最相关在于@RestController会告诉Spring,控制器中所有的处理器方法的返回值都要直接写入响应体中,而不是将值放到模型中并传递给一个视图以便于渲染。作为替代方案就是@Controller加上@Response。@RestControllerpublic class Controller { }@ApiVersi_ssm框架注解

opengl菜单出现乱码_opengl文字显示(二) | 学步园-程序员宅基地

文章浏览阅读355次。Windows系统中,可以使用wglUseFontBitmaps函数来批量的产生显示字符用的显示列表。函数有四个参数:第一个参数是HDC,学过WindowsGDI的朋友应该会熟悉这个。如果没有学过,那也没关系,只要知道调用wglGetCurrentDC函数,就可以得到一个HDC了。具体的情况可以看下面的代码。第二个参数表示第一个要产生的字符,因为我们要产生0到127的字符的显示列表,所以这里填0..._c++上运行opengl,glutcreatewindow汉字报错

MySQL 团队开发规范_group by后面的字段最好是索引列-程序员宅基地

文章浏览阅读83次。数据库对象命名规范数据库对象数据库对象是数据库的组成部分,常见的有以下几种:表(Table )、索引(Index)、视图(View)、图表(Diagram)、缺省值(Default)、规则(Rule)、触发器(Trigger)、存储过程(Stored Procedure)、 用户(User)等。命名规范是指数据库对象如数据库(SCHEMA)、表(TABLE)、索引(INDEX)、约束(CONSTRAINTS)等的命名约定。数据库对象全局命名规范1、命名使用具有意义的英文词汇,词汇中间以下划线_group by后面的字段最好是索引列

Java入门到精通——第十五单元 多态(没有十四哦)_多态技能目标-程序员宅基地

文章浏览阅读67次。第十五单元 多态昨日知识点回顾本单元知识点概述本单元教学目标(Ⅰ)重点知识目标(Ⅱ)能力目标本单元知识详讲15.1 多态15.1.1 概念引入★★★15.1.2 多态的定义★★★15.1.3 多态体的体现★★★★15.1.4 多态的好处★★★★★15.1.5 向上转型★★★★★15.1.6 向下转型★★★★★15.1.7 转型的使用场景★★★★★15.1.8 转型的异常★★★15.2 接口多态的综合案例15.2.1 案例分析★★★15.2.2 案例实现★★★本单元知识总结昨日知识点回顾接口的概念?接_多态技能目标