NEO4J-相似度算法01-杰卡德相似度介绍及应用场景简介

说明:使用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

执行结果:

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂攻城师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值