Recommender System

Data Sciece from Scratch 之 Recommender System



有一段时间没有看这本书了,今天正好空闲时间将在线视频关于推荐系统学习一下,正好也将这本书关于推荐系统做一个笔记,希望对大家有用。首先是在线视频的笔记,该笔记来源于七月算法在线机器学习,其次介绍本书的推荐系统实现方式。

在线课程笔记整理

以上是在线学习课程的笔记,下面就是《Data Science from Scratch》的笔记部分。

Recommending What’s Popular

users_interests = [
["Hadoop", "Big Data", "HBase", "Java", "Spark", "Storm", "Cassandra"],
["NoSQL", "MongoDB", "Cassandra", "HBase", "Postgres"],
["Python", "scikit-learn", "scipy", "numpy", "statsmodels", "pandas"],
["R", "Python", "statistics", "regression", "probability"],
["machine learning", "regression", "decision trees", "libsvm"],
["Python", "R", "Java", "C++", "Haskell", "programming languages"],
["statistics", "probability", "mathematics", "theory"],
["machine learning", "scikit-learn", "Mahout", "neural networks"],
["neural networks", "deep learning", "Big Data", "artificial intelligence"],
["Hadoop", "Java", "MapReduce", "Big Data"],
["statistics", "R", "statsmodels"],
["C++", "deep learning", "artificial intelligence", "probability"],
["pandas", "R", "Python"],
["databases", "HBase", "Postgres", "MySQL", "MongoDB"],
["libsvm", "regression", "support vector machines"]
]

我们使用这样的一个数据集作为示例,看看我们的推荐系统是怎么运作的。

首先看看哪一个语言是特别流行的?

popular_interests = Counter(interest
                            for user_interests in users_interests
                            for interest in user_interests).most_common()

##[('Python', 4), ('R', 4),....

得到这个,我们只需要推荐给一个用户最流行的但他还没有感兴趣的语言:

def most_popular_new_interests(user_interests,max_results=5):
                                suggestions = [(interest,frequency)
                                for interest,frequency in popular_interests
                                if interest not in user_interests]
    return suggestions[:max_results]

print most_popular_new_interests(users_interests[1])
#[('Python', 4), ('R', 4), ('Java', 3), ('regression', 3), ('statistics', 3)]

在这种情况下,“很多人喜欢python意味着你也可能喜欢”并不是一个很好的解决方案,如果一个新用户来了,我们不知道他们喜欢什么,这是一种很好的办法。让我们来看看如何根据用户的兴趣来推荐?

User-Based Collaborative Filtering

一种考虑用户的兴趣,看他与哪个用户相似,然后将与之相似的用户的东西推荐给他。

余弦相似

一种计算两个向量相似度的计算公式,也就是余弦公式。

def dot(v, w):
    """v_1 * w_1 + ... + v_n * w_n"""
    return sum(v_i * w_i for v_i, w_i in zip(v, w))

为了计算余弦,我们需要构建向量:

unique_interests = sorted(list({interest
                        for user_interests in users_interests
                        for interest in user_interests}))

下面我们为每一个用户建立兴趣向量:

def make_user_interest_vector(user_interests):
    return [1 if interest in user_interests else 0
            for interest in unique_interests]
print make_user_interest_vector(users_interests[0])
#[1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
#建立矩阵
user_interest_matrix = map(make_user_interest_vector,users_interests)

现在,如果user_interest_matrix[i][j]等于1表示用户i对j有兴趣,由于我们的数据集特别小,所以我们可以计算每个用户与其他用户间的相似程度。

user_similarities = [[cosine_similarity(interest_vector_i,interest_vector_j)
                for interest_vector_i in user_interest_matrix]
                for interest_vector_j in user_interest_matrix]

这样user_similarities[i][j]表示用户i和用户j之间的相似度。但是user_similarities[i]只是用户i与其他用户之间的相似度。我们可以利用这个来编写一个函数来计算给定一个用户计算与之最为相似的其他用户。

def most_similar_users_to(user_id):
    pairs = [(other_user_id,similarity)
        for other_user_id,similarity in
        enumerate(user_similarities[user_id])
        if user_id!=other_user_id and similarity>0]
    return sorted(pairs,key=lambda (_,similarity):similarity,reverse=True)

print most_similar_users_to(0)
###########################
[(9, 0.5669467095138409),
(1, 0.3380617018914066),
(8, 0.1889822365046136),
(13,0.1690308509457033),
(5, 0.1543033499620919)]

那么我们怎么将一个新的推荐给一个用户吗?对于每一个东西,我们将与之相似的其他用户相似度加起来即可。

def user_based_suggestions(user_id,include_current_interests=False):
    suggestions = defaultdict(float)
    for other_user_id,similarity in most_similar_users_to(user_id):
    for interest in users_interests[other_user_id]:
    suggestions[interest] += similarity

    suggestions = sorted(suggestions.items(),key=lambda (_,weight):weight,reverse=True)
    if include_current_interests:
        return suggestions
    else:
        return [(suggestions,weight) for suggestions,weight in suggestions
        if suggestions not in users_interests[user_id]]

print user_based_suggestions(0)
#[('MapReduce', 0.5669467095138409), ('MongoDB', 0.50709255283711), ('Postgres',0.50709255283711), ('NoSQL', 0.3380617018914066), ('neural networks', 0.18898223。。。。。。

到现在基于用户的推荐系统已经完成,当数据集特别大的时候,这种算法就不合适了,我们考虑另一种基于物品的算法。

Item-Based Collaborative Filtering

另一种算法就是直接计算物品之间的相似度,然后推荐将相似的其他物品推荐给他。为了做到这一点,我们首先将user-interest矩阵翻转,以达到列对应兴趣行对应用户。

interest_user_matrix = [[user_interest_vector[j] #取第一列
                    for user_interest_vector in user_interest_matrix]
                    for j,_ in enumerate(unique_interests)]

到这里,[1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0]表示用户0,8,和9对Big Data感兴趣。

接下来计算物品的相似度:

def most_similar_interests_to(interest_id):
    similarities = interest_similarities[interest_id]
    pairs = [(unique_interests[other_interest_id], similarity)
         for other_interest_id, similarity in enumerate(similarities)
         if interest_id != other_interest_id and similarity > 0]
    return sorted(pairs,
              key=lambda (_, similarity): similarity,
              reverse=True)

# print most_similar_interests_to(0)

def item_based_suggestions(user_id, include_current_interests=False):
    suggestions = defaultdict(float)
    user_interest_vector = user_interest_matrix[user_id]
    for interest_id, is_interested in enumerate(user_interest_vector):
    if is_interested == 1:
    similar_interests = most_similar_interests_to(interest_id)
    for interest, similarity in similar_interests:
        suggestions[interest] += similarity

    suggestions = sorted(suggestions.items(),
        key=lambda (_, similarity): similarity,
        reverse=True)

    if include_current_interests:
        return suggestions
    else:
        return [(suggestion, weight)
        for suggestion, weight in suggestions
        if suggestion not in users_interests[user_id]]

到这,基于物品的协同过滤已经讲完,还有一部分关于奇异值分解的,我就没有看,等有时间再看,最近学校申事情多!

时间: 2024-11-05 14:41:59

Recommender System的相关文章

少数人的智慧

郑昀@玩聚SR 20091105 一.冷启动 Greg Linden针对最新的一篇论文:"The Wisdom of the Few: A Collaborative Filtering Approach Based on Expert Opinions from the Web" (PDF,即<少数人的智慧:基于网络专家意见的协同过滤研究>) 做了如下点评: " What they do say is that using a very small pool o

[推荐系统]互联网推荐系统比较研究

互联网规模和覆盖面的迅速增长带来了信息超载(information overload)的问题:过量信息同时呈现使得用户无法从中获取对自己有用的部分,信息使用效率反而降低.现有的很多网络应用,比如门户网站.搜索引擎和专业数据索引本质上都是帮助用户过滤信息的手段.然而这些工具只满足主流需求,没有个性化的考虑,仍然无法很好地解决信息超载的问题.推荐系统(recommender system)作为一种信息过滤的重要手段,是当前解决信息超载问题的非常有潜力的方法.推荐系统与以搜索引擎为代表的信息检索(in

【Python数据挖掘课程】五.线性回归知识及预测糖尿病实例

        今天主要讲述的内容是关于一元线性回归的知识,Python实现,包括以下内容:         1.机器学习常用数据集介绍         2.什么是线性回顾         3.LinearRegression使用方法        4.线性回归判断糖尿病        前文推荐:       [Python数据挖掘课程]一.安装Python及爬虫入门介绍       [Python数据挖掘课程]二.Kmeans聚类数据分析及Anaconda介绍       [Python数据挖

我在华为的半打岁月

听公司员工保障部说,有可能将依据法律解除我的劳动合同,打算以上海平均工资 4000 元的 80%(病假期间 80% 为最上限已经是最照顾我的条件了)给我N+1 补偿.好吧,我的智商只值 3200 元,生活来源.治病救命.养儿养老.都将断绝,以后我就只有靠这点被你们褒奖透了的智商了.对于我这样一个已经一条腿截肢.说不定哪天就会离开人世的绝症患者来说,该是时候对我这几年来的工作做点总结,万一哪天死了,算最后一段工作经历对自己对公司的一个交代吧. 2006 年 6 月 30 日,从伦敦踏上彻底回国工作

[推荐系统]推荐系统实践Reference

这只是一本197页的书    我想你未必过瘾    但作者附上了诸多好资料    无论是paper, blog文章,wikipedia词条,数据集还是开源项目等    你可以选择拥有    附上我收集的资料链接,格式基本按照'URL+资料名称+出现在书中的页数',某些链接可能需要你翻过一道'墙',某些重复引用的我就没重复贴上链接了      http://en.wikipedia.org/wiki/Information_overload  P1    http://www.readwritew

分辨真假数据科学家的20个问题及回答

[导语]本文分为两个部分,第一部分是quora上很火的一篇问答--[20个分辨真假数据科学家的问题]中赞赏数最高的回答,第二部分则是KDnuggets阅读量非常高的一篇文章[KDnuggets编辑们针对这20个问题给出的回答].前者由大数据文摘团队选稿翻译校对后,呈现在各位读者面前.后者授权转载自计算广告(Comp_Ad)译者白雪.龙星镖局,原载于KDnuggets.本次将分散于不同地址的相关资源整合推送,希望更有利于有兴趣读者的学习,别忘了[评论区]给我们留言你的体会.收获.以及建议喔! ◆

《推荐系统:技术、评估及高效算法》一第1章 概述

第1章 概述 Francesco Ricci.Lior Rokach和Bracha Shapira Francesco Ricci,Faculty of Computer Science,Free University of Bozen-Bolzano,Italy e-mail:fricci@unibz.itLior Rokach,Department of Information Systems Engineering,Ben-Gurion University of the Negev,Is

基于模糊聚类和协同过滤的混合推荐系统

      Hybrid Recommender System based on Fuzzy Clustering and Collaborative Filtering       给出题目,想找的话直接在ElsevierSD里下载即可.       并不是逐句翻译,一些简单的背景比如经济啦什么的直接忽略,不过笔者会在博文里点出来.       一二三这样的标题是原论文的题目,我没翻译,为以后自己写英文论文做准备,以1234这样的标题开始的内容是笔者自己加上去的,就是我的笔记.       我

Awesome Python

    Awesome Python      A curated list of awesome Python frameworks, libraries, software and resources. Inspired by awesome-php. Awesome Python Environment Management Package Management Package Repositories Distribution Build Tools Interactive Interp