- 签证留学 |
- 笔译 |
- 口译
- 求职 |
- 日/韩语 |
- 德语
另一个常用的距离计算方法就是余弦相似度(cosine similarity),其计算的是两个向量夹角的余弦值。如果夹角为90度,则相似度为0;如果两个向量的方向相同,则相似度为1.0。同皮尔逊相关系数一样,余弦相似度的取值范围也在-1到+1之间,因此我们也将它归一化到0到1之间。计算余弦相似度值,我们采用的两个向量A和B夹角的余弦相似度的定义如下:
其中,||A||、||B||表示向量A、B的2范数,你可以定义向量的任一范数,但是如果不指定范数阶数,则都假设为2范数。向量[4,2,2]的2范数为:
同样,NumPy的线性代数工具箱中提供了范数的计算方法linalg.norm()。
接下来我们将上述各种相似度的计算方法写成Python中的函数。打开svdRec.py文件并加人下列代码。
程序清单1 相似度计算
程序中的3个函数就是上面提到的几种相似度的计算方法。为了便于理解,NumPy的线性代数工具箱linalg被作为1a导人,函数中假定inA和inB都是列向量。perasSim()函数会检查是否存在3个或更多的点。如果不存在,该函数返回1.0,这是因为此时两个向量完全相关。
下面我们对上述函数进行尝试。在保存好文件svdRec.py之后,在Python提示符下输入如下命令:
>>> reload(svdRec)
<module 'gvdRec' from 'svdRec.pyc'>
>>> myMat=mat (svdRec.loadExData())
>>> svdRec.ecludSim(myMat[:,0],myMat[:,4])
0.12973190755680383
>>> svdRec.ecludSim(myMat [:,0],myMat[:,0])
1.0
欧氏距离看上去还行,那么接下来试试余弦相似度:
>>> svdRec.cosSim (myMat [:,0],myMat [:,4]]
0.5
>>> svdRec.cosSim(myMat [:,0],myMat [:,0])
1.0000000000000002
余弦相似度似乎也行,就再试试皮尔逊相关系数:
>>> svdRec.pearsSim(myMat [:,0],myMat [:,4])
0.20596538173840329>>> svdRec.pearsSim(myMat[:,0],myMat[:,0])
1.0
上面的相似度计算都是假设数据采用了列向量方式进行表示。如果利用上述函数来计算两个行向量的相似度就会遇到问题(我们很容易对上述函数进行修改以计算行向量之间的相似度)。这里采用列向量的表示方法,暗示着我们将利用基于物品的相似度计算方法。后面我们会阐述其中的原因。
2. 基于物品的相似度还是基于用户的相似度?
我们计算了两个餐馆菜肴之间的距离,这称为基于物品(item-based)的相似度。另一种计算用户距离的方法则称为基于用户(user-based)的相似度。回到图2,行与行之间比较的是基于用户的相似度,列与列之间比较的则是基于物品的相似度。到底使用哪一种相似度呢?这取决于用户或物品的数目。基于物品相似度计算的时间会随物品数量的增加而增加,基于用户的相似度计算的时间则会随用户数量的增加而增加。如果我们有一个商店,那么最多会有几千件商品。假如,最大的商店大概有100 000件商品。而在Netflix大赛中,则会有480000个用户和17700部电影。如果用户的数目很多,那么我们可能倾向于使用基于物品相似度的计算方法。
对于大部分产品导向的推荐引擎而言,用户的数量往往大于物品的数量,即购买商品的用户数会多于出售的商品种类。
3. 推荐引擎的评价
如何对推荐引擎进行评价呢?此时,我们既没有预测的目标值,也没有用户来调查他们对预测的满意程度。这里我们就可以采用前面多次使用的交叉测试的方法。具体的做法就是,我们将某些已知的评分值去掉,然后对它们进行预测,最后计算预测值和真实值之间的差异。
通常用于推荐引擎评价的指标是称为最小均方根误差(Root Mean Squared Error,RMSE)的指标,它首先计算均方误差的平均值然后取其平方根。如果评级在1星到5星这个范围内,而我们得到的RMSE为1.0,那么就意味着我们的预测值和用户给出的真实评价相差了一个星级。
责任编辑:admin