协同过滤算法
所谓协同过滤算法,简单来说就是寻找臭味相投的人。
例如:
A喜欢电影a,b,c
B喜欢电影a,c,f
C喜欢电影b,e,h
D喜欢电影e,f,h
根据每个人的爱好的相通点,A喜欢a,c,B也喜欢,那么是否可以推测A喜欢的电影b,B也喜欢,B喜欢的f,A也喜欢。这时我们可以把b推荐给B,把f推荐给A,就跟平时淘宝上买东西一样,买完一样东西后淘宝会给你推送一个“购买此物品的人同时还购买了啥”,就是一个运用协同过滤算法的推荐系统。
原理
根据上述基本原理,我们可以将基于用户的协同过滤推荐算法拆分为两个步骤:
-
找到与目标用户兴趣相似的用户集合
-
找到这个集合中用户喜欢的、并且目标用户没有听说过的物品推荐给目标用户
发现兴趣用户
通常用 Jaccard 公式或者余弦相似度计算两个用户之间的相似度。设 N(u) 为用户 u 喜欢的物品集合,N(v) 为用户 v 喜欢的物品集合,那么 u 和 v 的相似度是多少呢:
Jaccard 公式:
余弦相似度:
这公式简单点说就是:交集元素的数目/俩集合元素的数量和。例如:
A,B之间,A:a,b,c 。B:a,c,f。那么明显
N(U(A)∩U(B))=N({a,c})=2,N(A)=3,N(B)=3,则余弦相似度WAB=2/3。
假设目前共有4个用户: A、B、C、D;共有5个物品:a、b、c、d、e。用户与物品的关系(用户喜欢物品)如下图所示
如何一下子计算所有用户之间的相似度呢?为计算方便,通常首先需要建立“物品—用户”的倒排表,如下图所示
然后对于每个物品,喜欢他的用户,两两之间相同物品加1。例如喜欢物品 a 的用户有 A 和 B,那么在矩阵中他们两两加1。即求A,B,C,D之间俩俩相交元素的个数,如下图所示:
计算用户两两之间的相似度,上面的矩阵仅仅代表的是公式的分子部分。以余弦相似度为例,对上图进行进一步计算:
上代码:
dic={
'A':('a','b','d'),'B':('a','c'),'C':('b','e'),'D':('c','d','e')}
def xtgl():
dicc={
}
d= {
}
for k,v in dic.items():
for i in v:
if(i not in d.keys()):
d[i]=set() //将字典的值设为集合,装入元素
d[i].add(k)
for k,item1 in d.items():
for i in item1:
for j in item1:
if<