赞
踩
说明:使用neo4j算法库时需引入跟neo4j数据库对应的算法库插件或自定义算法库
一、杰卡德Jaccard似度算法
1.简介
Jaccard 相似度(系数)是Paul Jaccard创造的一个术语,用于衡量集合之间的相似度。它被定义为交集的大小除以两个集合的并集的大小。这个概念已被推广到多重集,其中重复元素被视为权重。
Jaccard 相似度使用以下公式计算:
该算法的输入是包含两个不相交节点集的二部连通图。每个关系从第一个节点集中的一个节点开始,到第二个节点集中的一个节点结束。
节点相似性算法比较每个节点之间具有传出关系的节点。对于每个节点n
,我们收集该节点的传出邻域N(n)
,即所有节点m
,使得存在从n
到的关系m
。对于每一对n
, m
,算法计算该对的相似度,即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
执行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。