"““基于启发式特征的链接预测演示””" from collections import defaultdict class LinkPredictor: "““用共同邻居和 Jaccard 系数预测隐藏关系””" def init(self, edges): self.adjacency = defaultdict(set) for u, v in edges: self.adjacency[u].add(v) self.adjacency[v].add(u) def common_neighbors(self, u, v): "““返回 u 和 v 的共同邻居个数””" return len(self.adjacency[u] & self.adjacency[v]) def jaccard_score(self, u, v): "““返回 u 和 v 的 Jaccard 系数””" union = self.adjacency[u] | self.adjacency[v] if not union: return 0.0 return self.common_neighbors(u, v) / len(union) def predict(self, u, v, method="jaccard"): "““按指定方法计算 u、v 之间存在边的可能性””" if method == "common": return self.common_neighbors(u, v) return self.jaccard_score(u, v) def rank_candidates(self, candidates, method="jaccard"): "““对候选节点对打分排序,得分高的优先推荐””“ result = [] for u, v in candidates: if v in self.adjacency[u]: continue score = self.predict(u, v, method) result.append((score, u, v)) result.sort(reverse=True) return result def main(): # 青石镇的部分社交关系:(A, B) 表示 A 和 B 认识 edges = [ (”A", "B"), ("A", "C"), ("B", "D"), ("C", "D"), ("D", "E"), ("E", "F"), ("D", "G"), ("G", "H“), ] model = LinkPredictor(edges) # 待预测的候选节点对:当前都没有边连接 candidates = [ (”B", "F"), ("A", "E"), ("C", "H"), ("A", "F"), ("B", "G"), ("E", "H“), ] print(“=== Jaccard 系数链接预测排名 ===”) for score, u, v in model.rank_candidates(candidates): print(f”{u} - {v}: {score:.3f}“) print(“\nB-F 共同邻居数:”, model.common_neighbors(”B", "F“)) print(“B-F Jaccard 系数:”, model.jaccard_score(”B", "F")) if name == "main": main() ```
代码用途:用共同邻居和 Jaccard 系数对候选节点对打分排序,演示链接预测最朴素的“数共同好友”流派。