谷本系数的相似性度量 —— Tanimoto Coefficient-based Similarity

本文介绍了Tanimoto系数(也称Jaccard系数),一种用于评估用户与物品间关联程度的相似度指标。该系数仅关注用户是否对物品有过评价,并通过计算共同评价物品的数量与所有评价物品数量的比例来衡量相似度。
AI助手已提取文章相关产品:

Tanimoto Coefficient和前面的5中相关度计算方式有很大的不同,它不关心用户对物品的具体评分值是多少,它在关心用户与物品之间是否存在关联关系。还记得上一篇文章《Mahout学习笔记——数据承载》里面提到的布尔喜好值(Boolean Preference)吧!Tanimoto Coefficient依赖于用户和物品之间的这种Boolean关系作为输入。

更准确的说法为:Tanimoto Coefficient主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具体值的大小,只能获得“是否相同”这个结果,所以Tanimoto Coefficient只关心个体间共同具有的特征是否一致这个问题。Tanimoto Coefficient又被叫做Jaccard Coefficient,其值等于两个用户共同关联(不管喜欢还是不喜欢)的物品数量除于两个用户分别关联的所有物品数量。

也就是关联的交集除于关联的并集,用公式表示为:

其值介于[0, 1]之间,如果两个用户关联的物品完全相同,交集等于并集,值为1;如果没有任何关联,交集为空,值为0。

注:本块中提及的关联指用户对物品有评分值

您可能感兴趣的与本文相关内容

import pandas as pd import numpy as np from itertools import combinations def jaccard_similarity(set1, set2): """计算Jaccard相似度系数""" intersection = len(set1 & set2) union = len(set1 | set2) return intersection / union if union != 0 else 0 def dice_similarity(set1, set2): """计算Dice相似度系数""" intersection = len(set1 & set2) return (2 * intersection) / (len(set1) + len(set2)) if (len(set1) + len(set2)) != 0 else 0 def overlap_similarity(set1, set2): """计算重叠相似度系数""" intersection = len(set1 & set2) min_size = min(len(set1), len(set2)) return intersection / min_size if min_size != 0 else 0 # 读取Excel文件 file_path = "sets_data.xlsx" # 替换为你的文件路径 df = pd.read_excel(file_path) # 检查数据格式转换为合 if not df.applymap(lambda x: isinstance(x, (int, float, bool))).all().all(): # 非二进制格式:每个单元格包含元素列表 sets = {col: set(df[col].dropna().astype(str).sum().split(';')) for col in df.columns} else: # 二进制格式:每行代表一个元素 sets = {} for col in df.columns: if df[col].dtype in [int, float, bool]: sets[col] = set(df.index[df[col].astype(bool)]) # 计算所有合对的相似度 set_names = list(sets.keys()) similarity_matrix = pd.DataFrame( np.zeros((len(set_names), len(set_names))), index=set_names, columns=set_names ) for (name1, set1), (name2, set2) in combinations(sets.items(), 2): jaccard = jaccard_similarity(set1, set2) dice = dice_similarity(set1, set2) overlap = overlap_similarity(set1, set2) # 存储结果(矩阵对称) similarity_matrix.loc[name1, name2] = jaccard similarity_matrix.loc[name2, name1] = jaccard # 添加对角线(相同合相似度为1) np.fill_diagonal(similarity_matrix.values, 1) # 保存结果 output_path = "similarity_matrix.xlsx" similarity_matrix.to_excel(output_path) print(f"相似度矩阵已保存至: {output_path}") # 打印示例结果 print("\n相似度矩阵示例:") print(similarity_matrix.head()) 上述代码获得的相似度系数要么为1要么为0,这是不正确的,请分析改正
最新发布
07-01
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值