其实数学建模这个事情费力不讨好,相反数据挖掘这个近亲在海量的数据里面寻找一种范式,更关键的是相关的比赛还能赚钱(数学建模除了几个大比赛,很多时候就是贴钱)。我要改变这种现状(太穷了),打比赛赚钱。
但是数据分析这个行当,如一片浩瀚的大海,前路漫漫怎么走,是个问题,我一个朋友是学的大数据专业,日常也分享一些题目,比如最近几天在文本分析里面浮沉。。。
寻寻觅觅,就为做作业
标配,我有个朋友
我找了一本感觉还不错的书,开始学习之旅,我的文章可能最大的特点就是给出算法实现,
本篇文章的参考书是这个,封面值得一看
作者受着禅宗的影响
书的前沿给了这样一句话,我查也没有查到什么,但是大概可以知道,知识其实是一种囚牢,禁锢着思想。
一开始很自然的说,以前的选择少,所以很轻易的就会获得个性化的定制。
视角到了现代,其实推荐是一种选择
数据挖掘就是一种模式的发现过程,这么多数据可以推断什么?这也是要回答的问题。
首先讲了协同过滤:
最近的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-5,一个是4-5,那么我们就要考虑使用皮尔逊相关系数。
- 如果数据稠密,而且0值少,且属性值很重要的情况下,使用欧式和曼哈顿距离
- 数据稀疏就使用COS计算距离。
其实我现在就想撤,但是还想写一些K近邻的内容。因为我们使用单一的数据来源进行推荐的时候其实会有失偏颇,就是会把自己的小怪癖给别人,那怎么办?我们使用多个数据来源来改善这种傻逼现象。
也就是把我们的皮尔逊系数加起来作比,这样就可以算出来一个就像贡献度一样的东西,使用这个推荐。