协同过滤及其实现

一、背景

协同过滤相对于集体智慧而言,它从一定程度上保留了个体的特征,就是你的品位偏好,所以它更多可以作为个性化推荐的算法思想。

二、模型

2.1协同过滤的分类

基于用户的协同过滤算法(user-based collaboratIve filtering),和基于物品的协同过滤算法(item-based collaborative filtering)。简单的说就是:人以类聚,物以群分。

2.1.1基于用户的协同过滤

对于用户 A,根据用户的历史偏好,计算得到一个邻居 - 用户 C,然后将用户 C 喜欢的物品 D推荐给用户 A。
在这里插入图片描述

2.1.2基于物品的协同过滤

基于物品的 CF 的原理和基于用户的 CF 类似,只是在计算邻居时采用物品本身,而不是从用户的角度,即基于用户对物品的偏好找到相似的物品,然后根据用户的历史偏好,推荐相似的物品给他。计算物品的相似度矩阵。当物品数量过多时,采用字典存储,如果两个物品同时出现,则对应的字典值加1,类似于计算余弦时的两个向量的积
在这里插入图片描述

三、 代码


import math
import numpy as np
#用户-商品矩阵
def item_CF(R):
    m, n = R.shape #m行用户*n列电影
    for k in range(m):
        #每个用户下有有评分过的电影和没有评分过的电影
        have_score = [] #有评分项
        nohave_score = [] #无评分项
        for i in range(n):
            if R[k,i]:
                have_score.append(i)
            else:
                nohave_score.append(i)

        mpddicts = {}
        #计算没有评分项和有评分项之间的相似度
        for i in nohave_score:
            sums = 0
            for j in have_score:
                #j表示有评分的项,计算有评分项的用户的相似度
                sums += similiar(R[:,i],R[:,j])*R[k,j]  #加权相加 相似度*评分 与看过的电影求相似度
            mpddicts[i]=sums
        sorted__map2list = sorted(mpddicts.items(), key=lambda x: x[1], reverse=True)  #按照推荐度从高到低进行排序 返回的是列表
        print('对{}用户优先推荐商品编号依次是:'.format(k),end='')
        if sorted__map2list:
            for i in sorted__map2list:
                print(i[0],'该电影的推荐度是',i[1],end=', ') #1 (0,4)
            print()
        else:
            print('该用户所有的电影都看过了无法进行推荐')
 
#计算电影之间的余弦距离
def similiar(a,b):
    x = np.dot(a, b)
    y = 0
    z = 0
    la = len(a)
    lb = len(b)
    for i in range(la):
        y += pow(a[i], 2)
    y = math.sqrt(y)
    for i in range(lb):
        z += pow(b[i], 2)
    z = math.sqrt(z)
    return x / (y * z)
 
R = np.array([[1, 1, 1, 1, 0],
              [0, 0, 1, 1, 0],
              [0, 1, 1, 1, 1],
              [1, 1, 1, 1, 1],
              ])
item_CF(R)

四、参考资料

https://github.com/ChenaniahMe/codes/tree/main/CF (代码实现)
pianshen.com/article/6934883524/
https://www.cnblogs.com/qsxbc/p/13833736.html(皮尔逊相关系数)
https://github.com/xingzhexiaozhu/MovieRecommendation/blob/master/ItemCF/ItemCF.py
https://www.cnblogs.com/yangxiao99/p/4459595.html (参考资料)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值