做ref="/tag/72/" style="color:#643D3D;font-weight:bold;">网络运维久了,会发现用户行为数据里藏着不少门道。比如两个用户看起来没直接互动,但他们的“朋友圈”高度重合,这种隐性关联怎么量化?这时候就得请出Jaccard系数了。
Jaccard系数是什么?
说白了,Jaccard系数就是衡量两个集合相似度的一个指标。公式很简单:交集除以并集。放在社交网络里,就是两个人共同关注的人数,除以他们总共关注的人数。
假设有用户A和B,A关注了{张三, 李四, 王五},B关注了{李四, 王五, 赵六}。那他俩的共同关注是2人,并集是5人,Jaccard系数就是0.4。数值越接近1,说明两人社交圈越像,可能是同事、朋友,甚至“小号互粉”。
实际场景怎么用?
运维中常遇到异常账号检测的问题。有些营销号会批量关注热门用户来刷存在感,表面看关注列表很长,但和正常用户的重合度很低。用Jaccard算一算,这类账号往往得分偏低。
反过来,如果两个账号之间的Jaccard系数长期高于0.8,哪怕没互相关注,也值得留意。比如在论坛系统里,可能是一对高频互动的“隐身CP”,或者是同一个运营团队在操控多个账号。
代码实现不难
Python几行就能搞定:
def jaccard(a, b):
set_a = set(a)
set_b = set(b)
intersection = len(set_a & set_b)
union = len(set_a | set_b)
return intersection / union if union != 0 else 0
# 示例
user_a_follows = ['zhang', 'li', 'wang']
user_b_follows = ['li', 'wang', 'zhao']
print(jaccard(user_a_follows, user_b_follows)) # 输出 0.4
注意点别踩坑
这方法看着简单,但得防着数据偏差。比如一个用户只关注了1个人,另一个关注了500个,他俩只要有1个共同关注,Jaccard就是1.0,明显不合理。解决办法是加个阈值,比如要求各自关注人数都超过一定数量再计算。
另外,纯靠Jaccard还不够,最好结合登录IP、设备指纹这些信息交叉判断。毕竟运维不是做数学题,真实世界的情况总比公式复杂。