数据挖掘之Slope One
计算偏差:
card() 表示集合包含的元素数量。
http://www.cnblogs.com/similarface/p/5385176.html
论文地址:http://lemire.me/fr/documents/publications/lemiremaclachlan_sdm05.pdf
dev[itemI,itemJ]=[1.5-1]/1=0.5 这就是偏差
加权Slope One算法
p(u)=(0.5+2)*1/1=2.5
演绎:
倩女幽魂 | 新白娘子传奇 | 白发魔女传 | |
邓紫棋 | 4 | 3 | 4 |
赵丽颖 | 5 | 2 | ? |
Angelababy | ? | 3.5 | 4 |
5 | ? | 3 |
step1:计算偏差矩阵
倩女幽魂 | 新白娘子传奇 | 白发魔女传 | |
倩女幽魂 | 0 | ||
新白娘子传奇 | 0 | ||
白发魔女传 | 0 |
#[新白娘子传奇]到[倩女幽魂]的评分偏
dev(新白娘子传奇,倩女幽魂)=[(3-4)+(2-5)]/2=-2 {注:分母2表示同时对新白娘子传奇,倩女幽魂评分的用户数}
#[倩女幽魂]到[新白娘子传奇]的评分偏差
dev(倩女幽魂,新白娘子传奇)=[(4-3)+(5-2)]/2=2
dev(白发魔女传,新白娘子传奇)=[(4-3)+(4-3.5)]/2=0.75
dev(白发魔女传,倩女幽魂)=[(4-4)+(3-5)]/2=-1
得到偏差矩阵:
倩女幽魂 | 新白娘子传奇 | 白发魔女传 | |
倩女幽魂 | 0 | 2 | 1 |
新白娘子传奇 | -2 | 0 | -0.75 |
白发魔女传 | -1 | 0.75 | 0 |
step2:利用加权Slope One进行预测
同时对i,j评分的集合
分母表示对所有除j之外用户u打过分的集合
目标: 预测[波多野结衣]对[新白娘子传奇]的评分?
倩女幽魂 新白娘子传奇 白发魔女传
波多野结衣 5 ? 3
1. 波多野结衣 看来很喜欢“倩女幽魂” 给了5分
u(i)=5
2. 波多野结衣 她还没有看过“白娘子”,“新白娘子传奇”到“倩女幽魂” 的偏差是2
dev(j,i)=-2
3. “新白娘子传奇”和“倩女幽魂”有两个人看,哦,她们是邓紫棋 赵丽颖
c(j,i)=2
4. (dev(j,i)+u(i))*c(j,i)=(-2+5)*2=6
5. "波多野结衣" 还看了"白发魔女传" 原来绝技是学的这人的
u(白发魔女传)=3
6. “新白娘子传奇”到“白发魔女传” 的偏差是
dev(白发魔女传,新白娘子传奇)=-0.75
7. (dev(白发魔女传,新白娘子传奇)+u(白发魔女传))*2=(-0.75+3)*2=3.75*2=4.5
8. 纳尼终于 fenzi=6+4.5
9. 分母 对于每一个波多野结衣评过分的电影["白发魔女传","倩女幽魂"],同时对上集合和预测电影都评分的用户数的总和
"波多野结衣" 评分过2个电影 ["白发魔女传","倩女幽魂"]
"白发魔女传"+"新白娘子传奇" = 2
"倩女幽魂"+"新白娘子传奇" = 2
于是分母=2+2=4
10 result(波多野结衣,新白娘子传奇)=10.5/4=2.625
# coding:utf-8
__author__ = 'similarface'
'''
该数据:
{"用户":{"电影":评分}}
'''
users3 = {u"邓紫棋": {u"倩女幽魂": 4, u"新白娘子传奇": 3, u"白发魔女传": 4},
u"赵丽颖": {u"倩女幽魂": 5, u"新白娘子传奇": 2},
u"Angelababy": {u"新白娘子传奇": 3.5, u"白发魔女传": 4},
u"波多野结衣": {u"倩女幽魂": 5, u"白发魔女传": 3}} users2 = {"dzq": {"qnyh": 4, "xbnzcq": 3, "bfmnz": 4},
"zly": {"qnyh": 5, "xbnzcq": 2},
"Angelababy": {"xbnzcq": 3.5, "bfmnz": 4},
"bdyjy": {"qnyh": 5, "bfmnz": 3}} class recommender:
def __init__(self, data, k=1, n=5):
self.k = k
self.n = n
self.productid2name = {}
if type(data).__name__ == 'dict':
self.data = data
#频率值 同时对A,B都进行评分的用户数目
self.frequencies={}
#样本A对样本B的偏差值
self.deviations={}
def computerDeviation(self):
'''
计算样本间的偏差
:return:
'''
#{"用户":{"电影":评分1,"电影":评分2,"电影n":评分n}} =》 ratings={"电影":评分}
for ratings in self.data.values():
#"电影n":评分n
for (item,rating) in ratings.items():
#频率值 2样本同时都进行评分的用户数目
#setdefault 如果键在字典中,返回这个键所对应的值。如果键不在字典中,向字典 中插入这个键,并且以{}为这个键的值,并返回{}
self.frequencies.setdefault(item, {})
#偏差值
self.deviations.setdefault(item, {})
for (item2,rating2) in ratings.items():
if item!=item2:
self.frequencies[item].setdefault(item2,0)
self.deviations[item].setdefault(item2,0.0)
self.frequencies[item][item2]+=1
self.deviations[item][item2]+=rating-rating2
for (item,ratings) in self.deviations.items():
for item2 in ratings:
#dev(i,j)
ratings[item2]/=self.frequencies[item][item2] def slopeOneRecommendations(self,userRatings):
'''
遍历用户u评论的所有样本:u[i]
遍历用户u的偏差矩阵: dev[j,i]
SUM((dev[j,i]+u[i])*c[j,i]) ==?c[j,i]=frequencies[j][i]
:param userRatings:
:return:
'''
recommendations={}
frequencies={}
#遍历用户u k 和 评分
for (useritem,userRating) in userRatings.items():
#遍历偏差矩阵
for (diffItem,diffRatting) in self.deviations.items():
#如果偏差矩阵的key不在用户的key中 用户的key在偏差[key]中 [新白娘子传奇 不在用户的评分中 and ["倩女幽魂","白发魔女传"] 在diffItem
if diffItem not in userRatings and useritem in self.deviations[diffItem]:
#“新白娘子传奇”和“倩女幽魂”有两个人看,哦,她们是邓紫棋 赵丽颖
freq=self.frequencies[diffItem][useritem]
#
recommendations.setdefault(diffItem,0.0)
frequencies.setdefault(diffItem,0)
#(dev(j,i)+u(i))*c(j,i)
recommendations[diffItem]+=(diffRatting[useritem]+userRating)*freq
#求分母的和
frequencies[diffItem]+=freq
recommendations=[(k,v /frequencies[k]) for k ,v in recommendations.items()]
recommendations.sort(key=lambda artistTuple:artistTuple[1],reverse=True)
return recommendations if __name__ == '__main__':
r=recommender(users2)
r.computerDeviation()
g=users2['bdyjy']
result=r.slopeOneRecommendations(g)
print(result[0][0]+' 预测评分'+str(result[0][1]))
预测[波多野结衣]对[新白娘子传奇]的评分是2.625
新白娘子传奇 预测评分2.625
Slope One 的算法复杂度
设有“n”个项目,“m”个用户,“N”个评分。计算每对评分之间的差值需要n(n-1)/2 单位的存储空间,最多需要 m n2步. 计算量也有可能挺悲观的:假设用户已经评价了最多 y 个项目, 那么计算不超过n2+my2个项目间计算差值是可能的。 . 如果一个用户已经评价过“x”个项目,预测单一的项目评分需要“x“步,而对其所有未评分项目做出评分预测需要最多 (n-x)x 步. 当一个用户已经评价过“x”个项目时,当该用户新增一个评价时,更新数据库需要 x步.
数据挖掘之Slope One的更多相关文章
- 机器学习&数据挖掘笔记_14(GMM-HMM语音识别简单理解)
为了对GMM-HMM在语音识别上的应用有个宏观认识,花了些时间读了下HTK(用htk完成简单的孤立词识别)的部分源码,对该算法总算有了点大概认识,达到了预期我想要的.不得不说,网络上关于语音识别的通俗 ...
- 常见的机器学习&数据挖掘知识点
原文:http://blog.csdn.net/heyongluoyao8/article/details/47840255 常见的机器学习&数据挖掘知识点 转载请说明出处 Basis(基础) ...
- 跟我一起数据挖掘(23)——C4.5
C4.5简介 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法.它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类.C4.5的目 ...
- ITTC数据挖掘平台介绍(四) 框架改进和新功能
本数据挖掘框架在这几个月的时间内,有了进一步的功能增强 一. 超大网络的画布显示虚拟化 如前几节所述,框架采用了三级层次实现,分别是数据,抽象Node和绘图的DataPoint,结构如下: ...
- ITTC数据挖掘平台介绍(五) 数据导入导出向导和报告生成
一. 前言 经过了一个多月的努力,软件系统又添加了不少新功能.这些功能包括非常实用的数据导入导出,对触摸进行优化的画布和画笔工具,以及对一些智能分析的报告生成模块等.进一步加强了平台系统级的功能. 马 ...
- ITTC数据挖掘系统(六)批量任务,数据查看器和自由文档
这一次带来了一系列新特新,同时我们将会从商业智能的角度讨论软件的需求 一. 批量任务向导 一个常用的需求是完成处理多个任务,可能是同一个需求以不同的参数完成多次,这类似批量分析某一问题:或者是不同的需 ...
- ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器
一. 前言 好久没有更新博客了,最近一直在忙着找工作,目前差不多尘埃落定.特别期待而且准备的都很少能成功,反而是没怎么在意的最终反而能拿到,真是神一样的人生. 言归正传,一直以来,数据挖掘系统的数据类 ...
- NLP&数据挖掘基础知识
Basis(基础): SSE(Sum of Squared Error, 平方误差和) SAE(Sum of Absolute Error, 绝对误差和) SRE(Sum of Relative Er ...
- 【十大经典数据挖掘算法】PageRank
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 我特地把PageRank作为[十大经 ...
随机推荐
- hdu 3535 背包综合题
/* 有n组背包,每组都有限制 0.至少选一项 1.最多选一项 2.任意选 */ #include <iostream> #include <cstdio> #include ...
- Java中Collections的sort方法和Comparable与Comparator的比较
一.Comparable 新建Student1类,类实现Comparable接口,并重写compareTo方法 public class Student1 implements Comparable& ...
- Replacing Accented characters(Diacritic) .NET
原文发布时间为:2012-02-17 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Collections.Generic;using Syste ...
- Lawnmower(洛谷 CF115B)
题目看这里 题目大意 简单来讲就是从(1,1)向左或右或下走,经过所有草坪的最短路程 思路: 由于在第一行只能向右走,那么我们就知道,在单数行和双数行分别是向右走和向左走,那么我们在单数行就只需要统计 ...
- hdu 5950 Recursive sequence 递推式 矩阵快速幂
题目链接 题意 给定\(c_0,c_1,求c_n(c_0,c_1,n\lt 2^{31})\),递推公式为 \[c_i=c_{i-1}+2c_{i-2}+i^4\] 思路 参考 将递推式改写\[\be ...
- 【剑指offer】二维数组中的查找☆
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 自己的思路实在 ...
- ubuntu16.04安装docker CE
如需开始在 Ubuntu 上使用 Docker CE,请确保您满足先决条件,然后再安装 Docker. 如需安装 Docker 企业版 (Docker EE),请转至获取适用于 Ubuntu 的 Do ...
- Codeforces 703D Mishka and Interesting sum(离线 + 树状数组)
题目链接 Mishka and Interesting sum 题意 给定一个数列和$q$个询问,每次询问区间$[l, r]$中出现次数为偶数的所有数的异或和. 设区间$[l, r]$的异或和为$ ...
- 某考试 T2 Tree
2 树 2.1 题目描述 给一棵n 个节点的树,节点分别编号为0 到n - 1.你可以通过如下的操作来修改这棵树:首先先删去树上的一条边,此时树会分裂为两个连通块,然后在两个连通块之间加上一条新的边使 ...
- centos7安装hadoop2.6.1,详细教程
1.我搭建的是三台centos7的环境 首先准备三个centos7(文中出现的所有的链接都是我自己的) centos7下载地址(也可以上官网自行下载):https://pan.baidu.com/s/ ...