博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
机器学习 — 提供推荐
阅读量:7071 次
发布时间:2019-06-28

本文共 4413 字,大约阅读时间需要 14 分钟。

提供推荐

  1. 计算两个人的相似度
  2. 本来是推荐平均评分较高的作品,考虑到两个人的爱好相似程度,对评分根据相似度进行加权平均

计算相似度:

  1. 欧几里得距离
  2. pearson相关度
critics={'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5, 'The Night Listener': 3.0},'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5, 'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0, 'You, Me and Dupree': 3.5},'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0, 'Superman Returns': 3.5, 'The Night Listener': 4.0},'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'The Night Listener': 4.5, 'Superman Returns': 4.0, 'You, Me and Dupree': 2.5},'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0, 'You, Me and Dupree': 2.0},'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5},'Toby': {'Snakes on a Plane':4.5,'You, Me and Dupree':1.0,'Superman Returns':4.0}}

计算相关度

pearson相关系数计算公式()

pearson相关系数计算公式

from math import sqrt# 欧几里得距离评价def sim_distance(prefs, person1, person2):    si = {}    for item in prefs[person1]:        if item in prefs[person2]:            si[item] = 1                if len(si) == 0:        return 0        sum_of_squares = sum([pow(prefs[person1][item] - prefs[person2][item], 2)                         for item in prefs[person1] if item in prefs[person2]])    return 1 / (1 + sqrt(sum_of_squares))# 皮尔逊相关度评价def sim_pearson(prefs, person1, person2):    # 得到两者评价过的相同商品    si = {}    for item in prefs[person1]:        if item in  prefs[person2]:            si[item] = 1       n = len(si)    # 如果两个用户之间没有相似之处则返回1    if n == 0:        return 1        # 对各自的所有偏好求和    sum1 = sum([prefs[person1][item] for item in si])    sum2 = sum([prefs[person2][item] for item in si])        # 求各自的平方和    sum1_square = sum([pow(prefs[person1][item], 2) for item in si])    sum2_square = sum([pow(prefs[person2][item], 2) for item in si])        # 求各自的乘积的平方    sum_square = sum([prefs[person1][item] * prefs[person2][item] for item in si])        # 计算pearson相关系数    den = sqrt((sum1_square - pow(sum1, 2) / n) * (sum2_square - pow(sum2, 2) / n))    if den == 0:        return 0    return (sum_square - (sum1 * sum2/n)) / den
print sim_distance(critics, 'Lisa Rose', 'Gene Seymour')
0.294298055086
print sim_pearson(critics, 'Lisa Rose', 'Gene Seymour')
0.396059017191

评论者打分

def topMatches(prefs, person, n = 5, simlarity = sim_pearson):    scores = [(simlarity(prefs, person, other), other) for other in prefs if other != person]        # 对列表进行排序,评价高者排在前面    scores.sort()    scores.reverse()    # 取指定个数的(不需要判断n的大小,因为python中的元组可以接受正、负不在范围内的index)    return scores[0:n]

寻找和“Toby”有相似偏好的人,取前3个

topMatches(critics, 'Toby', n = 3)
[(0.9912407071619299, 'Lisa Rose'), (0.9244734516419049, 'Mick LaSalle'), (0.8934051474415647, 'Claudia Puig')]
# 利用其他所有人的加权平均给用户推荐def get_recommendations(prefs, person, similarity=sim_pearson):    # 其他用户对某个电影的评分加权之后的总和    totals = {}    # 其他用户的相似度之和    sim_sums = {}    for other in prefs:        # 不和自己比较        if other == person:            continue                # 求出相似度        sim = similarity(prefs, person, other)        # 忽略相似度小于等于情况0的        if sim <= 0:            continue                # 获取other所有的评价过的电影评分的加权值        for item in prefs[other]:            # 只推荐用户没看过的电影            if item not in prefs[person] or prefs[person][item] == 0:                #print item                # 设置默认值                totals.setdefault(item, 0)                # 求出该电影的加权之后的分数之和                totals[item] += prefs[other][item] * sim                # 求出各个用户的相似度之和                sim_sums.setdefault(item, 0)                sim_sums[item] += sim            # 对于加权之后的分数之和取平均值    rankings = [(total / sim_sums[item], item) for item, total in totals.items()]    # 返回经过排序之后的列表    rankings.sort()    rankings.reverse()    return rankings

给出Toby的电影推荐列表

print get_recommendations(critics, 'Toby')print get_recommendations(critics, 'Toby', similarity=sim_distance)
[(3.3477895267131013, 'The Night Listener'), (2.8325499182641614, 'Lady in the Water'), (2.5309807037655645, 'Just My Luck')][(3.457128694491423, 'The Night Listener'), (2.778584003814924, 'Lady in the Water'), (2.4224820423619167, 'Just My Luck')]

转载于:https://www.cnblogs.com/sunshine-2015/p/6517060.html

你可能感兴趣的文章
无缝升级Windows8.1普通版至专业版
查看>>
CentOS 6.3下nginx、php-fpm、drupal快速部署
查看>>
天猫国潮行动:卡萨帝F+冰箱成高端主推产品
查看>>
产品验证环节的失语现象
查看>>
【英文演讲】What are your strengths
查看>>
logstash推送mysql慢查询日志
查看>>
面试如何让自己赢在细节
查看>>
运维自动化之使用Cobbler自动化安装系统与FAQ
查看>>
实战1:创建Windows Server 2008域
查看>>
Windows 8实例教程系列 - 数据绑定高级实例
查看>>
批量查看mysql多从状态和修改多从主库指向
查看>>
Gartner:2016年十大信息安全技术(含解读)
查看>>
OSSIM系统用户审计
查看>>
如何使用Exchange邮件组仲裁
查看>>
使用Formik轻松开发更高质量的React表单(二)使用指南
查看>>
python写的部署windows下zabbix客户端脚本
查看>>
腾讯 vs 百度:两家互联网巨头对比
查看>>
数据中心的云计算之旅-【沈阳软件】2011年
查看>>
IOS7为什么遭吐槽?
查看>>
Android和.NET通用的AES算法
查看>>