说明:使用neo4j算法库时需引入跟neo4j数据库对应的算法库插件或自定义算法库

1.简介

欧几里德距离算法原理是计算n维坐标系中点与点之间地距离,如在三维坐标系中点A(p1,p2,p3),点B(q1,q2,q3),两个点之间得距离则为 :,
如果在n维坐标系中,两个点得距离则变为:
      根据以上特性拓展:距离越小则A点和B点重合度越高,由此可衍生出A点和B点在n维空间中距离相似度公式为: 
 

neo4j自带算法包提供了欧几里得相似度算法得函数和过程,函数适合少量数据计算,过程适合批量数据得计算

2.使用场景

何时使用欧几里得算法呢,我们可以使用欧几里的距离算法来计算两件事之间得相似性,然后,我们可能会将相似性用作推荐查询得一部分,比如用户A和用户B之间共同爱看得电影,比如根据用户A和用户B共同出入得场所,判定用户A和B职业预测,用户A和用户B共同好友,实现可能好友推荐

3.neo4j中欧几里得函数使用示例

在neo4j中存在algo.similarity.euclideanDistance计算距离函数,也存在algo.similarity.euclidean计算相似度得函数

1.计算两个硬编码列表距离

RETURN algo.similarity.euclideanDistance([3,8,7,5,2,9], [10,8,6,6,4,5]) AS similarity

结果:8.426149773176359

2.计算两个硬编码列表相似度

ETURN algo.similarity.euclidean([3,8,7,5,2,9], [10,8,6,6,4,5]) AS similarity

结果:0.1060878539025194

3.我们还可以使用它来计算节点关联节点相似性

初始化数据

MERGE (french:Cuisine {name:'French'})
MERGE (italian:Cuisine {name:'Italian'})
MERGE (indian:Cuisine {name:'Indian'})
MERGE (lebanese:Cuisine {name:'Lebanese'})
MERGE (portuguese:Cuisine {name:'Portuguese'})
MERGE (british:Cuisine {name:'British'})
MERGE (mauritian:Cuisine {name:'Mauritian'})MERGE (zhen:Person {name: "Zhen"})
MERGE (praveena:Person {name: "Praveena"})
MERGE (michael:Person {name: "Michael"})
MERGE (arya:Person {name: "Arya"})
MERGE (karin:Person {name: "Karin"})MERGE (praveena)-[:LIKES {score: 9}]->(indian)
MERGE (praveena)-[:LIKES {score: 7}]->(portuguese)
MERGE (praveena)-[:LIKES {score: 8}]->(british)
MERGE (praveena)-[:LIKES {score: 1}]->(mauritian)MERGE (zhen)-[:LIKES {score: 10}]->(french)
MERGE (zhen)-[:LIKES {score: 6}]->(indian)
MERGE (zhen)-[:LIKES {score: 2}]->(british)MERGE (michael)-[:LIKES {score: 8}]->(french)
MERGE (michael)-[:LIKES {score: 7}]->(italian)
MERGE (michael)-[:LIKES {score: 9}]->(indian)
MERGE (michael)-[:LIKES {score: 3}]->(portuguese)MERGE (arya)-[:LIKES {score: 10}]->(lebanese)
MERGE (arya)-[:LIKES {score: 10}]->(italian)
MERGE (arya)-[:LIKES {score: 7}]->(portuguese)
MERGE (arya)-[:LIKES {score: 9}]->(mauritian)MERGE (karin)-[:LIKES {score: 9}]->(lebanese)
MERGE (karin)-[:LIKES {score: 7}]->(italian)
MERGE (karin)-[:LIKES {score: 10}]->(portuguese)

查询'Zhen'和Praveena喜好相似度:

MATCH (p1:Person {name: 'Zhen'})-[likes1:LIKES]->(cuisine)
MATCH (p2:Person {name: "Praveena"})-[likes2:LIKES]->(cuisine)
RETURN p1.name AS from,p2.name AS to,algo.similarity.euclidean(collect(likes1.score), collect(likes2.score)) AS similarity

结果:

4.以下将返回Zhen和其它有共同美食爱好得欧几里得相似度

MATCH (p1:Person {name: 'Zhen'})-[likes1:LIKES]->(cuisine)
MATCH (p2:Person)-[likes2:LIKES]->(cuisine) WHERE p2 <> p1
RETURN p1.name AS from,p2.name AS to,algo.similarity.euclidean(collect(likes1.score), collect(likes2.score)) AS similarity
ORDER BY similarity DESC

结果:

4.源码解析

algo.similarity.euclidean欧几里得相似度计算函数源码如下:
    public double euclideanSimilarity(@Name("vector1") List<Number> vector1, @Name("vector2") List<Number> vector2) {return 1.0d / (1 + euclideanDistance(vector1, vector2));}
algo.similarity.euclideanDistance欧几里得距离计算函数源码如下:
    public double euclideanDistance(@Name("vector1") List<Number> vector1, @Name("vector2") List<Number> vector2) {if (vector1.size() != vector2.size() || vector1.size() == 0) {throw new RuntimeException("Vectors must be non-empty and of the same size");}int len = Math.min(vector1.size(), vector2.size());double[] weights1 = new double[len];double[] weights2 = new double[len];for (int i = 0; i < len; i++) {weights1[i] = vector1.get(i).doubleValue();weights2[i] = vector2.get(i).doubleValue();}return Math.sqrt(Intersections.sumSquareDelta(weights1, weights2, len));}
Intersections.sumSquareDelta()方法源码如下:
    public static double sumSquareDelta(double[] vector1, double[] vector2, int len) {double result = 0;for (int i = 0; i < len; i++) {double delta = vector1[i] - vector2[i];result += delta * delta;}return result;}

总结:由以上两端代码可知,欧几里得相似度算法函数依赖于欧几里的距离函数,Intersections.sumSquareDelta()欧几里得中对两个vector集合求了方差,euclideanDistance中对方差结果开根方。由此可知欧几里得相似度算法传入得参数值必须长度一致

上一篇:NEO4J-相似度算法03-皮尔逊相似度(Pearson)应用场景简介

NEO4J-相似度算法04-欧几里得距离算法(euclidean)应用场景简介相关推荐

  1. 机器学习算法 04 —— 决策树(ID3、C4.5、CART,剪枝,特征提取,回归决策树)

    文章目录 系列文章 决策树 1 决策树算法简介 2 决策树分类的原理 2.1 信息熵 2.2 决策树划分依据-信息增益(ID3) 2.3 决策树划分依据-信息增益率(C4.5) 2.4 决策树划分依据 ...

  2. Python:实现jaccard similarity相似度无平方因子数算法(附完整源码)

    Python:实现jaccard similarity相似度无平方因子数算法 def jaccard_similariy(setA, setB, alternativeUnion=False):if ...

  3. 基于余弦相似度的改进蝴蝶优化算法

    文章目录 一.理论基础 1.蝴蝶优化算法 2.改进蝴蝶优化算法 (1)基于余弦相似度位置更新策略 (2)根据适应度动态调整转换概率策略 (3)自适应混合惯性权重 二.MSBOA算法步骤 三.仿真实验与 ...

  4. NEO4J-相似度算法03-皮尔逊相似度(Pearson)应用场景简介

    1.简介 Pearson 相似度是两个n维向量的协方差除以它们的标准差的乘积. 使用以下公式计算 Pearson 相似度: 值范围在 -1 和 1 之间,其中 -1 完全不同,1 完全相似. 该库包含 ...

  5. 图片相似度识别算法,百度图片识别算法

    图像识别算法都有哪些 图像识别算法:1人脸识别类(Eigenface,Fisherface算法特别多),人脸检测类(j-v算法,mtcnn)2车牌识别类,车型识别类(cnn)3字符识别(cnn)... ...

  6. 模块度计算python代码_LPA算法C++实现及模块度计算

    前言 这学期开始看社团检测的东西,了解了一些经典算法.比如GN算法,BGLL算法(又叫Louvain, 因为该算法是作者在Louvain大学时提出的),LPA算法,等等. 我先看的LPA(毕竟算法思想 ...

  7. 数据结构和算法(01)--- 算法复杂度

    文章目录 算法时间复杂度 算法时间复杂度 要判断算法的好坏,可以从时间方面进行分析.算法运行的越快,所用的时间越短则算法越好.但是同一个算法在不同的平台上的运行时间不同.那么又该如何进行评判呢?我们采 ...

  8. 【数据结构、算法】八大排序算法概述(算法复杂度、稳定性)

    前言   排序是计算机程序设计中一个非常重要的操作,它将一个数据元素(或记录)的任意序列重新排列成一个按关键字有序的序列.在有序的序列中查找元素的效率很高,(例如,折半查找法的平均查找长度为log2( ...

  9. 数学建模十大算法04—图论算法(最短路径、最小生成树、最大流问题、二分图)

    文章目录 一.最短路径问题 1.1 两个指定顶点之间的最短路径 1.1.1 Dijkstra算法 1.1.2 Matlab函数 1.2 每对顶点之间的最短路径 1.2.1 Dijkstra算法 1.2 ...

  10. a*算法迷宫 c++_算法竞赛专题解析(12):搜索基础

    搜索 搜索,就是查找解空间,它是"暴力法"算法思想的具体实现. 文章目录: 01 搜索简介 02 搜索算法的基本思路 03 BFS的性质和代码实现 04 DFS的常见操作和代码实现 ...

最新文章

  1. java spring cloud版b2b2c社交电商spring cloud分布式微服务-docker-feign-hystrix(六)
  2. Quartz 框架快速入门(三)
  3. Knative 暂时不会捐给任何基金会 | 云原生生态周报 Vol. 22
  4. CNN 与 Transformer 的强强联合!谷歌最新开源 BoTNet,ImageNet 达 84.7%准确率
  5. Python提取数字图片特征向量
  6. .net连接DB2的异常SQL0666 - SQL query exceeds specified time limit or storage limit.错误处理
  7. 开启cdn后无法显示字体图标——CDN服务器跨域问题
  8. mysql查询市区县_通过数据库获取省份城市区县的名字
  9. 向98年的华为学习:没有高管办公室的青铜器软件
  10. 企查查网站信息爬取1.0版
  11. 多文件自平衡云传输 (五)资源管理中心篇 —————— 开开开山怪
  12. 微信活码系统程序源码
  13. LWN:Ubuntu 不再缺省提供Flatpak!
  14. |2105|小泉的难题
  15. 云队友丨中国互联网反垄断简史
  16. 移动端音乐WebApp
  17. 数学物理方法 05 留数定理
  18. 三种不同的interrupt方法区别调用
  19. 【软件安装】SPSS22.0安装
  20. Windows卸载与清除工具 “ Geek 与 CCleaner ”

热门文章

  1. A1059. 求解二元整数不定方程
  2. js正则验证手机号格式
  3. 移动硬盘位置不可用无法访问函数不正确修复方法?
  4. python软著申请_软著申请注意事项放心选择
  5. 图片生成二维码最好的工具
  6. Canvas 和 SVG 的区别是什么?
  7. oracle存储过程报ORA-20000的错误
  8. vue中使用AntV G6 — 基础篇
  9. VMware 虚拟机三种网络模式详解
  10. 基于决策树算法对良/恶性乳腺癌肿瘤预测