查看: 255|回复: 2

修正的余弦相似度

[复制链接]
论坛徽章:
67
知识图谱徽章
日期:2019-11-08 10:48:01python徽章
日期:2017-06-15 17:35:32Java徽章
日期:2017-06-09 15:42:21Docker徽章
日期:2017-05-25 16:49:05python徽章
日期:2017-03-09 16:45:33Java徽章
日期:2016-10-27 10:52:31投资理财徽章
日期:2016-08-25 10:49:04大型分布式徽章
日期:2016-05-12 12:14:29MongoDB徽章
日期:2015-12-17 11:48:55架构徽章
日期:2015-09-17 14:14:45R研习者中级
日期:2015-08-20 14:51:11数据陷阱解读徽章
日期:2015-08-13 15:21:46
发表于 2019-6-9 17:58 | 显示全部楼层 |阅读模式

tm HTML

回复

使用道具 举报

论坛徽章:
67
知识图谱徽章
日期:2019-11-08 10:48:01python徽章
日期:2017-06-15 17:35:32Java徽章
日期:2017-06-09 15:42:21Docker徽章
日期:2017-05-25 16:49:05python徽章
日期:2017-03-09 16:45:33Java徽章
日期:2016-10-27 10:52:31投资理财徽章
日期:2016-08-25 10:49:04大型分布式徽章
日期:2016-05-12 12:14:29MongoDB徽章
日期:2015-12-17 11:48:55架构徽章
日期:2015-09-17 14:14:45R研习者中级
日期:2015-08-20 14:51:11数据陷阱解读徽章
日期:2015-08-13 15:21:46
 楼主| 发表于 2019-6-9 17:58 | 显示全部楼层
我们使用余弦相似度来计算两个物品的距离。我们在第二章中提过“分数膨胀”现象,因此我们会从用户的评价中减去他所有评价的均值,这就是修正的余弦相似度。
回复 支持 反对

使用道具 举报

论坛徽章:
67
知识图谱徽章
日期:2019-11-08 10:48:01python徽章
日期:2017-06-15 17:35:32Java徽章
日期:2017-06-09 15:42:21Docker徽章
日期:2017-05-25 16:49:05python徽章
日期:2017-03-09 16:45:33Java徽章
日期:2016-10-27 10:52:31投资理财徽章
日期:2016-08-25 10:49:04大型分布式徽章
日期:2016-05-12 12:14:29MongoDB徽章
日期:2015-12-17 11:48:55架构徽章
日期:2015-09-17 14:14:45R研习者中级
日期:2015-08-20 14:51:11数据陷阱解读徽章
日期:2015-08-13 15:21:46
 楼主| 发表于 2019-6-9 17:59 | 显示全部楼层
# -*- coding: utf-8 -*-

from math import sqrt

users3 = {"David": {"Imagine Dragons": 3, "Daft Punk": 5,
                    "Lorde": 4, "Fall Out Boy": 1},
          "Matt": {"Imagine Dragons": 3, "Daft Punk": 4,
                   "Lorde": 4, "Fall Out Boy": 1},
          "Ben": {"Kacey Musgraves": 4, "Imagine Dragons": 3,
                  "Lorde": 3, "Fall Out Boy": 1},
          "Chris": {"Kacey Musgraves": 4, "Imagine Dragons": 4,
                    "Daft Punk": 4, "Lorde": 3, "Fall Out Boy": 1},
          "Tori": {"Kacey Musgraves": 5, "Imagine Dragons": 4,
                   "Daft Punk": 5, "Fall Out Boy": 3}}


def computeSimilarity(band1, band2, userRatings):
    averages = {}
    for (key, ratings) in userRatings.items():
        averages[key] = (float(sum(ratings.values())) / len(ratings.values()))

    num = 0 # 分子
    dem1 = 0 # 分母的第一部分
    dem2 = 0
    for (user, ratings) in userRatings.items():
        if band1 in ratings and band2 in ratings:
            avg = averages[user]
            num += (ratings[band1] - avg) * (ratings[band2] - avg)
            dem1 += (ratings[band1] - avg) ** 2
            dem2 += (ratings[band2] - avg) ** 2
    return num / (sqrt(dem1) * sqrt(dem2))

print(computeSimilarity('Kacey Musgraves', 'Lorde', users3))
print(computeSimilarity('Imagine Dragons', 'Lorde', users3))
print(computeSimilarity('Daft Punk', 'Lorde', users3))
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

 

GMT+8, 2019-11-23 02:42 , Processed in 0.158686 second(s), 30 queries .