当前位置:   article > 正文

NEO4J-相似度算法01-杰卡德相似度介绍及应用场景简介_neo4j怎么调用gds.alpha.similarity.jaccard

neo4j怎么调用gds.alpha.similarity.jaccard

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

一、杰卡德Jaccard似度算法

1.简介

Jaccard 相似度(系数)是Paul Jaccard创造的一个术语,用于衡量集合之间的相似度。它被定义为交集的大小除以两个集合的并集的大小。这个概念已被推广到多重集,其中重复元素被视为权重。

Jaccard 相似度使用以下公式计算:

杰卡德

该算法的输入是包含两个不相交节点集的二部连通图。每个关系从第一个节点集中的一个节点开始,到第二个节点集中的一个节点结束。

节点相似性算法比较每个节点之间具有传出关系的节点。对于每个节点n,我们收集该节点的传出邻域N(n),即所有节点m,使得存在从n到的关系m。对于每一对nm,算法计算该对的相似度,即N(n)和的 Jaccard 相似度N(m)

这种比较的复杂性随着要比较的节点数量呈二次方增长。该算法通过忽略断开连接的节点来降低复杂性。

除了计算复杂性之外,产生结果的内存需求也大致按二次方扩展。为了限制内存使用,该算法需要明确限制每个节点计算的结果数量。这是“topK”参数。它可以设置为任何值,除了 0。

该算法的输出是第一个节点集对之间的新关系。相似性分数通过关系属性表示。

2.用例-何时使用杰卡德相似度算法(Jaccard Similarity)

我们可以使用 Jaccard Similarity 算法来计算两件事之间的相似度。然后,我们可能会将计算出的相似度用作推荐查询的一部分。例如,您可以使用 Jaccard Similarity 算法根据之前购买的产品显示类似客户购买的产品

3.杰卡德相似度算法函数示例(Jaccard Similarity)

Jaccard Similarity 函数计算两个数字列表的相似度

cypher示例1:RETURN gds.alpha.similarity.jaccard([1,2,3], [1,2,4,5]) AS similarity  (此为neo4j4.0以后写法)

cypher示例2:RETURN algo.similarity.jaccard([1,2,3], [1,2,4,5]) AS similarity  (此为neo4j4.0以前写法本文后续部分将全部使用此写法)

示例执行结果:

这两个数字列表的 Jaccard 相似度为 0.4。我们可以通过分解公式来看看这个结果是如何得出的:

J(A,B) = ∣A ∩ B∣ / ∣A∣ + ∣B∣ - ∣A ∩ B|
J(A,B) = 2 / 3 + 4 - 2
       = 2 / 5
       = 0.4
我们还可以使用它来计算基于 Cypher 查询计算的列表的节点的相似性。
下面将创建一个示例图:
CREATE (french:alarm {name:'涉黄'}), (italian:alarm {name:'涉毒'}), (indian:alarm {name:'涉枪'}), (lebanese:alarm {name:'赌博'}), (portuguese:alarm {name:'骗钱'}),  (zhen:Person {name: 'Zhen'}), (praveena:Person {name: 'Praveena'}), (michael:Person {name: 'Michael'}), (arya:Person {name: 'Arya'}), (karin:Person {name: 'Karin'}),  (praveena)-[:LIKES]->(indian), (praveena)-[:LIKES]->(portuguese),  (zhen)-[:LIKES]->(french), (zhen)-[:LIKES]->(indian),  (michael)-[:LIKES]->(french), (michael)-[:LIKES]->(italian), (michael)-[:LIKES]->(indian),  (arya)-[:LIKES]->(lebanese), (arya)-[:LIKES]->(italian), (arya)-[:LIKES]->(portuguese),  (karin)-[:LIKES]->(lebanese), (karin)-[:LIKES]->(italian)

以下将返回 Karin 和其他有共同美食的人的 Jaccard 相似度

MATCH (p1:Person {name: 'Karin'})-[:LIKES]->(cuisine1) WITH p1, collect(id(cuisine1)) AS p1Cuisine MATCH (p2:Person {name: "Arya"})-[:LIKES]->(cuisine2) WITH p1, p1Cuisine, p2, collect(id(cuisine2)) AS p2Cuisine RETURN p1.name AS from, p2.name AS to, algo.similarity.jaccard(p1Cuisine, p2Cuisine) AS similarity

示例执行结果:

以下将返回 Karin 和其他有共同警情的人的 Jaccard 相似度:

MATCH (p1:Person {name: 'Karin'})-[:LIKES]->(cuisine1) WITH p1, collect(id(cuisine1)) AS p1Cuisine MATCH (p2:Person)-[:LIKES]->(cuisine2) WHERE p1 <> p2 WITH p1, p1Cuisine, p2, collect(id(cuisine2)) AS p2Cuisine RETURN p1.name AS from, p2.name AS to, algo.similarity.jaccard(p1Cuisine, p2Cuisine) AS similarity ORDER BY to, similarity DESC

执行结果:

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号