协同过滤用户相似度度量

闵氏距离(Minkowski Distance)

当r=1时,曼哈顿距离(Manhatten)

当r=2时,欧氏距离(Euclidean)

r=无穷大,上确界距离(Supermum Distance)

皮尔逊相关系数(Pearson CORRELATION Coeffcient),取值[-1,1],1表示完全相关,-1表示完全不相关

近似计算公式

余弦相似度计算,取值[-1,1],1表示完全相似,-1表示完全不相似

users = {"Angelica": {"Blues Traveler": 3.5, "Broken Bells": 2.0, "Norah Jones": 4.5, "Phoenix": 5.0, "Slightly Stoopid": 1.5, "The Strokes": 2.5, "Vampire Weekend": 2.0},
         "Bill":{"Blues Traveler": 2.0, "Broken Bells": 3.5, "Deadmau5": 4.0, "Phoenix": 2.0, "Slightly Stoopid": 3.5, "Vampire Weekend": 3.0},
         "Chan": {"Blues Traveler": 5.0, "Broken Bells": 1.0, "Deadmau5": 1.0, "Norah Jones": 3.0, "Phoenix": 5, "Slightly Stoopid": 1.0},
         "Dan": {"Blues Traveler": 3.0, "Broken Bells": 4.0, "Deadmau5": 4.5, "Phoenix": 3.0, "Slightly Stoopid": 4.5, "The Strokes": 4.0, "Vampire Weekend": 2.0},
         "Hailey": {"Broken Bells": 4.0, "Deadmau5": 1.0, "Norah Jones": 4.0, "The Strokes": 4.0, "Vampire Weekend": 1.0},
         "Jordyn":  {"Broken Bells": 4.5, "Deadmau5": 4.0, "Norah Jones": 5.0, "Phoenix": 5.0, "Slightly Stoopid": 4.5, "The Strokes": 4.0, "Vampire Weekend": 4.0},
         "Sam": {"Blues Traveler": 5.0, "Broken Bells": 2.0, "Norah Jones": 3.0, "Phoenix": 5.0, "Slightly Stoopid": 4.0, "The Strokes": 5.0},
         "Veronica": {"Blues Traveler": 3.0, "Norah Jones": 5.0, "Phoenix": 4.0, "Slightly Stoopid": 2.5, "The Strokes": 3.0}
        }#{用户:{作品:评分}}
def manhattan(rating1, rating2):#计算曼哈顿距离
    """Computes the Manhattan distance. Both rating1 and rating2 are dictionaries
       of the form {‘The Strokes‘: 3.0, ‘Slightly Stoopid‘: 2.5}"""
    distance = 0
    commonRatings = False
    for key in rating1:
        if key in rating2:
            distance += abs(rating1[key] - rating2[key])
            commonRatings = True
    if commonRatings:
        return distance
    else:
        return -1
def pearson(rating1, rating2):#计算Pearson相关系数
    sum_xy = 0
    sum_x = 0
    sum_y = 0
    sum_x2 = 0
    sum_y2 = 0
    n = 0
    for key in rating1:
        if key in rating2:
            n += 1
            x = rating1[key]
            y = rating2[key]
            sum_xy += x * y
            sum_x += x
            sum_y += y
            sum_x2 += pow(x, 2)
            sum_y2 += pow(y, 2)
    # now compute denominator
    denominator = sqrt(sum_x2 - pow(sum_x, 2) / n) * sqrt(sum_y2 - pow(sum_y, 2) / n)
    if denominator == 0:
        return 0
    else:
        return (sum_xy - (sum_x * sum_y) / n)/denominator

相似度的选择:

当不同用户对不同商品评价标准的范围不一样时,使用皮尔逊相关系数;

当数据稠密,且属性值大小十分重要,使用欧氏或者曼哈顿距离;

当数据稀疏,存在很多零值,考虑余弦相似度。

来自《A Programmer‘s Guide To Data Mining》

时间: 2024-12-20 20:58:26

协同过滤用户相似度度量的相关文章

基于协同过滤的个性化Web推荐

         下面这是论文笔记,其实主要是摘抄,这片博士论文很有逻辑性,层层深入,所以笔者保留的比较多.          看到第二章,我发现其实这片文章对我来说更多是科普,科普吧-- 一.论文来源 Personalized Web Recommendation via Collaborative Filtering(很奇怪via为什么小写,先记住吧) (Candidate)博士研究生:孙慧峰 (Advisor)导师:陈俊亮(院士) (Academic Degree Applied for)

Apache Mahout之协同过滤原理与实践

Apache Mahout之协同过滤原理与实践 读书时期,选课是令人怀念的,因为自由,学生可以挑选自己喜爱的课程和老师!然而,过程并不是很美好,"系统繁忙,稍后重试!"屡有发生,于是大伙开心地约定今夜不战不休.西门的七彩路,和网吧名一样,我们从门口路过,进的却是右旁的可媛.这里网页同样坚持"系统繁忙,稍后重试!"!去的人多了,也就组了局.痛并快乐着应该如此!那以后,我们这堆人中出了一批又一批的高手,操作极限,走位妖娆,那都不是事儿! 戏后,一场深思悄然浮现:如果系统

【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)

好早的时候就打算写这篇文章,但是还是参加阿里大数据竞赛的第一季三月份的时候实验就完成了,硬生生是拖到了十一假期,自己也是醉了...找工作不是很顺利,希望写点东西回顾一下知识,然后再攒点人品吧,只能如此了. 一.问题背景 二.基于用户的协同过滤算法介绍 三.数据结构和实验过程设计 四.代码 一.问题背景 首先介绍一下问题的背景,现在我有四个月的用户.品牌数据<user,brand>,即用户在这四个月中的某一天购买了某个品牌(当然为了简化算法模型,将购买时间省去,后面再说).即现在有这四个月的数据

【推荐系统】协同过滤之基于用户的最近邻推荐

1.算法简介 协同过滤(collaborative filtering)的核心思想:利用其他用户的行为来预测当前用户.协同过滤算法是推荐系统中最基本的,同时在业界广为使用.根据使用的方法不同,可以分为基于用户(user-based).基于物品(item-based)的最近邻推荐. 基于用户的最近邻推荐的主要思想与kNN有点相似:对于一个给定的评分集,找出与当前用户u口味相近的k个用户:然后,对于用户u没有见过的物品p,利用k个近邻对p进行预测评分.由此引出了两个问题,一是如何度量用户与用户间的相

[原]【推荐系统】协同过滤之基于用户的最近邻推荐

1.算法简介 协同过滤(collaborative filtering)的核心思想:利用其他用户的行为来预测当前用户.协同过滤算法是推荐系统中最基本的,同时在业界广为使用.根据使用的方法不同,可以分为基于用户(user-based).基于物品(item-based)的最近邻推荐. 基于用户的最近邻推荐的主要思想与kNN有点相似:对于一个给定的评分集,找出与当前用户u口味相近的k个用户:然后,对于用户u没有见过的物品p,利用k个近邻对p进行预测评分.由此引出了两个问题,一是如何度量用户与用户间的相

spark基于用户的协同过滤算法与坑点,提交job

承接上文: http://blog.csdn.net/wangqi880/article/details/52875524 对了,每台机子的防火墙要关闭哈,不然spark集群启动不起来 前一次,已经把spark的分布式集群布置好了,今天写一个简单的案例来运行.会写一些关于spark的推荐的东西,这里主要有4点,1基于用户协同过滤,2基于物品协同过滤,3基于模型的协同过滤,4基于关联规则的推荐(fp_growth),只写核心代码啊. 基于spark用户协同过滤算法的实现 1用户协同过滤算法 1.1

《推荐系统》基于用户和Item的协同过滤算法的分析与实现(Python)

1:协同过滤算法简介 2:协同过滤算法的核心 3:协同过滤算法的应用方式 4:基于用户的协同过滤算法实现 5:基于物品的协同过滤算法实现 一:协同过滤算法简介 关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看最近有什么好的电影推荐.在问的时候,都习惯于问跟自己口味差不 多的朋友,这就是协同过滤的核心思想. 协同过滤是在海量数据中挖掘出小部分与你品味类似的用户,在协同过滤中,这些用户成为邻居,然后根据他们喜欢的东西

推荐算法之基于用户的协同过滤

基于用户的的协同过滤算法是推荐统统最古老的算法,简称UserCF.该算法的诞生一定程度上标志着推荐系统的诞生.本文将对UserCF算法原理进行讲解,并且基于Movielens数据集给出实现代码供大家交流学习. 基本原理 在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,先找到和他相似兴趣的其他用户,然后把那些用户喜欢的而用户A没有听说过的物品推荐给用户A.这种方法就称为基于用户的协同过滤算法.该算法主要包括两个步骤: 找到和目标用户兴趣相似的用户集合 找到这个集合中用户喜欢的且目标用户没

Mahout实现基于用户的协同过滤算法

Mahout中对协同过滤算法进行了封装,看一个简单的基于用户的协同过滤算法. 基于用户:通过用户对物品的偏好程度来计算出用户的在喜好上的近邻,从而根据近邻的喜好推测出用户的喜好并推荐. 图片来源 程序中用到的数据都存在MySQL数据库中,计算结果也存在MySQL中的对应用户表中. package com.mahout.helloworlddemo; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.