写给程序员的数据挖掘(协同过滤)

2022-06-15 16:08:11 浏览数 (1)

其实数学建模这个事情费力不讨好,相反数据挖掘这个近亲在海量的数据里面寻找一种范式,更关键的是相关的比赛还能赚钱(数学建模除了几个大比赛,很多时候就是贴钱)。我要改变这种现状(太穷了),打比赛赚钱。

但是数据分析这个行当,如一片浩瀚的大海,前路漫漫怎么走,是个问题,我一个朋友是学的大数据专业,日常也分享一些题目,比如最近几天在文本分析里面浮沉。。。

寻寻觅觅,就为做作业

标配,我有个朋友

我找了一本感觉还不错的书,开始学习之旅,我的文章可能最大的特点就是给出算法实现,

本篇文章的参考书是这个,封面值得一看

作者受着禅宗的影响

书的前沿给了这样一句话,我查也没有查到什么,但是大概可以知道,知识其实是一种囚牢,禁锢着思想。

一开始很自然的说,以前的选择少,所以很轻易的就会获得个性化的定制。

视角到了现代,其实推荐是一种选择

数据挖掘就是一种模式的发现过程,这么多数据可以推断什么?这也是要回答的问题。

首先讲了协同过滤:

最近的demo就是亚马逊的图书推荐,买过这本书的人还买过什么?

任务变成了两个,第一个是找到相似的用户。这里略去了很多的话,直接放原理。

x,y轴了两本书的打分,这里计算了最简单的曼哈顿距离

算量很小的距离计算,但是这个距离可以说的内容不是很多

我们要使用两点间的距离,勾股

其实这两个算法有毛病,对缺失值不知所措。

我们将上面的算法一般化,害,这个M距离让我想起了我的多元统计老师。其实对于对于一个数学上面的算法,其实我们是很期盼找到一个递推公式,这样就很方便的用编程语言来描述这个算法。

r=1的时候会退化成曼哈顿距离

再努力一点会变成欧式距离

针对上式我们也可以给出这样的结论,因为他是累加了误差和

我们来思考一下,使用Python怎么写这些距离的算法。其中自带的字典或者也叫关联数组(哈希表)是个不错的选择。

可能有点乱

我们看这样的一个条目,一个键,一个值为字典的字典。

你可以验证这个工作

我们来写一个简单的曼哈顿距离的算法,输入参数为两个字典

为了装逼(其实是为了弥补Py是动态语言的毛病)可以加上注解,一开始写初始化的代码,距离=0,然后写一个bool变量来说明要不要把距离打印,遍历时从key开始,内外两层剥离。

运算就简单了取值来计算,下面的代码进行后处理。这样的写法也值得说一下,你的值算出来了,接着要怎么办?

接下里寻找最近用户的函数:

传入的是要计算的用户名字,以及一堆要找的数据。因为要给出一个数据的排序,所以这里就先搞一个容器。接着开始遍历,下面if是要确保不计算出一个距离为0的出来,因为自己的距离就是0 。接下来调用上面的函数,将计算的东西放到我们的容器里面。在输出的阶段,先排序再输出。

接着集成一下,不过其中需要一些测试:

比如这个

这样才能取到我们需要的东西

拿到用户没有评级的乐队,接着在字典里面把值取出来,然后把每一个用户的打分也取出来。

开始两层循环,如果不是就是写进去,最后输出的时候使用了lambda(自己给的筛选要求)来进一步给出答案。

也就是这一句

lambda和普通的函数相比,就是省去了函数名称而已,同时这样的匿名函数,又不能共享在别的地方调用。

其实说的没错,lambda在Python这种动态的语言中确实没有起到什么惊天动地的作用,因为有很多别的方法能够代替lambda。

1. 使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。

2. 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。

3. 使用lambda在某些时候让代码更容易理解。

写了一堆代码说了啥?其实是两个人,A对乐队有5个评分,B对乐队有4个评分,那你给B推荐的时候,就需要找到AB之间口味最近的。

在原著里面这个地方有一些讨论,但是我又不知道怎么说,自己看吧。

用户对东西的评价行为有很大的差异

就好像是这样的,你说怎么办?

这里使用皮尔逊相关系数,计算其相关性。

上面是几种一致性的图线

这个系数其实就是最小二乘法的算法的系数(可能不是,但是看着好像)。

数学老师的解答

数学哇

我们把它变形一下

虽然看着复杂(对,不是真的难算),还有就是它太灵敏了,给点数值就浪的不行。但是在实现的时候好一些,单遍扫描一次过。

算法的实现过程

因为使用编程所以循环和求和天然的方便,你可以直接把分子求出来

左到右,x,y循环的取出值来计算

在分母不为0的情况下,计算比值

看看我们的分母

在计算相似度的时候,我们不想计算共同的0,事实上,我们研究的很多东西都是稀疏的。

yes

总结一下:

  1. 假如数据受分数贬值,也就是说用户在一个判定的范围内,这个评判的标准不一样,一个是1-5,一个是4-5,那么我们就要考虑使用皮尔逊相关系数。
  2. 如果数据稠密,而且0值少,且属性值很重要的情况下,使用欧式和曼哈顿距离
  3. 数据稀疏就使用COS计算距离。

其实我现在就想撤,但是还想写一些K近邻的内容。因为我们使用单一的数据来源进行推荐的时候其实会有失偏颇,就是会把自己的小怪癖给别人,那怎么办?我们使用多个数据来源来改善这种傻逼现象。

也就是把我们的皮尔逊系数加起来作比,这样就可以算出来一个就像贡献度一样的东西,使用这个推荐。

0 人点赞