一、背景

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

二、模型

2.1协同过滤的分类

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

2.1.1基于用户的协同过滤

对于用户 A,根据用户的历史偏好,计算得到一个邻居 - 用户 C,然后将用户 C 喜欢的物品 D推荐给用户 A。

协同过滤实现分析python 协同过滤算法代码_算法

2.1.2基于物品的协同过滤

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

协同过滤实现分析python 协同过滤算法代码_算法_02

三、 代码

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://github.com/xingzhexiaozhu/MovieRecommendation/blob/master/ItemCF/ItemCF.py (参考资料)