zoukankan      html  css  js  c++  java
  • 推荐系统(一)

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

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

    让用户给他看过的书打分,比如: 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 + 平均值),即为平均值,这样显然比不使用平均值归一化合理。

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

  • 相关阅读:
    numpy数组行列拼接
    Dropout和BN层的模式切换
    利用sklearn计算决定系数R2
    从曲线图中提取原始数据
    Matlab在极坐标中绘图
    MATLAB中scatter绘制散点图
    说一说你对HTML5语义化的理解
    第十一章 前端开发-html
    详解mysql int类型的长度值问题
    进程间通信(队列和管道)
  • 原文地址:https://www.cnblogs.com/activeshj/p/3702467.html
Copyright © 2011-2022 走看看