构建相似度图时,如果平均相似度得分很高,是否有问题?
Is it a problem if mean similarity score is high when building a similarity graph?
我正在 Neo4j 中构建相似度图,并且 gds.nodeSimilarity.stats 报告了我使用的投影的平均相似度分数在 0.60 到 0.85 范围内,无论我如何转换该图。我试过:
- 仅投影边权重大于 1 的关系
- 删除核心节点以增加组件数量(我的图表是关于单个主题的,核心节点代表该主题)
- 改成无向图
我意识到我总是可以将 gds.nodeSimilarity.write 中的 similarityCutoff 设置为更高的值,但我在猜测自己,因为我用于训练的所有玩具问题,包括 Neo4j 的实践,都意味着 Jaccard 分数小于 0.5。我是想多了还是这表明出了什么问题?
*** 编辑添加 ***
这是一个具有两种节点类型的图:Posts 和实体。帖子反映了各种媒体类型,而实体则反映了各种作者和专有名词。在这种情况下,我主要关注 Twitter。一些关系示例:
(e1 {Type:TwitterAccount})-[TWEETED]->(p:Post
{Type:Tweet})-[AT_MENTIONED]->(e2 {Type:TwitterAccount})
(e1 {Type:TwitterAccount})-[TWEETED]->(p2:Post
{类型:推文})-[QUOTE_TWEETED]->(p2:Post
{Type:Tweet})-[AT_MENTIONED]->(e2 {Type:TwitterAccount})
对于我的代码,我首先尝试仅投影 AT_MENTIONED 关系:
- CALL gds.graph.create('similarity_graph', ["实体", "Post"],
"AT_MENTIONED")
我试过以相反的方向这样做:
CALL gds.graph.create('similarity_graph', ["Entity", "Post"], {AT_MENTIONED:{type:'AT_MENTIONED', orientation:'REVERSE'}})
我尝试在具有 RELATED_TO 关系的所有节点之间创建单方加权关系 ...
MATCH (e1:Entity)-[*2..3]->(e2:Entity) WHERE e1.Type = 'TwitterAccount' AND e2.Type = 'TwitterAccount' AND id(e1) < id(e2) WITH e1, e2, count(*) as strength MERGE (e1)-[r:RELATED_TO]->(e2) SET r.strength
= strength
...然后投影:
CALL gds.graph.create("similarity_graph", "Entity", "RELATED_TO")
无论我尝试以上哪一项,我都会通过 运行:
获得我的 Jaccard 分布
CALL gds.nodeSimilarity.stats('similarity_graph') YIELD nodesCompared, similarityDistribution
您获得高相似度分数的部分原因是因为默认 topK
值为 10。这意味着将仅在节点的前 10 个邻居之间创建/考虑关系。尝试 运行 以下查询:
CALL gds.nodeSimilarity.stats('similarity_graph', {topK:1000})
YIELD nodesCompared, similarityDistribution
现在您可能会得到较低的平均相似度分布。
相似度图的密度应该取决于您的用例。您可以尝试使用默认值,看看效果如何。如果仍然太密集,您可以提高 similarityCutoff
阈值,如果太稀疏,您可以提高 topK
参数。没有灵丹妙药,这取决于您的用例和数据集。
改变关系方向将严重影响结果。在
的图表中
(:User)-[:RELATIONSHIP]->(:Item)
由此产生的单方网络将是一个用户网络。但是如果你颠倒关系
(:User)<-[:RELATIONSHIP]-(:Item)
那么生成的网络将是一个项目网络。
最后,当您使用 topK
10 时,让 Jaccard 的平均值为 0.7 实际上很棒,因为这意味着关系将存在于实际相似的节点之间。 Neo4j 示例降低了相似性截止值,以便创建一些关系并且相似性图不会太稀疏。您还可以提高 topK
参数,如果没有关于图表大小的更多信息,很难准确地说出。
我正在 Neo4j 中构建相似度图,并且 gds.nodeSimilarity.stats 报告了我使用的投影的平均相似度分数在 0.60 到 0.85 范围内,无论我如何转换该图。我试过:
- 仅投影边权重大于 1 的关系
- 删除核心节点以增加组件数量(我的图表是关于单个主题的,核心节点代表该主题)
- 改成无向图
我意识到我总是可以将 gds.nodeSimilarity.write 中的 similarityCutoff 设置为更高的值,但我在猜测自己,因为我用于训练的所有玩具问题,包括 Neo4j 的实践,都意味着 Jaccard 分数小于 0.5。我是想多了还是这表明出了什么问题?
*** 编辑添加 *** 这是一个具有两种节点类型的图:Posts 和实体。帖子反映了各种媒体类型,而实体则反映了各种作者和专有名词。在这种情况下,我主要关注 Twitter。一些关系示例:
(e1 {Type:TwitterAccount})-[TWEETED]->(p:Post {Type:Tweet})-[AT_MENTIONED]->(e2 {Type:TwitterAccount})
(e1 {Type:TwitterAccount})-[TWEETED]->(p2:Post {类型:推文})-[QUOTE_TWEETED]->(p2:Post {Type:Tweet})-[AT_MENTIONED]->(e2 {Type:TwitterAccount})
对于我的代码,我首先尝试仅投影 AT_MENTIONED 关系:
- CALL gds.graph.create('similarity_graph', ["实体", "Post"], "AT_MENTIONED")
我试过以相反的方向这样做:
CALL gds.graph.create('similarity_graph', ["Entity", "Post"], {AT_MENTIONED:{type:'AT_MENTIONED', orientation:'REVERSE'}})
我尝试在具有 RELATED_TO 关系的所有节点之间创建单方加权关系 ...
MATCH (e1:Entity)-[*2..3]->(e2:Entity) WHERE e1.Type = 'TwitterAccount' AND e2.Type = 'TwitterAccount' AND id(e1) < id(e2) WITH e1, e2, count(*) as strength MERGE (e1)-[r:RELATED_TO]->(e2) SET r.strength
= strength
...然后投影:
CALL gds.graph.create("similarity_graph", "Entity", "RELATED_TO")
无论我尝试以上哪一项,我都会通过 运行:
获得我的 Jaccard 分布CALL gds.nodeSimilarity.stats('similarity_graph') YIELD nodesCompared, similarityDistribution
您获得高相似度分数的部分原因是因为默认 topK
值为 10。这意味着将仅在节点的前 10 个邻居之间创建/考虑关系。尝试 运行 以下查询:
CALL gds.nodeSimilarity.stats('similarity_graph', {topK:1000})
YIELD nodesCompared, similarityDistribution
现在您可能会得到较低的平均相似度分布。
相似度图的密度应该取决于您的用例。您可以尝试使用默认值,看看效果如何。如果仍然太密集,您可以提高 similarityCutoff
阈值,如果太稀疏,您可以提高 topK
参数。没有灵丹妙药,这取决于您的用例和数据集。
改变关系方向将严重影响结果。在
的图表中(:User)-[:RELATIONSHIP]->(:Item)
由此产生的单方网络将是一个用户网络。但是如果你颠倒关系
(:User)<-[:RELATIONSHIP]-(:Item)
那么生成的网络将是一个项目网络。
最后,当您使用 topK
10 时,让 Jaccard 的平均值为 0.7 实际上很棒,因为这意味着关系将存在于实际相似的节点之间。 Neo4j 示例降低了相似性截止值,以便创建一些关系并且相似性图不会太稀疏。您还可以提高 topK
参数,如果没有关于图表大小的更多信息,很难准确地说出。