前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >写给程序员的数据挖掘(协同过滤)

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

作者头像
云深无际
发布2022-06-15 16:08:11
2530
发布2022-06-15 16:08:11
举报
文章被收录于专栏:云深之无迹

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

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

寻寻觅觅,就为做作业

标配,我有个朋友

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

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

作者受着禅宗的影响

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

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

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

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

首先讲了协同过滤:

最近的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近邻的内容。因为我们使用单一的数据来源进行推荐的时候其实会有失偏颇,就是会把自己的小怪癖给别人,那怎么办?我们使用多个数据来源来改善这种傻逼现象。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档