杰卡德相似系数(Jaccard Similarity Coefficient)


计算两个用户之间杰卡德相似度算法:两组数据交集除以两组数据的并集

企业微信截图_17349169942657.png


实现每个学生和班级不同学生进行笛卡尔积 相互匹配

pd.merge 参数 how="cross"
因为左表和右表一样 所以要添加后缀 suffix

image.png


编写函数计算爱好相似度

def similarity(row):

    left_hobby = set(row["2、你喜爱的体育运动项目_x"].split("┋"))

    right_hobby = set(row["2、你喜爱的体育运动项目_y"].split("┋"))

    # 求交集和并集Jaccard相似度

    inter = left_hobby.intersection(right_hobby)

    union = left_hobby.union(right_hobby)

    return round(len(inter)/len(union),2)


similarity({"2、你喜爱的体育运动项目_x":"排球┋高尔夫球┋羽毛球","2、你喜爱的体育运动项目_y":"棒球┋高尔夫球"})

0.25

image.png

# 查某个同学和班级中相似度最高的

df_merge[(df_merge["1、姓名_x"]=="张三") & (df_merge["相似度"]!=1)&(df_merge["相似度"]>0)].sort_values("相似度",ascending=False).head(3)

image.png

获取每个人之间的jaccard相似度

# 每个学生相近运动爱好的同学(聚类)选择前3个爱好近似的人(包括自己)

df_similarity = df_merge.groupby(["1、姓名_x"])["1、姓名_y","相似度"].apply(lambda s :s.sort_values("相似度",ascending=False).head(3))

data=df_similarity.reset_index()

data

image.png

构造用户与其相似度最高的前两位数据字典便于pyecharts绘制图表

image.png

from pyecharts import options as opts

from pyecharts.charts import Graph

from pyecharts.globals import ThemeType



# 模拟的数据,实际中替换为真实全班同学的数据

# 字典的键是同学名字,值是对应的相似好友名字列表

classmate_relations = classmate_relations


# 节点数据列表

nodes = []

# 边数据列表

links = []


# 生成节点数据,为每个同学创建一个节点信息

for classmate in classmate_relations:

    nodes.append({"name": classmate, "symbolSize": 30})


# 生成边数据,根据相似好友关系来创建边

for classmate, similar_friends in classmate_relations.items():

    for friend in similar_friends:

        links.append({"source": classmate, "target": friend})


# 创建Graph图表对象

graph = Graph()

# 添加节点和边数据到图表

graph.add(

    "", 

    nodes, 

    links,

    repulsion=500


)

# 设置全局配置项,比如图表标题等

graph.set_global_opts(

    title_opts=opts.TitleOpts(title="全班同学好友相似关系图"),

)


# 生成节点数据后,打印节点数据查看

print("Nodes:", nodes)

# 生成边数据后,打印边数据查看

print("Links:", links)

# 渲染生成HTML文件,在浏览器中查看图表,你也可以使用render_notebook()

# 如果是在Jupyter Notebook环境下直接展示图表

# graph.render("student_friends_relation_graph.html")

graph.render_notebook()


image.png






















0 评论 最近

没有评论!