大数据学习笔记(一)-提供推荐

1.获取数据:
这儿有一个开源的数据集grouplens
以及集体智慧编程上的数据集。以下是集体智慧编程上的一个关于电影评价的数据集

critices={
    'Lisa Rose':{
        'Lady in the Water':2.5,'Snakes on a plane':3.5,
        'Just My Luck':3.0,'Superman Returns':3.5,'You,Me and Dupree':2.5,
        'The Night Listener':3.0
    },
    'Gene Seymour':{
        'Lady in the Water': 3.0, 'Snakes on a plane': 3.5,
        'Just My Luck': 1.5, 'Superman Returns': 5.0, 'You,Me and Dupree': 3.5,
        'The Night Listener': 3.0
    },
    'Michael Phillips':{
        'Lady in the Water': 2.5, 'Snakes on a plane': 3.0,
        'Superman Returns': 3.5, 'The Night Listener': 3.0
    },
    'Claudia puig':{
         'Snakes on a plane': 3.5, 'Just My Luck': 3.0, 'Superman Returns': 4.0,
        'You,Me and Dupree': 2.5,'The Night Listener': 4.5
    },
    'Mick LaSalle':{
        'Lady in the Water': 3.0, 'Snakes on a plane': 4.0,
        'Just My Luck': 2.0, 'Superman Returns': 3.0, 'You,Me and Dupree': 2.0,
        'The Night Listener': 3.0
    },
    'Jack Matthews':{
        'Lady in the Water': 3.0, 'Snakes on a plane': 4.0,
        'Superman Returns': 5.0, 'You,Me and Dupree': 3.5,
        'The Night Listener': 3.0
    },
    'Toby':{
         'Snakes on a plane': 4.5,
         'Superman Returns': 4.0, 'You,Me and Dupree': 1.0
    },
}

2.寻找相似度的算法:
①.欧几里得距离评价

#欧几里得距离
#prefs->数据集
#person1,person2->两个不同的用户,
def sim_distance(prefs,person1,person2):
    si={}
    for item in prefs[person1]:
        if item in prefs[person2]:
            si[item]=1

    if len(si)==0:
        return 0
    sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) for item in prefs[person1] if item in prefs[person2]])

    return 1/(1+sqrt(sum_of_squares))

②.皮尔逊相似度算法:

def sim_person(prefs,p1,p2):
    si={}
    for item in prefs[p1]:
        if item in prefs[p2]:
            si[item]=1

    n=len(si)
    if n==0 :
        return 1

    #求所有偏好和
    sum1=sum([prefs[p1][it] for it in si])
    sum2=sum([prefs[p2][it] for it in si])

    #求平方和
    sum1sq=sum([pow(prefs[p1][it],2) for it in si])
    sum2sq = sum([pow(prefs[p2][it], 2) for it in si])

    #求乘积之和

    pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si])

    #计算皮尔逊评价值
    num=pSum-(sum1*sum2/n)
    den=sqrt((sum1sq-pow(sum1,2)/n)*(sum2sq-pow(sum2,2)/n))
    if den==0:
        return 0
    r=num/den
    return r

③.Tanimoto相关度评价值

def sim_Tanimoto(prefs,person1,person2):
    sim_and=[]
    for item in prefs[person1]:
        if item in prefs[person2]:
            sim_and.append(item)

    return (len(sim_and)*1.0/(len(prefs[person1])+len(prefs[person2])-len(sim_and)))

关于这三个算法的分析:
Tanimoto只针对于结果是二值(0,1)的相关评价,如对电影评价只有觉得好看和不好看两种,这样的情况可以用Tanimoto算法。
对于欧几里得距离算法和皮尔逊算法,在对于数据集不是很规范的时候,(如影评者的评价相对于平均水平偏离大的时候)使用皮尔逊算法会得到更好的结果。
3.以上算法都是针对两个人的相关度算法,可以使用求出与某一用户相似度相近的前几个用户的函数:

#返回与person的最佳匹配者集合
#prefs->数据集,person->某一用户,n->求出前n个相似用户,similarity->通过哪种求相似度的算法
def topMatches(prefs,person,n=5,similarity=sim_person):
    scores=[(similarity(prefs,person,other),other) for other in prefs if other!=person]
    scores.sort()
    scores.reverse()
    return scores[0:n]

4.推荐物品:

#利用所有他人的评价值得加权平均,为某人提供建议(具体不理解算法的,参考集体智慧编程)
def geetRecommendations(prefs,person,similarity=sim_person):
    totals={}
    simSums={}
    for other in prefs:
        if other==person:
            continue
        sim=similarity(prefs,person,other)
        if sim<=0:
            continue
        for item in prefs[other]:
            if item not in prefs[person] or prefs[person][item]==0:
                totals.setdefault(item,0)
                totals[item]+=sim*prefs[other][item]
                simSums.setdefault(item,0)
                simSums[item]+=sim
    #建立一个归一化的列表
    ranking=[(total/simSums[item],item) for item,total in totals.items()]
    ranking.sort()
    ranking.reverse()
    return ranking

5.物品之间的相似:
与人与人之间相似类似,这儿只需要将数据集中的人和物品转换一下位置即可。

#转换人和物
def transformPrefs(prefs):
    result={}
    for person in prefs:
        for item in prefs[person]:
            result.setdefault(item,{})
            result[item][person]=prefs[person][item]

    return result

转换之后类似这样的

'Lady in the Water': {'Lisa Rose': 2.5, 'Jack Matthews'
: 3.0, 'Michael Phillips': 2.5, 'Gene Seymour': 3.0, 'Mick LaSalle': 3.0}

6.以上的算法都是基于用户的协作型过滤,接下来就是基于物品的协作型过滤,对于稀疏数据集基于物品的方法优于基于用户,对于密集数据集,两者效果一样。

#生成与每个物品相似度的数据集
def calculateSimlarItems(prefs,n=10):
    result={}
    itemprefs=transformPrefs(prefs)
    c=0
    for item in itemprefs:
       c+=1
       if c%100==0:
           print '%d / %d '%(c,len(itemprefs))
       score=topMatches(itemprefs,item,n=n,similarity=sim_distance)
       result[item]=score

    return result
#通过物品对某个人获取推荐
#因为预先处理了物品相似度,所以这儿的推荐过程效率很快,预先处理的过程可以在空闲的时候做。
#这儿的itemMatch是每个物品相似度的数据集,user是推荐用户
def getRecommendedItems(prefs,itemMatch,user):
    userRatings=prefs[user]
    scores={}
    totalSim={}

    for (item,rating) in userRatings.items():
        for (similarity,item2) in itemMatch[item]:
            if item2 in userRatings:
                continue
            scores.setdefault(item2,0)
            scores[item2]+=rating*similarity

            totalSim.setdefault(item2,0)
            totalSim[item2]+=similarity

    rankings=[(score/totalSim[item],item) for item,score in scores.items()]
    rankings.sort()
    rankings.reverse()
    return rankings
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一部分 Spark学习 6 第1章 Spark介绍 7 1.1 Spark简介与发展 7 1.2 Spark特点 7 1.3 Spark与Hadoop集成 7 1.4 Spark组件 8 第2章 Spark弹性分布数据集 9 2.1 弹性分布式数据集 9 2.2 MapReduce数据分享效率低 9 2.3 MapReduce进行迭代操作 9 2.4 MapReduce进行交互操作 10 2.5 Spark RDD数据分享 10 2.6 Spark RDD 迭代操作 10 2.7 Spark RDD交互操作 10 第3章 Spark安装 11 第4章 Spark CORE编程 13 4.1 Spark Shell 13 4.2 RDD Transformations 13 4.3 Actions 16 4.4 用RDD编程 17 4.5 UN-Persist存储 18 第5章 Spark调度与高级编程 20 5.1 Spark应用程序例子 20 5.2 Spark-submit语法 22 5.3 Spark变量 23 5.4 数字类型 RDD操作 23 第二部分 ZOOKEEPER学习 24 第6章 zookeeper介绍 25 6.1 zookeeper简介 25 6.2 分布式应用程序 25 6.3 Apache Zookeeper意味着什么? 26 第7章 zookeeper基本组成与工作流程 27 第8章 zookeeper的leader节点选择 31 第9章 zookeeper安装 33 第10章 zookeeper 命令行接口 35 第11章 zookeeper应用程序接口 39 第12章 zookeeper应用 40 第三部分 KAFKA学习 48 第12章 KAFKA介绍 49 12.1 KAFKA简介 49 12.2信息系统 49 12.3 KAFKA是什么? 50 第13章 KAFKA基本组成与集群架构 51 13.1 KAFKA的基本组成 51 13.2 KAFKA集群架构 52 第14章 KAFKA工作流程 53 14.1 PUB-SUB信息工作流 53 14.2 队列信息工作流/消费者组 53 14.3 Zookeeper在KAFKA中扮演的角色 54 第15章 KAFKA安装 55 第16章 KAFKA基本操作 56 16.1 启动zookeeper服务 56 16.2 单个单节点中间件配置 56 16.3 Topics列表 56 16.4 启动生产者发送信息 57 16.5 启动消费者接收信息 57 16.6 单个多节点中间件配置 57 16.7 创建一个topic 58 16.8 启动生产者发送信息 59 16.9 启动消费者接收信息 59 16.10 基本Topic操作 59 16.11 删除Topic 59 第17章 KAFKA 生产者与消费者群实例 60 17.1 生产者实例 60 17.2 简单消费者实例 63 17.3 消费者群例子 65 第18章 KAFKA与SPARK集成 67 18.1 Kafka与spark集成 67 18.2 SparkConf API 67 18.3 StreamingContext API 67 18.4 KafkaUtils API 67 18.5 建立脚本 69 18.6 编译/打包 69 18.7 提交到Spark 69 第四部分HIVE学习 70 第19章 HIVE介绍 71 19.1 HIVE是什么? 71 19.2 HIVE特点 71 19.3 HIVE架构 71 19.5 HIVE工作流 72 第20章 HIVE 安装 74 20.1 Hadoop安装 74 20.2 HIVE安装 77 20.3 Derby安装与设置 78 第21章 HIVE 数据类型 80 21.1列类型(Column Type) 80 21.2文本类型(Literals) 81 21.3 Null 值 81 21.4 复杂类型 81 第22章 数据库操作 82 22.1 创建数据库 82 22.2 删除数据库 82 第23章 数据表操作 83 23.1 创建数据表 83 23.2 load数据(插入数据) 85 23.3 修改数据表(Alter table) 86 23.4 删除表(Drop table) 90 第24章 分区 92 24.1 添加分区(Adding a Partition) 93 24.2 重命名分区(Renaming a Partition) 93 24.3 删除分区(Droping a Partition) 93 第25章 内置运算符 94 25.1 关系运算符 94 25.2 算术运算符 96 25.3 逻辑运算符 97 25.4 复杂运算符(Complex Operators) 97 第26章 内置函数 98 26.1 内置函数 98 26.2 聚合函数(Aggregate Functions) 99 第27章 视图与索引 100 27.1 创建视图(Creating a View) 100 27.2 删除视图(Dropping a View) 100 27.3 创建索引(Creating an Index) 101 27.4 删除索引(Dropping an Index) 101 第28章 HIVEQL 102 28.1 查询语句(SELECT ...WHERE) 102 28.1.1 查询语句实例 102 28.1.2 JDBC查询语句实例 102 28.2 查询语句(SELECT...ORDER BY) 103 28.2.1 ORDER BY查询语句实例 103 28.2.2 JDBC ORDER BY 查询语句实例 104 28.3 查询语句(GROUP BY) 104 28.3.1 GROUP BY查询语句实例 104 28.3.2 JDBC GROUP BY查询语句实例 105 28.4 查询语句(JOIN) 106 28.4.1 JOIN查询语句实例 106

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值