item Collaborative Filtering
算法步骤:
import pandas as pd
from sklearn import cross_validation
import math class ItemCF():
def __init__(self,data,k):
self.train=data
self.k=k
self.ui=self.user_item(self.train)
self.iu = self.item_user(self.train)
self.itemSimilarityMatrix()
'''
获取每个商品对应的用户(购买过该商品的用户)列表,如
{商品A:[用户1,用户2,用户3],
商品B:[用户3,用户4,用户5]...}
'''
def item_user(self,data):
iu = dict()
groups = data.groupby([1])
for item,group in groups:
iu[item]=set(group.ix[:,0]) return iu '''
获取每个用户对应的商品(用户购买过的商品)列表,如
{用户1:[商品A:评分,商品B:评分,商品C:评分],
用户2:[商品D:评分,商品E:评分,商品F:评分]...}
'''
def user_item(self,data):
ui = dict()
groups = data.groupby([0])
for item,group in groups:
ui[item]=dict()
for i in range(group.shape[0]):
ui[item][group.iget_value(i,1)]=group.iget_value(i,2) return ui def itemSimilarityMatrix(self):
matrix = dict()
for u,ps in self.ui.items():
denominator = 1.0/math.log(1+len(ps));
for p1 in ps.keys():
for p2 in ps.keys():
if p1==p2:
continue
if p1 not in matrix:
matrix[p1]=dict()
if p2 not in matrix[p1]:
matrix[p1][p2]=0 matrix[p1][p2] += denominator/math.sqrt(len(self.iu[p1])*len(self.iu[p2])) for p in matrix.keys():
#对每个商品i,将其他商品j按其与i的相似度从大大小排序
matrix[p] = sorted(matrix[p].items(),lambda x,y:cmp(x[1],y[1]),reverse=True);
#归一化
matrix[p] = [(x[0],x[1]/matrix[p][0][1]) for x in matrix[p]]
self.M=matrix
'''
对用户user进行推荐
'''
def getRecommend(self,user):
rank = dict()
uItem=self.ui[user]#获取用户购买历史
for uproduct,urank in uItem.items():
uproduct_simi = self.M[uproduct][0:self.k]
for p_simi in uproduct_simi:
p = p_simi[0]
simi = p_simi[1]
if p in uItem:
continue
if p not in rank:
rank[p]=0
rank[p]+=urank*simi
return rank def estimate(self,test):
ui_test=self.user_item(test)
unions = 0
sumRec = 0
sumTes = 0 itemrec = set() sumPopularity = 0
for user in self.ui.keys():
rank=self.getRecommend(user);
itemtest = set()
if user in ui_test:
itemtest = set(ui_test[user].keys())
sumRec += len(rank)
sumTes += len(itemtest)
for recItem in rank:
sumPopularity += math.log(1+len(self.iu[recItem]))
itemrec.add(recItem)
if recItem in itemtest:
unions += 1;
return unions*1.0/sumRec,unions*1.0/sumTes,len(itemrec)*1.0/len(self.iu.keys()),sumPopularity*1.0/sumRec
item Collaborative Filtering的更多相关文章
- Collaborative filtering
Collaborative filtering, 即协同过滤,是一种新颖的技术.最早于1989年就提出来了,直到21世纪才得到产业性的应用.应用上的代表在国外有Amazon.com,Last. ...
- 协同滤波 Collaborative filtering 《推荐系统实践》 第二章
利用用户行为数据 简介: 用户在网站上最简单存在形式就是日志. 原始日志(raw log)------>会话日志(session log)-->展示日志或点击日志 用户行一般分为两种: 1 ...
- mahout算法源码分析之Collaborative Filtering with ALS-WR (四)评价和推荐
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 首先来总结一下 mahout算法源码分析之Collaborative Filtering with AL ...
- 【RS】Sparse Probabilistic Matrix Factorization by Laplace Distribution for Collaborative Filtering - 基于拉普拉斯分布的稀疏概率矩阵分解协同过滤
[论文标题]Sparse Probabilistic Matrix Factorization by Laplace Distribution for Collaborative Filtering ...
- 从item-base到svd再到rbm,多种Collaborative Filtering(协同过滤算法)从原理到实现
http://blog.csdn.net/dark_scope/article/details/17228643 〇.说明 本文的所有代码均可在 DML 找到,欢迎点星星. 一.引入 推荐系统(主要是 ...
- [转]-[携程]-A Hybrid Collaborative Filtering Model with Deep Structure for Recommender Systems
原文链接:推荐系统中基于深度学习的混合协同过滤模型 近些年,深度学习在语音识别.图像处理.自然语言处理等领域都取得了很大的突破与成就.相对来说,深度学习在推荐系统领域的研究与应用还处于早期阶段. 携程 ...
- 【RS】AutoRec: Autoencoders Meet Collaborative Filtering - AutoRec:当自编码器遇上协同过滤
[论文标题]AutoRec: Autoencoders Meet Collaborative Filtering (WWW'15) [论文作者]Suvash Sedhain †∗ , Aditya K ...
- 论文笔记 : NCF( Neural Collaborative Filtering)
ABSTRACT 主要点为用MLP来替换传统CF算法中的内积操作来表示用户和物品之间的交互关系. INTRODUCTION NeuCF设计了一个基于神经网络结构的CF模型.文章使用的数据为隐式数据,想 ...
- chapter3:Collaborative Filtering ---------A Programmer's Guide to Data Mining
Implicit rating and item based filtering Explicit rating: 用户明确的对item评分 Implicit rating:反之 明确评分所存在的问题 ...
随机推荐
- 组合数(DFS)
组合数 点我 描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r<=n)个数的所有组合. 输入 输入n.r. 输出 按特定顺序输出所有组合.特定顺序 ...
- Python中各种集合 list tuple set dict
list 创建list L = ['Adam','Lucy','Bart'] 索引访问: 正序(和数组类似) L[0],L[1],L[2] 倒序 L[-1]倒数第一个 L[- ...
- 第3.3.4节 创建高级图形之RenderScript(二)
Android视图框架对于创建复杂布局非常方便.然而,这种便利是以性能为代价的.当性能至关重要的时候,Android提供了几种更强大的图形处理能力,当然难度也是随之上升了.在本节中,我将介绍: ...
- C语言的本质(13)——指向指针的指针
指针可以指向基本类型,也可以指向复合类型,因此一个指针变量存放的可以是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量.由于指针变量直接指向变量,所以称为"单级间址".而 ...
- Windows Azure 的开源 DNA
去年年底,第二期微软云加速器在中国正式启动,17 家创业公司入选.依靠云计算的 HTML 5 专业富媒体动画平台 Mugeda(乐享云)是其中之一.微软云加速器为创业公司提供大量支持,但 Mugeda ...
- BLOB存储图片文件二进制数据是非对错
子在一天一天虚度,生活也在一天一天中茫然 做人做事哪能尽如人意,付出多少收获多少虽然存在偏颇,但是不劳而获的心态是万万不对的,更不能去怨天尤人,低调为人.做好自己就可以了 改进你的系统的最好的方法是先 ...
- Android面试题目及其答案
转自:http://blog.csdn.net/wwj_748/article/details/8868640 Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应 ...
- 【概率论】【POJ 3682】【King Arthur's Birthday Celebration】
题意:进行翻硬币实验,若k次向上则结束,进行第n次实验需花费2*n-1的费用,询问期望结束次数及期望结束费用 设F[i]为第i次结束时的概率 F[i]= c(i-1,k-1)*p^k*(1-p)^( ...
- 使用 HttpWebRequest 发送模拟 POST 请求
使用HttpWebRequest发送模拟POST请求 网页中,如果form的method="POST",这时点击submit按钮可以给服务器发送了一个POST请求,如果metho ...
- Android自定义UI的实现和应用
在Android项目开发中,不可避免的要遇到自定义的UI,用较好的体验去讨好UED妹子和交互设计师手下留情~几个迭代下来,遇到了不少这样的要求,有简单有复杂.最好的实现方案就是讲业务和UI隔离,封装成 ...