推荐系统(2)--计算皮尔逊相关系数

计算皮尔逊相关系数

代码如下:

#-*- coding:utf-8 -*-
'''
 皮尔逊相关系数
'''
import  json
import numpy as np

# 计算user1 和 user2的相关系数
def pearson_score(dataset,user1,user2):
    if user1 not in dataset:
        raise TypeError('User'+user1+'not present in the dataset')
    if user2 not in dataset:
        raise TypeError('User'+user2+'not present in the dataset')
    # 提取两个用户都评过分的电影
    rated_by_both = {}
    for item in dataset[user1]:
       if item in dataset[user2]:
           rated_by_both[item]=1
    num_ratings=len(rated_by_both)
    # 如果两个用户都没有评分 则说明两个用户之间没有相似度 返回值为0
    if num_ratings==0:
        return  0
    # 计算相同评分电影的平方值之和
    user1_sum=np.sum([dataset[user1][item] for item in rated_by_both])
    user2_sum=np.sum([dataset[user2][item] for item in rated_by_both])

    # 计算相同电影的评分的平方和
    user1_squared_sum=np.sum([np.square(dataset[user1][item]) for item in rated_by_both])
    user2_squared_sum=np.sum([np.square(dataset[user2][item]) for item in rated_by_both])

    # 计算数据集的乘积之和
    product_sum=np.sum([dataset[user1][item]*dataset[user2][item] for item in rated_by_both])

    # 计算皮尔逊相关系数
    Sxy=product_sum-(user1_sum*user2_sum/num_ratings)
    Sxx=user1_squared_sum-np.square(user1_sum)/num_ratings
    Syy=user2_squared_sum-np.square(user2_sum)/num_ratings

    # 考虑分母为0的情况
    if Sxx*Syy==0:
        return 0
    # 如果上述正常 返回皮尔逊相关系数
    return Sxy/np.sqrt(Sxx*Syy)


if __name__=='__main__':
    data_file='movie_ratings.json'
    with open(data_file,'r') as f:
        # 函数注意...()
        data=json.loads(f.read())
    user1='John Carson'
    user2='Michelle Peterson'

    print '\n 皮尔逊相关系数:'
    print pearson_score(data,user1,user2)



输出结果如下:

 皮尔逊相关系数:
0.396059017191
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值