如果需要计算两个用户之间的相似度,我们自然会想到去计算这两个用户感兴趣的物品之间的相似度。但是计算用户感兴趣物品之间的相似度时,如何使这个相似度能最大最准确的反映用户之间的相似度呢?下面描述的这种方式在众多计算对数似然比的算法中被称为是最佳的。 首 先将两个用户共同感兴趣的物品的数量记为intersection,接着分别将两个用户中除了共同感兴趣的物品之外的物品数量记为beside1、 beside2,最后将两个用户都不感兴趣的物品数量记为beside12.比如推荐系统中物品编号为1,2,3,4,5,6,用户1对1,2,3感兴 趣,用户2对2,4感兴趣,那么intersection为1(只有一个2),beside1为2(有1,3),beside2为 1(4),beside12为2(5,6)。 有了这几个参数之后,这时候就需要根据这些参数来计算对数似然比了。计算步骤如下(行熵和列熵的计算可以倒换): 1. 计 算行熵(熵的概念:http://baike.baidu.com.cn/view/795686.htm): (intersection+beside2)log(intersection+beside2)- intersection log(intersection)- beside2log(beside2)+ (beside12+beside1)log(beside12+beside1)- beside12log(beside12)- beside1log(beside1)。以上面的例子:行熵=2log2-1log1-1log1+4log4-2log2-2log2。 2. 计 算列熵:(intersection+beside1)log(intersection+beside1)- intersection log(intersection)- beside1log(beside1)+ (beside12+beside2)log(beside12+beside2)- beside12log(beside12)- beside2log(beside2)。以上面为例子:列熵=3log3-1log1-2log2+4log4-2log2-2log2。 3. 计 算矩阵熵: (intersection+beside1+beside2+beside12)log(intersection+beside1+beside2+beside12)-(intersection)log(intersecion)-(beside1)log(beside1)-(beside2)log(beside2)-(beside12)log(beside12)。 以上面为例子:矩阵熵=6log6-1log1-2log2-1log1-2log2。 4. 如果行熵+列熵>矩阵熵则对数似然比为0.0(称为舍入错误),否则返回似然比=2*(矩阵熵-行熵-列熵)。 最 后获得的对数似然比其实可以用来对两个用户的相似度进行评估了,但是我们通常将相似度的值定义为0.0-1.0(0.0表示两个用户完全就是牛嘴和马 头,1.0表示两个用户是完美匹配,性别、年龄、身高等属性都相同,可称为好基友)。所以我们将对数似然比的值重新进行定义为:似然比/1.0+似然比 (这样不会因为重新定义而改变原对数似然比的反映程度)。最终这个值可以用来反映用户之间的相似程度。 除了计算 两个用户之间的相似程度之外,推荐系统中往往会涉及到基于内容的推荐方式,即通过两个物品之间的相似程度来进行推荐。计算两个物品之间的相似度和用户之间 的相似度算法是一样的,不过计算的参数是要针对于用户了:如同时对两个物品感兴趣的用户数量,对两个物品都不感兴趣的用户数量等。 有了相似度我们就可以在我们的网站上为用户进行推荐了,比如我们要向当前用户推荐一些他可能会感兴趣的物品,这时我们有两种方式进行推荐: 1. 可以将该用户感兴趣的物品逐一和其他物品进行计算相似度,如果相似度大于0.5则放入推荐箱(这时如果有推荐数量限制,则可以选择相似度最高的几个进行推荐)。 2. 将该用户和其他用户逐一进行计算相似度,如果相似度大于0.5(当然你也可以使用其他threshold已获得更佳的推荐)那么将其他用户的所有感兴趣的物品都推荐给该用户。 可 想而知,方式1的推荐方式会好一点。然而方式2在微博中的可能感兴趣的人中会有比较好的推荐效果。方式1还可以应用在某用户购买了某个物品后再向用户推荐 该物品的附带产品的情景中,比如京东商城的组合推荐功能。京东上的购买该物品的用户还购买了的功能可以简单的查下数据库就能给用户推荐一些物品,但是此种 做法推荐的效果不佳,往往会推荐一些毫无关系的物品,所以我们也需要计算物品之间的相似度后再进行推荐。