我正在玩编程集体智慧书中的欧几里德距离示例,
# Returns a distance-based similarity score for person1 and person2
def sim_distance(prefs,person1,person2):
# Get the list of shared_items
si={}
for item in prefs[person1]:
if item in prefs[person2]:
si[item]=1
# if they have no ratings in common, return 0
if len(si)==0: return 0
# Add up the squares of all the differences
sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
for item in prefs[person1] if item in prefs[person2]])
这是对影评人进行排名的原始代码,我正在尝试修改它以查找类似的帖子,基于我构建地图的标签,例如,
url1 - > tag1 tag2
url2 - > tag1 tag3
但如果将此应用于函数,
pow(prefs[person1][item]-prefs[person2][item],2)
这变为 0 因为标签没有权重相同的标签排名为 1。我修改了代码以手动创建差异进行测试,
pow(prefs[1,2)
然后我得到了很多 0.5 的相似度,但是同一篇文章与它自己的相似度下降到 0.3。我想不出一种将欧几里得距离应用于我的情况的方法?