推荐系统(一)

(原创文章,转载请注明出处!)

如何给用户自动的推荐产品?比如推荐书。

让用户给他看过的书打分,比如: 0、1、2、3、4、5分。用户可以有很多个,书也可以有很多本不同的。用户给书打分就形成了一个二维表格: 

  用户A 用户B 用户C 用户D 用户E
小说1 5 1 4 4 2
小说2 4 1 4 4 ?
小说3 ? ? 5 ? 1
小说4 3 ? ? 2 ?
小说5 ? 5 1 ? 5
小说6 2 5 2 1 4

推荐系统需要自动预测出用户对还没有看过的书的可能的评分,评分高说明用户可能会更喜欢,就将这些预测评分高的书推荐给用户。

 

一、估计用户的θ

假设用户有n个,书有m本。书有三个属性x1、x2、x3,比如:x1表示科幻、x2表示武侠、x3表示言情。 

  x1 x2 x3
小说1 0.9 0 0.3
小说2 1.0 0.1 0.1
小说3 0 0.8 0.1
小说4 0.2 0.75 0
小说5 0 0 1.0
小说6 0 0.3 0.8

那么每本书的属性是一个4维向量:(x0  x1  x2  x3)T, x0是截距项,在计算时x0取值为1。

每个用户对应书的属性都有一个4维的参数向量:(θ0  θ1  θ2  θ3)T

每个用户对每本书的评分应该等于:θTx = θ0*x0 + θ1*x1 + θ2*x2 + θ3*x3

 那么问题就变成了,如何获得每个用户的(θ0  θ1  θ2  θ3) ?

 对用户A,可以建立目标函数:min Jaa) = (1/2)∑(θaTx - y)2 + (λ/2) * ∑θa2,用户A总共对4本书评分:

 min Jaa) = (1/2)[(θaTX1- 5)2+(θaTX2- 4)2+(θaTX4- 3)2+(θaTX6- 2)2] + (λ/2) * (θa12a22a32)

 对所有用户:

min J(θabcde) = ∑[J(θa) + J(θb) + J(θc) + J(θd) + J(θe)]

 可以使用梯度下降法就得最优化解。比如:对用户A,其参数可以通过如下形式求得:

θa0 =  θa0 - α∑(θaTx - y)2x0  (对评价过的4本书)

 θa1 = θa1- α{∑(θaTx - y)2x1 + λθa1}  (同上)

θa2 = θa2- α{∑(θaTx - y)2x2 + λθa2}  (同上)

θa3 = θa3- α{∑(θaTx - y)2x3 + λθa3}  (同上)

 

二、估计书的x

对以上例子换一个角度来考虑,比如事先不知道书是什么类型的,即:不知道每本书的属性值。

但知道每个用户对书的偏好,比如用户A偏好科幻的,用户B偏好言情的,用户C偏好科幻和武侠的,用户D偏好科幻的,用户E偏好言情的,即:

知道每个用户的θ,比如用户A:θa = (0  5 1 1)T

那么期望使得:θaTx1≈ 5 , θaTx2≈ 4 , θaTx4≈ 3 , θaTx6≈ 2 

可以建立对小说1的目标函数:min J(x1) = (1/2)*∑(θTx1-y)2 +(λ/2)*∑x12,在给定θ的情况下,来估计x。

有5个用户对小说1进行了评分,所以 :

min J(x1) = (1/2)*[(θaTx1 - ya1)2 + (θbTx1 - yb1)2 +(θcTx1 - yc1)2 +(θdTx1 - yd1)2  + (θaTx1 - ya1)2 ]  + (λ/2)*[x112 + x122 + x132 ]

对所有的小说(6本):

min J(x1,x2,x3,x4,x5,x6) = ∑[J(x1) + J(x2) + J(x3) + J(x4) + J(x5) + J(x6)]

使用梯度下降法求解。比如小说1的属性值如下:

x10 = x10 - α*∑[(θTx1-y)2θ0] (有5个用户对小说1评价)

x11 = x11 - α*{∑[(θTx1-y)2θ1] + λ*x11}(同上)

x12 = x12 - α*{∑[(θTx1-y)2θ2] + λ*x12}(同上)

x13 = x13 - α*{∑[(θTx1-y)2θ3] + λ*x13}(同上)

 

三、把对θ、x的估计结合起来

但在实际中,往往事先既不知道x,也不知道θ。通常可以:

  1. 随机的初始化θ
  2. 使用θ去估计x
  3. 使用估计得到的x,再去估计θ
  4. 重复步骤2、3

这样迭代的优化θ 与 x 的估计值。

可以将这种串行的逐一交替估计,揉和到一起:

min J(θabcde,x1,x2,x3,x4,x5,x6) = ∑[J(θa) + J(θb) + J(θc) + J(θd) + J(θe) + J(x1) + J(x2) + J(x3) + J(x4) + J(x5) + J(x6)]

使用梯度下降求解。比如:θa与x1

 θa1 = θa1- α{∑(θaTx - y)2x1 + λθa1}  (对评价过的4本书)

θa2 = θa2- α{∑(θaTx - y)2x2 + λθa2}  (同上)

θa3 = θa3- α{∑(θaTx - y)2x3 + λθa3}  (同上)

x11 = x11 - α*{∑[(θTx1-y)2θ1] + λ*x11}(有5个用户对小说1评价)

x12 = x12 - α*{∑[(θTx1-y)2θ2] + λ*x12}(同上)

x13 = x13 - α*{∑[(θTx1-y)2θ3] + λ*x13}(同上)

θa0与x10 没有了,因为现在所有的θ与x都放在一起训练,不能hard code θ0和x0等于1,所以不再人为的加入 θ0和x0

最后用训练好的θ与x就能对用户还没有看过的书预测评分。比如:用户A对小说3的评分=θaT*x3

随机初始化θ和x,使得它们被初始化为小的随机值。这样做的目的是为了打破对称性,使θ和x(各个θ、x中的各个分量)能被训练成不同的值。

如何确定x的维数,即:书有多少特征?通过算法学习的特征可能不一定就是人理解的特征。可以通过检验模型的预测效果来进行反复试验,找到一个较优的维数。

 

四、书的相似度

||xi - xj||。如何两本书的特征向量距离小,说明两本书相近。那么当用户浏览或阅读一本的书的时候,可以把相似度高的一些书(例如:top5或top10)推荐给用户。

所以推荐可以从两个角度来考虑:

1. 有θ的用户,可以通过计算θT*x来找用户喜欢的,然后结合||xi - xj||,形成推荐结果。

2. 无θ的用户,通过||xi - xj||,找与当前所浏览或阅读的书相近的书,形成推荐结果。

如何跨产品类型推荐?如:书、电影、食品、电脑、手机、包、etc。

 

五、均值归一化

算出每本书的评分的评价值,然后,将每本书的每个原始评分 - 平均值,得到均值归一化后的评分。

使用均值归一化后的评分来训练,得到θ和x,那么计算评分时需要加上评分平均值,即:θT*x + 平均值

对一个新用户,由于其没有对任何书进行评分,训练得到新用户的θ会为0(0向量)。如果不使用归一化后的评分进行训练,那么新用户对每本书的评分都会是θT*x=0;如果将新用户对每本书的原始评分,使用平均值来代替,那么他对每本书的评分=(θT*x + 平均值),即为平均值,这样显然比不使用平均值归一化合理。

使用均值归一化后,可以将新老用户使用统一的方式训练,方便推荐系统的进化。

 

 

posted @ 2014-08-07 21:59  activeshj  阅读(209)  评论(0编辑  收藏  举报