杰卡德相似系数(Jaccard Similarity Coefficient)
计算两个用户之间杰卡德相似度算法:两组数据交集除以两组数据的并集
实现每个学生和班级不同学生进行笛卡尔积 相互匹配
pd.merge 参数 how="cross" 因为左表和右表一样 所以要添加后缀 suffix
编写函数计算爱好相似度
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
# 查某个同学和班级中相似度最高的
df_merge[(df_merge["1、姓名_x"]=="张三") & (df_merge["相似度"]!=1)&(df_merge["相似度"]>0)].sort_values("相似度",ascending=False).head(3)
获取每个人之间的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
构造用户与其相似度最高的前两位数据字典便于pyecharts绘制图表
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()
0 评论 最近
没有评论!