算法步骤:

1.计算物品相似度
2.根据用户购买记录,推荐相似物品
 
物品相似度定义:
A.
   购买i的人里面,有多少比例购买了j
   缺点(推荐系统需要能挖掘长尾信息,此处若j很热门,则w趋向于很大,则买了i的人都会被推荐j,热门商品更加热门)
 
B.
   在A的基础上,加入了对热门物品j的惩罚
 
C.
   活跃用户的贡献度应该要低(例子:一个在当当上买书的人,是一个自己开书店的人)
 
相似度归一化:可提高准确率、召回率、覆盖率、新颖度
--分析:
  假设用户喜欢看两类电影(科幻片,爱情片),而科幻片的相似度普遍比爱情片要低,
  此时用户看了3部爱情片和3部科幻片,经过计算给用户推荐的大部分会是爱情片(应该是爱情和科幻差不多),
  此时通过归一化,可以提高推荐的覆盖率和多样性
 
推荐:
用户u对物品j的兴趣程度,N(u)为用户u购买历史,S(j,K)为和物品j最相似的K个物品
--计算:
   1.获取用户u购买历史,nu
   2.遍历nu,获取和购买过物品i 最相似的K个物品,计算其加上物品i贡献的相似度
 
实现:
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的更多相关文章

  1. Collaborative filtering

        Collaborative filtering, 即协同过滤,是一种新颖的技术.最早于1989年就提出来了,直到21世纪才得到产业性的应用.应用上的代表在国外有Amazon.com,Last. ...

  2. 协同滤波 Collaborative filtering 《推荐系统实践》 第二章

    利用用户行为数据 简介: 用户在网站上最简单存在形式就是日志. 原始日志(raw log)------>会话日志(session log)-->展示日志或点击日志 用户行一般分为两种: 1 ...

  3. mahout算法源码分析之Collaborative Filtering with ALS-WR (四)评价和推荐

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 首先来总结一下 mahout算法源码分析之Collaborative Filtering with AL ...

  4. 【RS】Sparse Probabilistic Matrix Factorization by Laplace Distribution for Collaborative Filtering - 基于拉普拉斯分布的稀疏概率矩阵分解协同过滤

    [论文标题]Sparse Probabilistic Matrix Factorization by Laplace Distribution for Collaborative Filtering  ...

  5. 从item-base到svd再到rbm,多种Collaborative Filtering(协同过滤算法)从原理到实现

    http://blog.csdn.net/dark_scope/article/details/17228643 〇.说明 本文的所有代码均可在 DML 找到,欢迎点星星. 一.引入 推荐系统(主要是 ...

  6. [转]-[携程]-A Hybrid Collaborative Filtering Model with Deep Structure for Recommender Systems

    原文链接:推荐系统中基于深度学习的混合协同过滤模型 近些年,深度学习在语音识别.图像处理.自然语言处理等领域都取得了很大的突破与成就.相对来说,深度学习在推荐系统领域的研究与应用还处于早期阶段. 携程 ...

  7. 【RS】AutoRec: Autoencoders Meet Collaborative Filtering - AutoRec:当自编码器遇上协同过滤

    [论文标题]AutoRec: Autoencoders Meet Collaborative Filtering (WWW'15) [论文作者]Suvash Sedhain †∗ , Aditya K ...

  8. 论文笔记 : NCF( Neural Collaborative Filtering)

    ABSTRACT 主要点为用MLP来替换传统CF算法中的内积操作来表示用户和物品之间的交互关系. INTRODUCTION NeuCF设计了一个基于神经网络结构的CF模型.文章使用的数据为隐式数据,想 ...

  9. chapter3:Collaborative Filtering ---------A Programmer's Guide to Data Mining

    Implicit rating and item based filtering Explicit rating: 用户明确的对item评分 Implicit rating:反之 明确评分所存在的问题 ...

随机推荐

  1. Oracle EBS-SQL (QA-3):检查已检验未入库.sql

    DEFINE RECE="%"  SELECT rsh.receipt_num                                    收据号,           ...

  2. MFC连接ftp服务器

    CInternetSession* m_pInetSession; CFtpConnection*   m_pFtpConnection; //连接服务器的函数 BOOL CftpClientDlg: ...

  3. GridView 导出Excel

    protected void btnExcel_Click(object sender, EventArgs e) { ) { ExportGridViewForUTF8(GridView1, Dat ...

  4. perl 实现微信简版<2>

    <pre name="code" class="python">use LWP::UserAgent; use URI::Escape; use N ...

  5. UML_交互图

    交互图(Interaction Diagram)用来描述系统中的对象是如何进行相互作用的.即一组对象是如何进行消息传递的. 当交互图建模时,通常既包括对象(每个对象都扮演某一特定的角色),又包括消息( ...

  6. 图片拉伸: stretchableImageWithLeftCapWidth

    - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight: (NSInteger)topCa ...

  7. Linux下将多个静态库(.a)合并成一个静态库文件(.a)的命令操作,方法一

    .a 文件的结构和.tar文件就没有什么区别. x 命令解出来, a 命令添加, t命令列表 假设A.a, B.a C.a 在/usr/local/lib目录下 mkdir /tmp/libABC c ...

  8. iOS GCD详解

    前言 对初学者来说,GCD似乎是一道迈不过去的坎,很多人在同步.异步.串行.并行和死锁这几个名词的漩涡中渐渐放弃治疗.本文将使用图文表并茂的方式给大家形象地解释其中的原理和规律. 线程.任务和队列的概 ...

  9. 用Windows Live Writer 2012发博客

    一.软件准备: 最新版的是Windows Live Writer 2012,但是不提供单独的安装包,它是和微软其它软件一起的(包括MSN.Window Move Maker等),软件大小为131M,官 ...

  10. oracle resetlog与noresetlog的作用(转载)

    关于resetlog的作用是将日志序列重置,这样以前的归档就作废. 首先一定要明白oracle工作的基本原理,归档情况下:大家一定要同步,谁也不能滞后或者超前,也就是SCN号,如果学oracle不懂s ...