【摘录】写给程序员的数据挖掘技术

版权归作者所有,任何形式转载请联系作者。
作者:黄药师(来自豆瓣)
来源:https://www.douban.com/note/587325115/


第二章,协同过滤——爱你所爱(计算用户之间有多少共性)
曼哈顿距离(manhattan):各维直接相减(r=1)
欧氏距离(euclidean):利用勾股定理得到(r=2)
上确界距离:(r=∞)
注:r越大,某一维上的差异对最终影响越大


皮尔逊相关系数(pearson):不同用户的评价尺度,差异很大时,使用。(就是线性回归,参看下面的代码def pearson)
余弦相似度(cos):数据稀疏时,使用: x × y / (|x| × |y|)  (结果为1代表完全相似,-1代表完全不相似)


k近邻:权重百分比 = pearson / ∑pearson。投影 = ∑(打分*权重百分比)


********************另********************
欧氏距离能够体现个体数值特征的绝对差异,
所以更多的用于需要从维度的数值大小中体现差异的分析,
如使用用户行为指标分析用户价值的相似度或差异。


余弦距离更多的是从方向上区分差异,而对绝对的数值不敏感,
更多的用于使用用户对内容评分来区分兴趣的相似度和差异,
同时修正了用户间可能存在的度量标准不统一的问题(因为余弦距离对绝对数值不敏感)。


用户对内容评分,按5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得到的结果是0.98,两者极为相似。但从评分上看X似乎不喜欢2这个 内容,而Y则比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性就出现了调整余弦相似度,即所有维度上的数值都减去一个均值,比如X和Y的评分均值都是3,那么调整后为(-2,-1)和(1,2),再用余弦相似度计算,得到-0.8,相似度为负值并且差异不小,但显然更加符合现实。
********************另********************


第三章,协同过滤——基于物品的过滤
基于用户的过滤叫内存的协同过滤
基于物品的过滤叫模型的协同过滤


现基于模型,对用户a进行预测
1、先做产品之间的余弦相似度。(评分先减平均分,以抵消个人习惯影响)
2、归一化用户a的评分,将[1, 5]变为[-1, 1]
   归一化公式:NR = 2 * (R-min) / (max-min) - 1
   反归一化公式:R = (NR + 1) * (max-min) / 2 + min
3、∑(NR * cos) / ∑|cos|  (两个商品的相似度越高,用户对此商品的打分,用来预测新商品时就越有效)
4、将上值再反归一化到[1, 5],得到最终分。


slope one算法
1、偏差(dev):a、b两商品的打分相减,求和后,除以打分人数。
2、(∑ (score + dev) * card) / ∑card  (利用某人已有的打分,偏差出对该商品的打分,再以偏差人数为权重加权)


归一化:(推荐书目:the manga guide to statistics(漫画统计学))
标准差sd = √ ( ∑(x -  ̄x)^2 / card(x) )
标准分数 = (x -  ̄x) / sd


把均值改为中位数,可以减少离群点的剧烈影响: asd = (∑|x - x中位|) / card(x)
标准分数 = (x - x中位) / asd


近邻分类:找出离此商品最近的商品,看下用户对它的态度(或看它属于哪一类),得出结论。
问:为何书中用的是曼哈顿距离?


normalization将数归入到[0,1]:(value - min) / (max - min)
standardization使平均值变为0,效果比前者更好。


第五章,算法评估


注:不要把训练的数据用来测试。


10折交叉验证:分10份,9:1这样测10次。
留一法(leave one out):效率差,但结果准。而且不会像10折法一样,因为分法不同,而得出不同结果。
分层采样(stratification):10折时,每一类的数据均分到每一折里面。留一法不存在此问题。
混淆矩阵:一目了然,数据被错分到哪里去了。
kappa统计量:κ = (P(c) - P(r)) / (1 - P(r))   
    P(c)是实际分类的正确率,P(r)是随机分类的正确率
        kappa > 0.75 结果相当好;< 0.4 结果不太理想;< 0 比随机结果还差


rote分类器:只对训练集中出现过的物品进行分类。
近邻分类器的问题:遇到离群点时会发生问题。
kNN:考察N个最近的邻居。距离的倒数做成权重百分比,乘以分数。


更多数据vs更好算法:一个更大的数据集比一个好的算法更有效。所以提高算法的性能使之能处理更多的数据,比单纯改良算法更实用。


第六章,朴素贝叶斯
近邻方法被称为惰性学习器(lazy learner),每次都要遍历。
贝叶斯方法被称为勤快学习器(eager learner),通过训练构建模型,通过模型进行分类。分类速度更快。


P(h|D) = P(h∩D) /  P(D) = P(D|h) * P(h) /  P(D)
先验概率P(h),后验概率P(h|D)
最大后验假设(the maximum a posteriori hypothesis): hmap = arg max P(D|h) * P(h) / P(D)
因为P(D)都一样,hmap = arg max P(D|h) * P(h) 
P(h|D) ≈ P(D|h) * P(h)


推荐书:the numerati(当我们变成一堆数字)太虚不喜欢


P(x | y) = nc / n  调整为:
P(x | y) = (nc + mp) / (n + m)  《机器学习》第179页
其中m是等效样本容量,有多少种选择,如2
p为概率的先验估计,通常设为均匀分布,如0.5
这样防止出现概率0的情况,直接破坏结果。


贝叶斯就是计数,对于连续值比如考试分数:
方法一、可以按分数分为不同的类别,再套贝叶斯。
方法二、高斯分布。
总体标准差sd = √ ( ∑(x -  ̄x)^2 / card(x) )
样本标准差sd = √ ( ∑(x -  ̄x)^2 / (card(x) - 1) )
拿到所有数据时,前者更好;只拿到部分时,后者更优。


高斯分布就是正态分布,68%在一个标准差内,95%在两个标准差内。
通过公式算出某个取值的概率。


朴素贝叶斯 vs kNN:
贝叶斯需要的训练数据更少,性能更好。但无法学到特征间的相互作用,如我喜欢巧克力,也喜欢粥,但不喜欢巧克力加粥一起吃。
kNN不用假设数据有特定结构,但需要大量内存。训练集大时的好选择,如推荐系统、蛋白组学及图像分类等。


贝叶斯需要各属性之间互相独立,才能用乘法去算概率,然而很多时候并不满足,我们假装它满足然后去用,结果效果还不错。这里的假装就是“朴素”的来源。


第七章,非结构化文本分类
有序处理量太大,所以只看词的出现次数。


P(w|h) = (n + 1) / (n + |vocabulary|)
注:|vocabulary|为词汇表中的词数


概率相乘时,数字太小容易变成0,所以改用math.log()后相加。


停词:去掉对分类没有关系的词,如i a the等
停词不等于常见词,work write school等虽常见,但对分类有用。


反对观点,不要盲目停词,如:
1、只使用最频繁的词时,能够判定阿拉伯语文档的写作地(埃及、苏丹、叙利亚还是英国)
2、在线聊天时,性犯罪者更多的使用i me you


第八章,聚类
聚类的种类:
1、k-means聚类:需要确定最后分成多少组。
2、层次聚类:开始时每个实例都看成一个簇,每迭代一次就合并两个最相似的簇,直到最后只有一个簇。


聚类距离计算方式:
1、单连接聚类:使用两集合中相距最近的两个元素来计算长度。
2、全连接聚类:使用两集合中相距最远的两个元素来计算长度。
3、平均连接聚类:一个集合中所有元素到另一集中中所有元素距离的平均。


k-means聚类:
1、随机取n个点作为类别
2、将每个实例分到离它最近的类别
3、计算每个类别的平均点,作为新的中心点: ( ̄x,  ̄y,  ̄z, ....)   其中, ̄x = (x1 + x2 + x3 + ... xn) / n
4、以上面的中心点再次分类,直到结果不再变化为止


此算法开始改善较多,后期只是微调,所以为了降低运算时间,
将“所有点不再从一个类别移到另一类别”放宽到,
“只有不到1%的点会从一个另类移到另一类别”。


误差平方和SSE,也称为散度scatter:
计算每个点到所属中心点距离的平方,并求和。
SSE = ∑dist(c,x)^2


多次k-means聚类得到不同结果时,SSE小的结果更好。


k-means++聚类,更好的选择初始点:
1、先随机选一个中心点
2、计算每个实例离各中心点的距离(开始为1个中心点,每次增加一个中心点)
3、每个实例选一个最近距离,作为选中此实例为中心点的概率,选一个中心点
4、重复第2步,直到选够中心点为止
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域中 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏中消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值