协同过滤推荐算法
分为基于用户的协同过滤推荐UserCF和基于物品的协同过滤推荐ItemCF。介绍见《协同过滤的实现步骤》html
一、指导思想python
这种过滤算法的有效性基础在于:算法
1、用户偏好具备类似性,即用户可分类。这种分类的特征越明显,推荐准确率越高函数
2、物品之间具备类似性,即偏好某物品的人,都极可能也同时偏好另外一件类似物品测试
二、算法实现spa
总的来讲,要实现协同过滤,须要一下几个步骤:orm
1.收集用户偏好htm
2.找到类似的用户或物品blog
3.计算推荐get
2.一、收集用户偏好
用户行为 |
类型 |
特征 |
做用 |
评分 |
显式 |
整数量化值[0,n] |
能够获得精确偏好 |
投票 |
显式 |
布尔量化值0|1 |
能够获得精确偏好 |
转发 |
显式 |
布尔量化值0|1 |
能够获得精确偏好 |
保存书签 |
显式 |
布尔量化值0|1 |
能够获得精确偏好 |
标记书签Tag |
显式 |
一些单词 |
须要进一步分析获得偏好 |
评论 |
显式 |
一些文字 |
须要进一步分析获得偏好 |
点击流 |
隐式 |
一组点击记录 |
须要进一步分析获得偏好 |
页面停留时间 |
隐式 |
一组时间信息 |
噪音偏大,很差利用 |
购买 |
隐式 |
布尔量化值0|1 |
能够获得精确偏好 |
2.二、原始偏好数据的预处理
v 用户行为识别/组合
在通常应用中,咱们提取的用户行为通常都多于一种,关于如何组合这些不一样的用户行为,好比,能够将用户行为分为“查看”和“购买”等等,而后基于不一样的行为,计算不一样的用户 / 物品类似度。
相似于当当网或者京东给出的“购买了该图书的人还购买了 ...”,“查看了图书的人还查看了 ...”
v 喜爱程度加权
根据不一样行为反映用户喜爱的程度将它们进行加权,获得用户对于物品的整体喜爱。
通常来讲,显式的用户反馈比隐式的权值大,但比较稀疏,毕竟进行显示反馈的用户是少数;同时相对于“查看”,“购买”行为反映用户喜爱的程度更大,但这也因应用而异。
v 数据减噪和归一化。
① 减噪:用户行为数据是用户在使用应用过程当中产生的,它可能存在大量的噪音和用户的误操做,咱们能够经过经典的数据挖掘算法过滤掉行为数据中的噪音,这样可使咱们的分析更加精确。
② 归一化:如前面讲到的,在计算用户对物品的喜爱程度时,可能须要对不一样的行为数据进行加权。但能够想象,不一样行为的数据取值可能相差很大,好比,用户的查看数据必然比购买数据大的多,如何将各个行为的数据统一在一个相同的取值范围中,从而使得加权求和获得的整体喜爱更加精确,就须要咱们进行归一化处理。最简单的归一化处理,就是将各种数据除以此类中的最大值,以保证归一化后的数据取值在 [0,1] 范围中。
v 造成用户偏好矩阵
通常是二维矩阵,一维是用户列表,另外一维是物品列表,值是用户对物品的偏好,通常是 [0,1] 或者 [-1, 1] 的浮点数值。
2.三、找到类似物品或用户
当已经对用户行为进行分析获得用户喜爱后,咱们能够根据用户喜爱计算类似用户和物品,而后基于类似用户或者物品进行推荐,这就是最典型的 CF 的两个分支:基于用户的 CF 和基于物品的 CF。这两种方法都须要计算类似度,下面咱们先看看最基本的几种计算类似度的方法。
2.四、类似度的计算
类似度的计算,现有的几种基本方法都是基于向量(Vector)的,其实也就是计算两个向量的距离,距离越近类似度越大。
在推荐的场景中,在用户 - 物品偏好的二维矩阵中,咱们能够将一个用户对全部物品的偏好做为一个向量来计算用户之间的类似度,或者将全部用户对某个物品的偏好做为一个向量来计算物品之间的类似度。
CF的经常使用方法有三种,分别是欧式距离法、皮尔逊相关系数法、余弦类似度法。
为了测试算法,给出如下简单的用好偏好数据矩阵:
行表示三名用户,列表示三个品牌,对品牌的喜好度按照1~5增长。
用户 |
苹果 |
小米 |
魅族 |
zhangsan |
5 |
5 |
2 |
Lisi |
3 |
5 |
4 |
wangwu |
1 |
2 |
5 |
就是计算每两个点的距离,好比Nike和Sony的类似度 。
数值越小,表示类似度越高。
def OsDistance(vector1, vector2): sqDiffVector = vector1-vector2 sqDiffVector=sqDiffVector**2 sqDistances = sqDiffVector.sum() distance = sqDistances**0.5 return distance
|
两个变量之间的相关系数越高,从一个变量去预测另外一个变量的精确度就越高,这是由于相关系数越高,就意味着这两个变量的共变部分越多,因此从其中一个变量的变化就可越多地获知另外一个变量的变化。若是两个变量之间的相关系数为1或-1,那么你彻底可由变量X去获知变量Y的值。
· 当相关系数为0时,X和Y两变量无关系。
· 当X的值增大,Y也增大,正相关关系,相关系数在0.00与1.00之间
· 当X的值减少,Y也减少,正相关关系,相关系数在0.00与1.00之间
· 当X的值增大,Y减少,负相关关系,相关系数在-1.00与0.00之间
当X的值减少,Y增大,负相关关系,相关系数在-1.00与0.00之间
相关系数的绝对值越大,相关性越强,相关系数越接近于1和-1,相关度越强,相关系数越接近于0,相关度越弱。
在python中用函数corrcoef实现
经过测量两个向量内积空间的夹角的余弦值来度量它们之间的类似性。0度角的余弦值是1,而其余任何角度的余弦值都不大于1;而且其最小值是-1。从而两个向量之间的角度的余弦值肯定两个向量是否大体指向相同的方向。两个向量有相同的指向时,余弦类似度的值为1;两个向量夹角为90°时,余弦类似度的值为0;两个向量指向彻底相
反的方向时,余弦类似度的值为-1。在比较过程当中,向量的规模大小不予考虑,仅仅考虑到向量的指向方向。余弦类似度一般用于两个向量的夹角小于90°以内,所以余弦类似度的值为0到1之间。
def cosSim(inA,inB): num = float(inA.T*inB) denom = la.norm(inA)*la.norm(inB) return 0.5+0.5*(num/denom) |
三、计算推荐
计算推荐的过程其实就是KNN算法的计算过程
算法思路
1. 构建物品的同现矩阵
2. 构建用户对物品的评分矩阵
3. 经过矩阵计算得出推荐结果
推荐结果=用户评分矩阵*同现矩阵(推荐结果=行*列)
如:4*2.0+3*0.0+4*0.0+3*4.0+1*4.5+2*0.0+0*5.0=24.0
实质:计算各类物品组合的出现次数