计算机技术发展下电子商务时代个性化推荐算法中的协同过滤算法

前言

计算机技术发展下电子商务时代个性化推荐算法中的协同过滤算法

计算机领域技术高速发展,电子商务时代得到普及,个性化的推荐系统深入到生活应用的各个方面。个性化推荐算法是推荐系统中最为核心的技术,它在很大程度上决定了电子商务推荐系统性能的好坏。个性化推荐系统应用最为广泛的技术是协同过滤推荐。协同过滤推荐主要有以下几种:基于用户的协同过滤推荐;基于项目的协同过滤推荐;基于模型的协同过滤推荐。

一、协同过滤算法描述

大数据时代产生了海量数据,这些数据蕴含着丰富价值。然而,大数据具有体量巨大、种类繁多以及产生速率很快的特点,所以海量数据并非都有价值,用户要从海量数据中提取有用且有针对性的信息,需要耗费大量的时间成本。比如,当你面对如此众多的电影列表时,你希望找到一部最契合自己兴趣的电影。由于电影的数量非常多,你不可能将所有的电影简介都浏览一遍。那么,该如何解决这个问题呢?电影平台会搜集你过去看过的所有电影,通过分析来了解你对何种类型的电影感兴趣,接着会有针对性地把你感兴趣的电影主动罗列出来呈现给你,这样你无需花费过多精力就能快速找到满足自身需求的电影。推荐算法就是为了解决这类实际需求而产生的。

推荐系统借助数据分析技术,去找出用户最有可能喜欢的东西并推荐给用户,如今很多电子商务网站都具备这一应用。当下使用较为广泛且较为成熟的推荐算法是协同过滤(Collaborative Filtering,简称 CF)推荐算法,其基本思想是依据用户以往的喜好以及其他兴趣相近用户的选择,来给用户推荐物品。

如图所示,在 CF 中,以 m×n 的矩阵来呈现用户对物品的喜好状况。通常用打分的方式来体现用户对物品的喜好程度,若分数较高,就意味着更喜爱该物品,而 0 则表示未曾购买过该物品。图中的行代表一个用户,列代表一个物品,Uij 指的是用户 i 对物品 j 的打分情况。CF 包含两个过程,其一为预测过程,其二为推荐过程。预测过程是对用户针对未购买过的物品进行可能打分值的预测,推荐是依据预测阶段所得出的结果,向用户推荐其最有可能喜欢的一个物品或者 Top-N 个物品。

二、协同过滤的实现

要实现协同过滤的推荐算法,要进行以下三个步骤:

1、收集数据

这里的数据指的是用户的历史行为数据。例如用户的购买历史,用户的关注行为,用户的收藏行为,或者用户发表了某些评论,用户给某个物品打了多少分等等。这些都能够用来作为数据供推荐算法使用,以服务于推荐算法。需要特别指出的是,不同的数据准确性存在差异,在使用时需要考虑到噪音所带来的影响。

从用户的行为以及偏好里去发现规律,然后依据此来给予推荐,怎样收集用户的偏好信息,这成为了系统推荐效果最基础的决定因素。用户有着诸多方式可以向系统提供自身的偏好信息,并且不同的应用也有可能差异极大,如下所示:

2、找到相似用户或物品

这一步其实就是计算用户间以及物品间的相似度。

关于相似度的计算,现有的几种基本方法是以向量(Vector)为基础的。实际上就是要计算两个向量的距离,距离越近,相似度就越大。在推荐的场景里,在用户与物品偏好的二维矩阵当中,我们能够把一个用户对所有物品的偏好当作一个向量,以此来计算用户之间的相似度;也可以把所有用户对某个物品的偏好当作一个向量,进而计算物品之间的相似度。下面我们细致地介绍几种常用的相似度计算方法:

下一步是作出预测。你可以运用下面的公式做一个预测:

进行推荐。首先是基于用户的协同过滤推荐,即 User-based Collaborative Filtering Recommendation。

基于用户的协同过滤推荐算法首先运用统计技术去找出与目标用户有着相同喜好的邻居,接着依据目标用户的邻居的喜好来为目标用户生成推荐。其基本原理是借助用户访问行为的相似性,以便相互推荐用户可能会感兴趣的资源,就如所展示的那样:

上图示意出基于用户的协同过滤推荐机制的基本原理。假设用户 A 喜欢物品 A 和物品 C,用户 B 喜欢物品 B,用户 C 喜欢物品 A、物品 C 和物品 D。从这些用户的历史喜好信息里,我们能发现用户 A 和用户 C 的口味及偏好较为类似。并且用户 C 还喜欢物品 D,所以我们可以推断出用户 A 可能也喜欢物品 D,进而可以将物品 D 推荐给用户 A。

基于用户的协同过滤推荐机制和基于人口统计学的推荐机制都要计算用户的相似度,且都基于“邻居”用户群来计算推荐。它们的不同之处在于计算用户相似度的方式。基于人口统计学的机制只考量用户自身的特征,而基于用户的协同过滤机制是在用户的历史偏好数据上进行计算。其基本假设是,喜欢类似物品的用户可能具有相同或相似的口味和偏好。

基于项目的协同过滤推荐这种方式,它主要是依据项目来进行相关的推荐操作。

通过所有用户对物品或信息的评价,能够找出物品与物品之间的相似度。接着,依据用户的历史偏好信息,把类似的物品推荐给该用户。如图所示。

上图表明了基于项目的协同过滤推荐的基本原理。用户 A 喜欢物品 A 和物品 C;用户 B 喜欢物品 A、物品 B 和物品 C;用户 C 喜欢物品 A。从这些用户的历史喜好来看,可以认为物品 A 与物品 C 比较类似,喜欢物品 A 的用户都喜欢物品 C。基于这个判断,用户 C 可能也喜欢物品 C,所以推荐系统将物品 C 推荐给了用户 C。

基于项目的协同过滤推荐是基于物品相似度预测推荐,且是从用户历史的偏好推断相似度。基于内容的协同过滤推荐也是基于物品相似度预测推荐,不过是基于物品本身的属性特征信息来度量相似度,二者相似度度量的方法不一样。

3.3、UserCF和ItemCF的区别

三、算法实例

以ItemCF为例子具体介绍下整个算法流程。

算法流程:

构建从用户指向物品的倒排;构建物品之间的同现矩阵;计算物品间的相似度,也就是计算相似矩阵;依据用户的历史记录,向用户推荐物品;算法流程 1

构建用户–>物品的倒排

如下表,行表示用户,列表示物品,1表示用户喜欢该物品

例如python构建的数据格式如下
{
A 的 a 为 1,A 的 b 为 1,A 的 d 为 1。
'B' 中,'c' 的值为 '1','b' 的值为 '1','e' 的值为 '1'。
'C' 包含 'c' 且其值为 '1' ,同时包含 'd' 且其值也为 '1' 。
“D”的“c”为“1”,“D”的“b”为“1”,“D”的“d”为“1”
'E' 的 'a' 为 '1','E' 的 'd' 为 '1'
}

算法流程2

构建物品与物品的同现矩阵

共现矩阵 C 所表示的是同时喜欢两个物品的用户数量,它是依据用户物品倒排表而计算得出的。例如,借助上面的用户物品倒排表,能够计算出如下这样的共现矩阵 C:

算法流程3

计算物品之间的相似度,即计算相似矩阵

其中两个物品之间的相似度如何计算?

设一个数用|N(i)|来表示喜欢物品 i 的用户数量,再设另一个数用|N(i)⋂N(j)|来表示同时喜欢物品 i 和物品 j 的用户数量,那么物品 i 与物品 j 的相似度就是:

式存在一个问题,若物品 j 是很热门的商品,人人都喜爱,那么 wij 就会很接近 1,也就是说,(1)式会使很多物品与热门商品具有很大的相似度,因此可以对公式进行改进:

算法流程 2 中的共现矩阵 C 实际上就是式(2)的分子。矩阵 N 用于计算分母,它表示喜欢某物品的用户数,而这个用户数是总的用户数。这样一来,式(2)中的分母就很容易求解出来了。

矩阵N如下所示:

利用式(2)便能计算物品之间的余弦相似矩阵如下:

算法流程4

根据用户的历史记录,给用户推荐物品;

最终推荐的是什么物品,是由预测兴趣度决定的。

物品 j 的预测兴趣度等于用户喜欢的物品 i 的兴趣度,并且物品 j 的预测兴趣度还等于物品 i 和物品 j 的相似度与用户喜欢的物品 i 的兴趣度的乘积

例如:A用户喜欢a,b,d ,兴趣度分别为1,1,1

推荐c的预测兴趣度=1X0.67+1X0.58=1.25

推荐e的预测兴趣度=1X0.58=0.58

四、python实现案例

from math import sqrt
import operator
#1.构建用户-->物品的倒排
def loadData(files):
    data ={}
    for line in files:
将每组数据按","进行分开操作,然后把分开后每组的数据分别赋予给对应的变量 user、score、item,即 user,score,item = line.split(",")
        data.setdefault(user,{})
        data[user][item]=score
    print ("----1.用户:物品的倒排----")
    print (data)
    return data
#2.计算
# 2.1 构造物品-->物品的共现矩阵
# 2.2 计算物品与物品的相似矩阵
def similarity(data):
    # 2.1 构造物品:物品的共现矩阵
    N={};#喜欢物品i的总人数
    C={};#喜欢物品i也喜欢物品j的人数
对于用户来说,对于数据中的每一个键值对,其中键为 user,值为 item 。
        for i,score in item.items():
            N.setdefault(i,0)
            N[i]+=1
            C.setdefault(i,{})
            for j,scores in item.items():
                if j not in i:
                    C[i].setdefault(j,0)
                    C[i][j]+=1
    print ("---2.构造的共现矩阵---")
    print ('N:',N)
    print ('C:',C)
    #2.2 计算物品与物品的相似矩阵
    W={};
    for i,item in C.items():
        W.setdefault(i,{})
        for j,item2 in item.items():
            W[i].setdefault(j,0)
W[i][j]等于 C[i][j]除以 N[i]与 N[j]乘积的平方根。
    print ("---3.构造的相似矩阵---")
    print (W)
    return W
#3.根据用户的历史记录,给用户推荐物品
定义 recommandList 函数,该函数接收 data、W、user 以及可选参数 k(默认为 3)和 N(默认为 10)。
    rank={}
获取用户 user 的历史记录,对于其中的每一项 i 和对应的分数 score,例如 A 用户的历史记录为 {'a': '1', 'b': '1', 'd': '1'}
首先对 W[i] 的键值对进行排序,排序依据是值,按照从大到小的顺序排列。然后取排序后的前 k 个键值对。对于每个键值对中的 j 和 w,j 是物品,w 是与物品 i 的相似度。
如果 j 不在 data[user]的键中:#该相似的物品不在用户 user 的记录里
                rank.setdefault(j,0)
                rank[j]+=float(score) * w
    print ("---4.推荐----")
首先获取 rank.items() 的排序结果,排序依据是 operator.itemgetter(1),即按照每个元素的第二个值进行排序,并且是降序排列。然后取排序后的结果中前 N 个元素。最后打印出这前 N 个元素。
首先获取 rank.items() 的排序结果,排序依据是 operator.itemgetter(1),即按照每个元素的第二个值进行排序,并且是降序排列。然后取排序后的结果中前 N 个元素。最终返回这前 N 个元素组成的列表。
当 __name__ 等于 '__main__' 时。
    #用户,兴趣度,物品
有 'D,1,d'。
'E,1,a' 以及 'E,1,d'
加载数据(uid_score_bid)后得到数据。
    W=similarity(data)#计算物品相似矩阵
recommandList 函数使用数据 data、参数 W、字符串 'A',并指定数量为 3 和范围为 10 进行推荐操作。

为了便于理解 python 的实现过程,此处仅使用了少量数据集,并且这些数据集是手动输入上去的。在实际应用中,可以添加一段代码来读取并处理数据文件,具体情况可根据实际需求进行操作。

五、算法的优缺点

这个算法的实现较为简单。然而,在实际的应用过程中,有时候会出现一些问题。

一些极为流行的商品,或许有很多人喜爱。将这类商品推荐给你,便没有太大意义。因此,在计算时,要么给这类商品加上一个权重,要么将这类商品完全剔除,这两种做法都是可行的。

还有,对于一些通用的物品,像在买书时用到的工具书,例如现代汉语词典、新华字典之类的,它们的通用性非常强,所以推荐它们就没有什么必要了。

UserCF和ItemCF优缺点的对比

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

26阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读