Recommender System

简介: Data Sciece from Scratch 之 Recommender System 有一段时间没有看这本书了,今天正好空闲时间将在线视频关于推荐系统学习一下,正好也将这本书关于推荐系统做一个笔记,希望对大家有用。

Data Sciece from Scratch 之 Recommender System


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

在线课程笔记整理

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

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]]

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

目录
相关文章
|
3月前
|
传感器 存储 数据采集
基于 STM32 的睡眠质量检测仪设计与实现【开源免费】
在当今快节奏的生活方式下,越来越多的人面临 失眠、睡眠不足、深度睡眠时间偏短 等健康问题。良好的睡眠不仅是缓解疲劳的关键,更是维持身体免疫力和心理健康的重要保障。传统的睡眠质量检测往往依赖昂贵的医疗设备或专业睡眠实验室,而这些方式成本高、使用不便,不适合日常监测。
基于 STM32 的睡眠质量检测仪设计与实现【开源免费】
|
NoSQL Java Redis
SpringBoot2.0整合Redis高可用之Sentinel哨兵
本篇博文分享的是一主二从三哨兵模式。至于为什么用三个哨兵,同第一段。本文是模拟环境,都是一个服务器上面。
1540 0
|
Windows Python
python自动化系列之使用win32com操作Excel
python自动化系列之使用win32com操作Excel
1362 0
python自动化系列之使用win32com操作Excel
|
SQL 安全 网络协议
信息安全管理与评估赛题第3套(下)
信息安全管理与评估赛题第3套(下)
1004 0
|
11月前
|
设计模式 JSON 前端开发
前端必须掌握的设计模式——适配器模式
适配器模式是一种结构型设计模式,用于使接口不兼容的对象能够相互合作。通过在客户端和系统之间引入一个“中间层”适配器,将不同类型的输入数据转换为系统能处理的标准格式,减轻系统的负担,提高扩展性和可维护性。例如,MacBook的扩展坞将多种接口(如HDMI、USB)转换为Type-C接口,实现多接口兼容。
|
存储 算法 物联网
R-Tree算法:空间索引的高效解决方案
【5月更文挑战第17天】R-Tree是用于多维空间索引的数据结构,常用于地理信息系统、数据库和计算机图形学。它通过分层矩形区域组织数据,支持快速查询。文章介绍了R-Tree的工作原理、应用场景,如地理信息存储和查询,以及Python的`rtree`库实现示例。此外,还讨论了R-Tree的优势(如空间效率和查询性能)与挑战(如实现复杂和内存消耗),以及优化和变种,如R* Tree和STR。R-Tree在机器学习、实时数据分析等领域有广泛应用,并与其他数据结构(如kd-trees和quad-trees)进行比较。未来趋势将聚焦于优化算法、动态适应性和分布式并行计算。
722 1
|
存储 监控 安全
数据泄露后的应对措施:个人和企业的行动指南
数据泄露后的应对措施:个人和企业的行动指南
1313 2
|
12月前
|
边缘计算 监控 自动驾驶
揭秘云计算中的边缘计算:架构、优势及应用场景
揭秘云计算中的边缘计算:架构、优势及应用场景
|
存储 算法 Linux
在Linux中,有哪些备份和恢复工具?
在Linux中,有哪些备份和恢复工具?
|
XML JSON 开发者
Star 19.7k!提高开发效率的利器:DevToys开发人员的瑞士军刀!
Star 19.7k!提高开发效率的利器:DevToys开发人员的瑞士军刀!
168 2