对于商品内容进行分析,进而根据商品内容进行推荐,是一种常用的推荐系统实现技术。但是如果商品种类很多,而且商品的属性很复杂,这样靠人工来标注商品的内容属性,就变得不太现实了。协同过滤技术正是为了解决这一问题而提出的,通过这种技术,我们不需要了解商品本身,只需要通过研究用户与商品这间的交互,就可以精准的向用户推荐他们可能感举趣的商品了。
具体到我们的个性题库系统,如果我们的客户有数以万计的题目,让人工来观看每个题目,然后给出这个题目有多少成份是知识点1,有多少成份是知识点2,是一件工作量非常巨大的事情。而且在实际应用中,我们对每个题目的描述,也不仅仅是知识点1、知识点2两个特征,所以实际应用中工作量非常巨大,这就是基于内容的推荐技术应用较少的原因。
如果我们换个角度来看待这个问题,我们还是用知识点1、知识点2两个特征来描述每个题目,但是我们并不知道每个题目到底是知识点1还是知识点2。为了解决这个问题,我们会评做每个学生,给该学生对知识点1、知识点2的需要程度进行打分,那么我们的研究问题就变成了已经参数集
{θ(1),θ(2),...,θ(nu)}
,来求出每部影片样本集
{x(1),x(2),...,x(nm)}
,如下所示:
* |
题目 |
张一 |
李二 |
王三 |
赵四 |
知识点1 |
知识点2 |
x(1)
|
题目1 |
5 |
5 |
0 |
0 |
? |
? |
x(2)
|
题目2 |
5 |
? |
? |
0 |
? |
? |
x(3)
|
题目3 |
? |
4 |
0 |
? |
? |
? |
x(4)
|
题目4 |
0 |
0 |
5 |
4 |
? |
? |
x(5)
|
题目5 |
0 |
0 |
5 |
? |
? |
? |
{θ(1),θ(2),...,θ(nu)}={⎡⎣⎢0.05.00.0⎤⎦⎥,⎡⎣⎢0.05.00.0⎤⎦⎥,⎡⎣⎢0.00.05.0⎤⎦⎥,⎡⎣⎢0.00.05.0⎤⎦⎥}
我们的任务就是根据上面的已知条件,推测出每个题目的特征向量
x(i)
。例如,我们要预测题目
x(1)
我们知道张一和李二都需要知识点1,而对知识点2掌握程度较好,而王三和赵四都非常需要知识点2,对知识点1掌握程度较好。通过上表可以看到,张一和李二对题目1的需要程度都是5分,而王三和赵四的需要程度则为0分,综合上面的信息,我们不难推测出题目1是知识点1的题目,而不是知识点2的题目,所以
x(1)
的值为:
x(1)=⎡⎣⎢⎢⎢x(1)0x(1)1x(1)2⎤⎦⎥⎥⎥=⎡⎣⎢1.01.00.0⎤⎦⎥
注意,在上面的表示中
x(1)0
始终为1,
θ(0)
取0,代表偏移量。
那么我们的推测是否正确呢?因为我们已经知道了参数集
{θ(1),θ(2),...,θ(nu)}
,同时知道了当前样本的特征向量
x(1)
,我们可以很方便地求出每个学生对题目1的需要程度,通过与学生对这个题目的实际需要程度,我们就可以得出我们对x(1)的推测是否正确,学生j对题目i的打分可以通过如下公式计算:
y^(i,j)=θ(j)2x(i)
具体计算过程如下所示:
y^(1,1)=θ(1)2x(1)=⎡⎣⎢0.05.00.0⎤⎦⎥T⎡⎣⎢1.01.00.0⎤⎦⎥=5.0
y^(1,2)=θ(2)2x(1)=⎡⎣⎢0.05.00.0⎤⎦⎥T⎡⎣⎢1.01.00.0⎤⎦⎥=5.0
y^(1,3)=θ(3)2x(1)=⎡⎣⎢0.00.05.0⎤⎦⎥T⎡⎣⎢1.01.00.0⎤⎦⎥=0.0
y^(1,4)=θ(4)2x(1)=⎡⎣⎢0.05.00.0⎤⎦⎥T⎡⎣⎢1.01.00.0⎤⎦⎥=5.0
从上面可以看出,我们的计算结果与学生的实际需求程度结果是一致的,这证明我们对
x(1)
的预测是准确的。
这就引出了我们的协同过滤算法,对于题目i,我们首先需要选取适当的
x(i)
,使得我们预测出的学生对题目i的需要程度与用户实际对题目i的需要程度误差得到最小值,我们假设
m(i)
为影片i的所有评分数量:
minx(i)12m(i)∑i:r(i,j)=1(θ(j)Tx(i)−y(i,j))2
为了提高模型的范化能力,我们在上式上加入
L2
调整项,表明我们希望参数
x(i)
的2范式平方最小,即参数值越小越好,如下所示:
minx(i)(12m(i)∑i:r(i,j)=1(θ(j)Tx(i)−y(i,j))2+λ2m(i)∑k=1nx(i)k2)
与上一节类似,我们也去掉不影响取得极小值的
m(i)
,得到最终的代价函数为:
minx(i)(12∑i:r(i,j)=1(θ(j)Tx(i)−y(i,j))2+λ2∑k=1nx(i)k2)
我们不仅需要学习题目i的参数向量
x(i)
,我们需要学习所有题目参数向量
{x(1),x(2),x(3),...,x(nm)}
,所以代价函数就变为如下式所示:
minx(1),x(2),x(3),...,x(nm)(12∑i=1nm∑i:r(i,j)=1(θ(j)Tx(i)−y(i,j))2+λ2∑i=1nm∑k=1nx(i)k2)
通过上面的讨论,我们可以得到代价函数为:
J(x(1),x(2),x(3),...,x(nm))=minx(1),x(2),x(3),...,x(nm)(12∑i=1nm∑i:r(i,j)=1(θ(j)Tx(i)−y(i,j))2+λ2∑i=1nm∑k=1nx(i)k2)
我们采用梯度下降算法,可以得到如下公式:
当
k=1,…,n
时:
x(i)k=x(i)k−α(∑i:r(i,j)=1(θ(j)Tx(i)−y(i,j))θ(j)k+λx(i)k)
式中
α
为超参数学习率,需要人工设定。
在有了上两节介绍的算法之后,我们就可以根据我们的实际情况,应用其中的一种算法,来进行推荐了。在实践中,我们其实可以将两种方法结合起来,取得更好的推荐效果。我们首先确定题目的特征向量,例如在本例中知识点1、知识点2特征,然后我们估计每个学生对这些特征的需要程度,即估计参数集
{θ(1),θ(2),...,θ(nu)}
,然后我们运行协同过滤算法,学习出每个题目的特征向量。接着我们以新学习出来的特征向量为基础,通过内容推荐算法,重新学习出新的参数集
{θ(1),θ(2),...,θ(nu)}
,此时的参数集会比我们开始时的估计值要好很多。我们可以再以新的参数集为输入,利用协同过滤算法求出每道题目的特征向量,这个过程可以一直进行下去,直到得到令人满意的结果。
但是这种方法有一个缺点,就是要运行两个独立的线性回归模型,效率比较低下。在下一节中,我们将介绍将两个算法结合起来,一次可以同时学习参数集和特征向量。