相似度度量

相似度度量关注的是两个对象是否相似,相似程度是多少?比如两张图片、两篇文章、两句话、两个人的喜好的相抵程度等。

为了度量相似度,首先需要将比较对象转换成实数向量,这样计算机才能够理解。对象类型不同,转换方式也不同,最终目的都是将比较对象转换成实数向量。

转换成实数向量之后就可以通过计算两个实数向量的相似度来作为对象的相似度。相似度的计算方法有很多种,常见的有余弦相似度、皮尔森相关系数。

余弦相似度

$$CosineSim(A,B) = \frac{A\cdot B}{\Vert A\Vert \Vert B \Vert}$$

皮尔森相关系数

$$PearsonSim(A,B) = \frac{(A - \overline{A})(B - \overline{B})}{\Vert A - \overline{A} \Vert \Vert B - \overline{B} \Vert}$$

余弦和皮尔森之间的换算关系

$$PearsonSim(A,B) = CosineSim(A - \overline{A}, B - \overline{B})$$

余弦相似度会直接计算两个向量的相似度,而皮尔森相关系数消除了A、B的绝对值大小对相似度的影响,主要关注的是向量的变化趋势。皮尔森相关系数的这个特性使得其在计算用户与用户的相似度时非常实用。因为不同用户的评分习惯不一样(评分的平均值不同),有的用户习惯打高分、有的用户喜欢打低分。假设两个用户,一个用户喜欢给物品打高分,一个用户喜欢打低分,即使两个用户的喜好非常相似,两者的余弦相似度也会比较低,但是皮尔森相关系数的值就会比较高,显然这里皮尔森更接近实际情况。

协同过滤

协同过滤是推荐系统常用的算法

协同过滤核心思想

假设要为用户A推荐物品。第一步要寻找和用户A喜好相似的用户。第二步是根据这些相似用户的评分预测用户A对未评分物品的评分,如果评分合适的话就进行推荐。

因为不同用户的评分习惯不一样,所以这个场景下使用皮尔森相关系数来度量相似度更为精确。

如何预测用户a在物品i上的评分

基础方法

用$r_{a,i}$表示用户a在物品i上的评分,$U_a$表示和用户a相似的用户集合,那么预测用户a对物品i的评分:

$$r_a,i = \frac { \sum _{u \in U _a } r _{u,i} } {n}$$

这里其实就是将所有相似用户对物品i的评分平均值作为用户a的评分预测。

评分的归一化

评分归一化是为了消除用户的评分习惯造成的预测误差,所以引入了用户评分平均值,用$\overline{r}_a$来表示 ,新的公式为:

$$r_a,i = \overline{r}_a + \frac { \sum _{u \in U _a } (r _{u,i} - \overline{r}_u) } {n}$$

加权平均

评分归一化的计算公式事实上假定了所有相似用户和用户a的相似程度都是一样的,但是很显然实际上不同用户之间的相似度是有差别的,所以在评分预测时可以根据用户与用户a的相似程度,进行加权平均。使用$w_{ua}$表示用户u的权重,引入加权平均后的预测公式如下:

$$r_a,i = \overline{r}_a + \frac { \sum _{u \in U _a } (r _{u,i} - \overline{r}_u) w _{ua} } {\sum _{u \in U _a } w _{ua}}$$

ICF(物品-物品协同过滤)

上面是以相似用户对物品i的评分来预测用户a对物品i的评分,也被称为UCF(用户-用户协同过滤)。但是也可以通过寻找用户a评过分的物品中和物品i相似的物品,然后计算用户a对这些相似物品的平均评分作为其对物品i的评分预测。同样的,可以使用归一化评分和加权平均对预测进行优化。