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

集体智慧编程 是一本比较老的书,距今发布已经过去了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技术自然也进行了更深层次的迭代,我们下面简单介绍一下比较常用的几种算法模型,以及他们相比传统计算相似度算法的优点,来探讨这件事情。

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

序列模型

深度学习和注意力机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些值得推荐的Linux系统编程书籍: 1.《Linux系统编程手册》(Linux System Programming):Michael Kerrisk所著的这本书是学习Linux系统编程的绝佳入门书籍,它涵盖了Linux系统编程的所有基础知识,包括进程管理、文件I/O、信号处理、线程、进程间通信等。此外,该书还提供了大量实例代码和实践操作,可以帮助读者更好地理解Linux系统编程的重要概念和技术。 2.《UNIX环境高级编程》(Advanced Programming in the UNIX Environment):这是一本经典的UNIX系统编程书籍,由W. Richard Stevens所著。该书详细介绍了UNIX系统编程的各个方面,包括进程、信号、进程间通信、文件I/O、网络编程等。该书还提供了大量实例和代码,以及详细的注释和解释,可以帮助读者深入理解UNIX系统编程的各个方面。 3.《UNIX网络编程》(UNIX Network Programming):这是另一本UNIX系统编程的经典书籍,由W. Richard Stevens所著。该书介绍了UNIX网络编程的各个方面,包括套接字编程、进程间通信、网络协议、TCP/IP协议等。该书提供了大量实例和代码,可以帮助读者深入理解UNIX网络编程的各个方面。 4.《深入理解Linux内核》(Understanding the Linux Kernel):这是一本关于Linux内核的详细介绍和解释的书籍,由Daniel P. Bovet和Marco Cesati所著。该书介绍了Linux内核的各个方面,包括进程管理、内存管理、文件系统、设备驱动程序等。该书提供了大量的实例和代码,可以帮助读者深入理解Linux内核的各个方面。 5.《Linux设备驱动程序》(Linux Device Drivers):这是一本关于Linux设备驱动程序的详细介绍和解释的书籍,由Alessandro Rubini和Jonathan Corbet所著。该书介绍了Linux设备驱动程序的各个方面,包括字符设备、块设备、网络设备等。该书提供了大量的实例和代码,可以帮助读者深入理解Linux设备驱动程序的各个方面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值