基于标签的推荐系统学习

最近看一些推荐系统的东西。比较感兴趣的是基于标签的推荐系统。也就是通过用户的标签行为建立起用户和目标物品的联系,从而挖掘用户的兴趣或者是尽兴定向的推荐。

一个用户的标签行为一般由一个三元组组成<用户,物品,标签>(<u,i,b>)即用户u给物品i打上了b标签。

一个简单的基于标签的推荐系统可以通过如下步骤实现:

1.统计每个用户最常用标签;

2.对于每个标签,统计被打过这个标签次数最多的物品;

3.对于一个用户,找到他常用的标签,从而找到具有这些标签的热门物品进行推荐。

从而可以得到用户u对于物品i的兴趣公式:

假设用records来表示来存储标签数据的三元组,即records[i]=[user, item, tag]

user_tags存储用户u打过标签b的次数,即user_tags[u][b]=n;

tag_items存储物品i被打过标签b的次数,即tag_item[b][i]=n;

user_items存储用户所打过标签的物品,即user_items[u][i]=n;

#coding: UTF-8
import random
#统计各类数量
def addValueToMat(theMat,key,value,incr):
    if key not in theMat: #如果key没出先在theMat中
        theMat[key]=dict();
        theMat[key][value]=incr;
    else:
        if value not in theMat[key]:
            theMat[key][value]=incr;
        else:
            theMat[key][value]+=incr;#若有值,则递增

user_tags = dict();
tag_items = dict();
user_items = dict();
user_items_test = dict();#测试集数据字典

#初始化,进行各种统计
def InitStat():
    data_file = open('xxx.dat')
    line = data_file.readline();
    while line:
        if random.random()>0.1:#将90%的数据作为训练集,剩下10%的数据作为测试集
            terms = line.split("\t");#训练集的数据结构是[user, item, tag]形式
            user=terms[0];
            item=terms[1];
            tag=terms[2];
            addValueToMat(user_tags,user,tag,1)
            addValueToMat(tag_items,tag,item,1)
            addValueToMat(user_items,user,item,1)
            line = data_file.readline();
        else:
            addValueToMat(user_items_test,user,item,1)
    data_file.close();
#推荐算法
def Recommend(usr):
    recommend_list = dict();
    tagged_item = user_items[usr];#得到该用户所有推荐过的物品
    for tag_,wut in user_tags[usr].items():#用户打过的标签及次数
        for item_,wit in tag_items[tag_].items():#物品被打过的标签及被打过的次数
            if item_ not in tagged_item:#已经推荐过的不再推荐
                if item_ not in recommend_list:
                    recommend_list[item_]=wut*wit;#根据公式
                else:
                    recommend_list[item_]+=wut*wit;
    return recommend_list
时间: 2024-08-26 05:12:05

基于标签的推荐系统学习的相关文章

基于标签的推荐系统

一. 标签系统 标签是一种无层次化结构. 用来描述信息的关键词, 可以作为物品的元信息. 利用标签可以更好地组织和推荐物品.根据解决的问题, 可以将标签系统分为两种:1. 根据 Item 的标签为用户推荐 Item:2. 在用户打标签时, 推荐合适的 Item 的标签: 二. 标签算法及优化 a. 算法流程: 1. 统计每个用户常用标签2. 对于每个标签, 统计打过这个标签次数较多的物品3. 对于一个用户, 找到其常用标签, 然后找到具有这些标签的最热门物品 b. 兴趣公式: c. 算法优化:

《推荐系统》基于标签的用户推荐系统

1:联系用户兴趣和物品的方式 2:标签系统的典型代表 3:用户如何打标签 4:基于标签的推荐系统 5:算法的改进 源代码查看地址:github查看 一:联系用户兴趣和物品的方式 推荐系统的目的是联系用户的兴趣和物品,这种联系方式需要依赖不同的媒介.目前流行的推荐系统基本上是通过三种方式联系用户兴趣和物品. 1:利用用户喜欢过的物品,给用户推荐与他喜欢过的物品相似的物品,即基于item的系统过滤推荐算法(算法分析可参考:点击阅读) 2:利用用户和兴趣用户兴趣相似的其他用户,给用户推荐哪些和他们兴趣

推荐系统学习(2)——基于TF-IDF的改进

使用用户打标签次数*物品打标签次数做乘积的算法尽管简单.可是会造成热门物品推荐的情况.物品标签的权重是物品打过该标签的次数,用户标签的权重是用户使用过该标签的次数.从而导致个性化的推荐减少,而造成热门推荐. 运用TF-IDF的思想能够对算法进行改进.TF-IDF(term frequemcy-inverse documnet frequency)是一种用于资讯检索和文本挖掘的加权技术.用来评估一个词的重要程度.其主要思想是假设某个词或短语在一篇文章中出现的频率TF高,而且在其它文章中非常少出现,

推荐系统学习07-Waffles

介绍 Waffles 英文原意是蜂蜜甜饼,在这里却指代一个很强大的机器学习的开源工具包. Waffles里包括的算法特别多.涉及机器学习的方方面面,推荐系统位于当中的Waffles_recommend  tool,大概仅仅占整个Waffles的1/10的内容,其他还有分类.聚类.採样.降维.数据可视化.音频处理等许很多多工具包,预计能与之媲美的也就数Weka了. 你能够在waffles看到关于这个工具的具体内容. 你还能够訪问waffles的github网站. waffles与其它的机器学习工具

大数据算法-&gt;推荐系统常用算法之基于内容的推荐系统算法

港真,自己一直非常希望做算法工程师,所以自己现在开始对现在常用的大数据算法进行不断地学习,今天了解到的算法,就是我们生活中无处不在的推荐系统算法. 其实,向别人推荐商品是一个很常见的现象,比如我用了一个好的商品,向朋友安利之类的.在以前广告系统不发达的时候,我们也是靠口口相传来进行商品的推广.那么为什么,现在推荐系统变的非常重要了呢?,在以前,我们的商品不像现在的物品一样琳琅满目,我们有时间,可以把商品都浏览一遍在进行选择,因为我们都想选择所有商品中最好的,而现在,由于资源的众多,我们不会用大把

学习Keras:《Keras快速上手基于Python的深度学习实战》PDF代码+mobi

有一定Python和TensorFlow基础的人看应该很容易,各领域的应用,但比较广泛,不深刻,讲硬件的部分可以作为入门人的参考. <Keras快速上手基于Python的深度学习实战>系统地讲解了深度学习的基本知识.建模过程和应用,并以深度学习在推荐系统.图像识别.自然语言处理.文字生成和时间序列中的具体应用为案例,详细介绍了从工具准备.数据获取和处理到针对问题进行建模的整个过程和实践经验. <Keras快速上手>PDF,531页,带书签目录,彩色配图,文字可以复制. 配套源代码和

基于 Android NDK 的学习之旅----- C调用Java

http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html 基于 Android NDK 的学习之旅----- C调用Java许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态方法. 1.主要流程 1.  新建一个测试类TestProvider.java a)       

【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码) 基于 Android NDK 的学习之旅-----数据传输(引用数据类型) 接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1.  String 字符串传输 a)         上层定义一个native的方法

基于标签方式的工作流启动及任务执行开发说明

基于现在的系统的整合需求,本系统提供基于标签的工作流整合方式,工作流的启动及执行下一步时,均需要通过可以通过标识来处理完成.这使得基于JSP方式的流程整合变得很简单. 自定义工作流启动 系统提供启动参数,只需要提交至/flow/startProcessActivity.do,提交的参数包括以下:(可以参考ProcessRunStart.js的) defId: 必需,流程定义Id,即pro_definition表里的主键 startFlow: 必需,值为true,则表示启动流程   必填 dest