item Collaborative Filtering

算法步骤:

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
时间: 2024-11-08 15:13:07

item Collaborative Filtering的相关文章

【转载】协同过滤(Collaborative Filtering)

Collaborative Filtering 协同过滤的主要目标:由于网络信息量的增多,用户往往被淹没在信息的海洋里,很难很轻易的找到自己感兴趣的topic.协同过滤就是为了把用户最可能感兴趣的信息推送给用户(Recommer system). 协同过滤的方法: model-base,user-base,item-base,content-base. user-based:搜集用户profile.对于一个active user,找到跟其比较接近(或者相似)的几个neighbour.使用这些ne

推荐系统(recommender systems):预测电影评分--构造推荐系统的一种方法:协同过滤(collaborative filtering )

协同过滤(collaborative filtering )能自行学习所要使用的特征 如我们有某一个数据集,我们并不知道特征的值是多少,我们有一些用户对电影的评分,但是我们并不知道每部电影的特征(即每部电影到底有多少浪漫成份,有多少动作成份) 假设我们通过采访用户得到每个用户的喜好,如上图中的Alice喜欢爱情电影,不喜欢动作电影,则我们将θ(1)设为[0,5,0],如此设置θ(2),θ(3),θ(4)的值,这样我们有了每个用户的θ的值以及他们对电影的打分,就可以推断出每部电影的x(特征)的值.

collaborative filtering协同过滤

每次我想看电影的时候,都会去问我的朋友,小健.一般他推荐的电影,我都比较喜欢.显然不是所有人都有小健这样的能力.因为我碰巧和小健有类似的品味. 这个生活中的经验,实际上有着广泛的用途. 当系统需要为某个人做出推荐时,一种机器学习的算法是这样工作的:就是在一大群人中找出一部分与他品味类似的人,把这些人的喜欢的东西排序,然后推荐给他. 自然引出两个问题: 谁是与他相近品味的人: 怎么对这些人喜欢的东西排序: 对于上述两个问题有多种不同的答案,不同的答案意味着不同的算法. --- 问题1的答案有两种:

亚马逊 协同过滤算法 Collaborative filtering

这节课时郭强的三维课.他讲的是MAYA和max .自己对这个也不怎么的感兴趣.而且这个课感觉属于数字媒体.自己对游戏,动画,这些东西一点都不兴趣,比如大一的时候刚开学的时候,张瑞的数字媒体的导论课.还有就是秀霞的动画课,自己记录一下自己的思想我在网上看见了这样一个说法,说的是跟着本科生导师做项目.就比如一个人说的,先找一个APP运行一遍,然后再这个基础上修改,各种的粘贴代码.是继续的做这个项目,还是学一点计算机的基础知识了.开始写算法,亚马逊的协同过滤算法 第一:初次印象,进入一个网站的时候,可

[论文阅读&翻译]Item-to-Item Collaborative Filtering

Amazon.com Recommendations Item-to-Item Collaborative Filtering 个人感受: 这篇论文首先介绍了历史上的三种算法:传统协同过滤.聚类.基于搜索的算法.第一种方法在计算效率.少量数据上表现欠佳:第二种方法准确率欠佳:第三种方法比较"简单",因此提出了大量计算在线下的物品-物品的相似记录进行推荐. 揣测一下作者的思路,计算量大是因为数据量大,但是其中有价值的就是其中购买的物品,而且对于购买的物品来说,我们推荐的也是根据购买的物品

Item-to-Item Collaborative Filtering

Amazon.com Recommendations Item-to-Item Collaborative Filtering 个人感受: 这篇论文首先介绍了历史上的三种算法:传统协同过滤.聚类.基于搜索的算法.第一种方法在计算效率.少量数据上表现欠佳:第二种方法准确率欠佳:第三种方法比较"简单",因此提出了大量计算在线下的物品-物品的相似记录进行推荐. 揣测一下作者的思路,计算量大是因为数据量大,但是其中有价值的就是其中购买的物品,而且对于购买的物品来说,我们推荐的也是根据购买的物品

【RS】Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model - 当因式分解遇上邻域:多层面协同过滤模型

[论文标题]Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model   (35th-ICML,PMLR) [论文作者]Yehuda Koren [论文链接]Paper (9-pages // Double column) [摘要] 推荐系统为用户提供个性化的产品或服务建议.这些系统通常依赖于协同过滤(CF),通过分析过去的事务来建立用户和产品之间的关联.比较成功的CF方法有两种,一种是直

协同过滤 Collaborative Filtering

协同过滤 collaborative filtering 人以类聚,物以群分 相似度 1. Jaccard 相似度 定义为两个集合的交并比: Jaccard 距离,定义为 1 - J(A, B),衡量两个集合的区分度: 为什么 Jaccard 不适合协同过滤?—— 只考虑用户有没有看过,没考虑评分大小 2. 余弦相似度 根据两个向量夹角的余弦值来衡量相似度: 为什么余弦相似度不适合协同过滤?—— 不同用户各自评分总和不一样,导致评分占总比不一样,可能计算出和事实相反的结果. 3. Pearson

论文笔记-Item2Vec- Neural Item Embedding for Collaborative Filtering

将word2vec思想拓展到序列item的2vec方法并运用到推荐系统中,实质上可以认为是一种cf 在word2vec中,doc中的word是具有序列关系的,优化目标类似在max对数似然函数 应用在item2vec上,可以有两种看待方式: (1)如果item是强时序关系的,那么对某一次序列中的item,可以看成doc中的word,对其进行word2vec (2)如果item是set-based,不用考虑时序,那么可能需要对word2vec进行变形 论文中对第二种情况进行了描述,有两种变形方式 (