【配套博客】《集体智慧编程》推荐系统

推荐系统(建设中进度20%)

    • 背景介绍
    • 场景介绍
    • 算法介绍
      • 相似性算法
        • 欧几里得距离计算
        • 皮尔逊算法
        • Jacard 系数
        • 曼哈顿距离算法
    • 设计模式
    • 现代推荐算法
      • 基于卷积神经网络的推荐模型
      • 序列模型
      • 深度学习和注意力机制

集体智慧编程 是一本比较老的书,距今发布已经过去了14年,但是其中讲解的内容却是非常的偏实践,笔者之前主要是写业务代码,几乎很少接触算法内容,读此书时,觉得非常有收获。笔者会本书的基础之上,额外结合数学知识,代码实现,以及目前业界更先进的算法实现方式,跟大家一起来详细探讨一下本书的内容,我不会生搬硬套,只是单纯的做书籍内容的搬运,而是采用更详细和生动的例子作补充。笔者本人水平有限,难免出现纰漏,有问题请私信或留言 我会在24h内处理,请勿在评论区引战or开喷。

背景介绍

第一性原则 :推荐算法的核心应用场景,无所谓就是给什么样的人看什么样的东西,在这个基础上保证好所推荐的事物的相关度和顺序。因此 我们可以得知 一个推荐工程的算法,肯定会包含两部分 获得推荐集和排序。下面我们将围绕着这两点介绍一下 09年一个主流的推荐系统是怎样进行设计和运行的。

场景介绍

我们首先思考一个这样的场景,我们是一个视频播放网站,现在我们要对一个用户提供一份推荐的电影列表。

如果让做工程的同学来进行思考,这个其实也并不是一个无法完成的任务,因为电影的数量是非常多的,但是我们能从一些其他知识库非常轻松的获得一份电影评分,我们可以利用排序算法或者topk算法简单的获得一个榜单,并且把这个榜单推送给所有用户。

如果不借助任何高深的算法,我们可以很容易的给出一份工程上的推荐时间,但是如果我们现在能够额外获得一些用户的知识,我们是否能够做到对每个用户进行更加个性化的推荐呢,这其实 也并非是难以做到的,我们后面需要用到一些简单高中数学和数理统计的知识,来实现一些能够帮助我们进行 协同过滤 的算法,从而帮助我们实现这个功能。

协同过滤:这个概念非常的好理解,正如我们前文所提到的,推荐工程中一定要首先获得一个推荐集,那么如何实现这个过程,我们可以使用协同过滤的工具,我们尝试对我们的全部搜索集进行搜索,应用算法找到和我们的taget_item 相似度最高的一个物品集合,然后针对这个集合做好排序,我们就完成了推荐系统

算法介绍

ps 所有的代码都可以在这里找到:
https://github.com/orikey0/Programming-Collective-Intelligence-Source-Code
由于09年基本上还用的是python2,这里笔者将按照python3和python的代码规范进行了一定改造,并且添加了原书中没有代码实现的算法。笔者承诺 建设完成中所有代码开箱即用。

下面我们结合一个具体的场景,介绍常见的几种计算相关型的算法。
我们现在有一批观影网站用户的评分信息,我们把他们组合成如下形式

critics = {'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, 'The Night Listener': 3.0,
                            'You, Me and Dupree': 3.5},
           'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0,
                                'Superman Returns': 3.5, 'The Night Listener': 4.0},
           'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0,
                            'The Night Listener': 4.5, 'Superman Returns': 4.0,
                            'You, Me and Dupree': 2.5},
           'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
                            'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0,
                            'You, Me and Dupree': 2.0},
           'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
                             'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5},
           'Toby': {'Snakes on a Plane': 4.5, 'You, Me and Dupree': 1.0, 'Superman Returns': 4.0}}

相似性算法

根据上面的数据我们需要对任意两个人计算他们的相似度,而如何计算相似度则是我们下面需要考虑的话题

欧几里得距离计算

这个公式相信大家没有不熟悉的,他的中文名称,大家可以理解为 勾股定理,求任意两个点的距离,在一个二维的坐标系里面,我们都可以使用如下的方式,来计算两个点之间的距离 ,在这里 我们可以使用任意两个人在任意两个相同的电影里面的评分作为横纵坐标,然后通过for循环方式对所有的值进行累计,从而计算两个人之间的相似度距离。
f ( x ) = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 f(x)=\sqrt{(x_1-x_2)^2}+\sqrt{(y_1-y_2)^2} f(x)=(x1x2)2 +(y1y2)2

皮尔逊算法

当我们有很多离散数据的时候,我们计算一组离散数据的是否是正相关的,我们可以使用皮尔逊算法来计算他们的变量值,他的本质是使用中心化之后的余弦向量来计算相关系数

Jacard 系数

Jacard系数算法更加简单,主要应用在NLP领域中,这里我们 给一个具体的例子:
我们可以首先对以下两个句子进行分词
中国真的很美丽 = > [ ′ 中 国 ′ , ′ 真 的 ′ , ′ 很 ′ , ′ 美 丽 ′ ] 中国台湾真的很靓丽 = > [ ′ 中 国 ′ , ′ 台 湾 ′ , ′ 真 的 ′ , ′ 很 ′ , ′ 靓 丽 ′ ] 中国真的很美丽 => ['中国','真的','很','美丽']\\ 中国台湾真的很靓丽=>['中国','台湾','真的','很','靓丽'] 中国真的很美丽=>[,,,]中国台湾真的很靓丽=>[,,,,]

曼哈顿距离算法

设计模式

当我们有多个相似性算法的时候,针对不同的场景使用不同的策略,这将是一个非常自然能够想到的事情,因此,我们可以首先想到使用设计模式中的策略模式来做对不同的场景做好计算。

现代推荐算法

随着我们技术水平的不断提高,我们的算法AI技术自然也进行了更深层次的迭代,我们下面简单介绍一下比较常用的几种算法模型,以及他们相比传统计算相似度算法的优点,来探讨这件事情。

基于卷积神经网络的推荐模型

序列模型

深度学习和注意力机制

你可能感兴趣的:(读书笔记,算法,无关主业,算法,集体智慧编程,笔记)