您的位置:首页 > 大数据 > 云计算

一种简单有效的个性化推荐方法

2015-07-23 15:48 351 查看

一种简单有效的个性化推荐方法

作者:昔日的光

联系方式:xirideguang@gmail.com

声明:本文内容如果申请应用专利,专利申请权归作者之前所在的某公司所有。本文仅仅作相关算法的介绍。

一,选取的相似度定义

*定义1. 相似性是指物体和物体之间具有一些相同的属性。
*定义2. 相似度是指对相似性进行度量所得到的度量值,是物体A与物体B之间所具有的无差别的相同的属性的个数。

显然,这种定义方式定义的相似度是和共现概率成正比的。


二,基于该相似性的个性化推荐方法

1 离线相似性计算方法

假设推荐涉及到用户和物体两个集合。如果物体的属性值是来自总体服从均匀分布的样本,在没有特殊限制条件和差别干扰存在的情况下,可以把用户倾向操作的物体属性值(一般被称为“用户属性”),看成被测量值。实际操作的物体的属性值,看成是测量值。用户操作物体的过程,是一个测量过程。由测量误差是满足正态分布的,那么我们知道用户实际操作的物体,其属性值满足用户倾向操作的物体属性值为期望,以某种方差为方差的正态分布。若考虑的物体只有一个属性,可以被一个属性完整描述,则物体的属性值y与用户倾向操作的物体属性值x之间的相似度满足式(1)。


(1)

其中sim(x,y,δ)是表示相似度的值,这个值就是实际方差下的似然。δ的大小由测量过程中的干扰环境决定。

又假设用户倾向操作物体的属性值μ,是来自总体服从均匀分布的样本。那么又会有式(2)。


(2)

那么已知式(1)和式(2),可以得到式(3)。服从正态分布的独立随机变量的和,仍然是正态分布。这个是正态分布的性质[1],后面会证明。中间的积分过程会涉及一个非初等函数,它需要利用欧拉公式转换为极坐标下的函数来进行积分。


(3)

再由式(3)还可以计算得到式(4)。


(4)

以上的式子中,都假设了实际测量标准差是δ。另外物体都可以使用独立的属性进行描述,所以多个独立的属性描述的物体,对于每个独立的属性,都有和以上的推导过程类似的推导过程。比如原来的联合密度,标准差是(δ1,δ2,δ3,……),我们对每一个边缘密度进行类似的推导,由于属性的独立性,最终的联合密度,它的标准差还会是(δ1,δ2,δ3,……)。如果想象,某个用户倾向操作的物体属性值为x,利用用户倾向操作的物体的集合中的元素μ进行了对它的测量,测量方差和使用实际操作物体的集合来测量的方差相同,那么该计算过程,就是实现了这样的一个测量的过程。

这里给出式(3)的证明如下:


(5)

式(4)仅仅做个解释如下:

“式(4)分子中的平方,在指数上,相当于乘以 2。那么式(3)中 e 的指数形式,就满足式(4)应该呈现的 e 的指数形式。

又因为式(4)是一个归一化的过程,所以,除去 e 的 指数部分,剩下的常数值,必然是满足式(4)应该呈现的系数。否则,不满足和为1的要求!”

实际的数学问题是这样的。

表1 用户对物品的浏览情况

item_1item_2item_3
user_14**
user_2***
user_3***
实际这样的数据揭示的是这么一个简单的事。



C 是一个常数。我们可以得到一组这样的方程,然后解这个方程。我们总可以找到比未知数个数多得多的方程个数,然后解这个方程。获取一组最小二乘解。

如果我们得到了这个方程组的解,那么,所有物品和用户,以及物品和物品之间,用户和用户之间的相似度就都得到了。

但我们不需要这样(因为解这个方程太难),并且我们不需要知道物体的属性,只需要知道相似度的值,就有了前面的迭代求解办法。

我们从一组数据中,找到尽可能多的样本,来估计每个点处的概率分布。当样本数越多的时候,我们估计的越准确。 我们可以利用式(3)和式(4)不断的卷积和方差收缩,来获取足够多的样本,来使得这个相似度,和真实的相似度逼近

得益于大数据技术的发展,绝大多数的企业,都可以通过这种解析的办法来充分获取数据中隐藏的信息。另外在应对像应对大的企业的时候,数学解析给我们提供了优化计算量的简易办法。就是忽略一些样本数较少的计算,并做好折中。

由于计算的结果可以解释为概率,那么相似性结果的融合就变得容易起来(物品和标签之间的矩阵,同样可以利用上面的式子来计算相似度,我们把这些相似度进行融合)。我们可以将方差调整到一致,然后按比例相加,或者利用类似于贝叶斯公式的方法。方差是否一致,以及比例是多少,都可以通过对测试集的理论错误率来调整。

2 在线相似性计算方法

增量计算一直是个性化推荐中追求的目标,所以出现了online_learning算法。这里介绍基于这种相似度定义的在线推荐方法。它简单,并可以解决运算复杂度的问题, 值得在超大规模数据集上尝试 。其实它就是以上算法在时间上的展开。

在相似性计算过程中,卷积的过程,让方差不断增大。初始的相似度我一般把它称为0阶相似度。卷积一次,称为一阶相似度。

比如item_1的相似向量:

item_1=[1, 0, 0, 0]


即初始情况下,仅仅知道item_1是和它自己相似的。这样的相似度叫做0阶相似度。

对于user,在卷积过程中,为了实现累加的过程,有个寄存器。实际每次会做这样的计算,即

user_1=user_1*0.9 + item_1*(1-0.9)
=[0.25, 0.25, 0.25, 0.25]*0.9 + [1, 0, 0, 0]*0.1
=[0.3250, 0.2250, 0.2250, 0.2250];


0.9是滤波系数,这个公式是无限冲击响应低通滤波器,起平滑的作用;初始用户向量为白色噪声或者有色噪声。这个计算过程明显是o(n)复杂度的运算。因为这个是一次卷积过程,所以,它被称作对item的一阶相似度。

同样,

item_1=item_1*0.9 + user_1*(1-0.9)
=[1, 0, 0, 0]*0.9 + [0.3250, 0.2250, 0.2250, 0.2250]*0.1
=[0.9325, 0.0225, 0.0225, 0.0225];


得到的结果,这个时候的item_1的相似向量,是两次卷积后得到的结果。所以它被称作对item的二阶相似度。

……以此类推。阶数越多,对应方差越大,关联的物品越多。那么推荐效果越好。即离线中的不断卷积的过程。卷积无穷次的结果,我们叫无穷阶相似,简称无穷相似。

如果通过式(4)的方法, 将高阶的相似度,通过方差收缩,替换低阶的相似度 ,那么我们就可以近似的得到无穷相似度的效果。每次计算的时候,我们都做方差收缩的工作, 并替换低阶相似度。

每个物体,都“背”着相似度向量,“背”的个数越多效果越好。比如item背了0阶相似度,又背了个2阶相似度,又背了个4阶的…… 然后让高阶的相似度通过方差收缩,替换低阶的相似度。背多少向量,这个需要在计算复杂度和存储上做折中。

在线计算的框架是这样的:



这里需要框架的配合,比如Flume到Kafka这里可以随机丢失数据,storm是从Kafka这里去取数据的,推荐结果建议使用hbase。这样计算压力就都消失了。

通过在存储的地方,支持采样,这样的框架,可以应对非常大得数据量。并且是增量的,实时的计算,效果可能比online_learning之类的要好。

至此,这种相似度,在个性化推荐领域的应用,就简单介绍结束了。因为物体的属性不满足均匀分布,这个只需要对原来的矩阵,做如下的处理,再矩阵相乘就可以了。在线的计算也效仿这个公式。(怎么效仿?思考一下:D)


(6)

3 相似性计算结果的展示

我们的思维定式里面,推荐结果是按照排序来进行展示的。排序方式是方差最小化的一种展示方式。

如果我们得到一个相似向量:

user_1 = [0.4, 0.3, 0.2, 0.1];


这个相似性表示用户对物品1, 物品2, 物品3和物品4的偏好。如果我们只有一个展示位置,那么方差最小化的展示结果中,只会显示物品1。其实推荐结果应该以概率展现在这个位置。即物品1以0.4的概率,展示在位置1。

许多人采取随机的办法来展示(他可能意识到排序展示不对)。但是其他计算结果不能解释为概率的算法,导致展示出现困难,效果不好。

另外有一些人,想到可以已经展示而未点击的,做弱化权重的处理。但是,你并不能确定用户是否注意到这个推荐结果。

还有就是,相同的排序,可能有不同的概率向量。具体的概率值,提供了更加准确的展示方式。

如:

user_1 = [0.4, 0.25, 0.2, 0.15]


和以上的向量有相同的排序。在其他的算法中,他们可能得到的是相同的展现方式。那么以概率的展现方式,就能够充分利用数据中提供的信息,达到更好的推荐效果。

因为用户在确定是否点击物品的时候,就是这样一个有方差的测量过程。

另外还有小细节,比如滤波,频繁项系数, 错误率计算, 更多物体集合等情况, 这些大家有经验的都能搞定, 错误率、损失参照模式识别类书[2]中的做法(推荐问题是模式识别问题的子集,常常仅涉及离散属性)。

这样, 简单,效果好,可离线,可在线的通用的推荐系统 ,就可以建立起来了:D。

参考文献:

[1] 盛骤,谢式千,潘成毅,概率论与数理统计(第四版)[M],北京:高等教育出版社, 2008

[2] 边肇祺,张学工,模式识别(第二版)[M]. 北京:清华大学出版社,2000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息