LFM 隐语义模型
隐语义模型:


- # coding=gbk
- '''
- 实现隐语义模型,对隐式数据进行推荐
- 1.对正样本生成负样本
- -负样本数量相当于正样本
- -物品越热门,越有可能成为负样本
- 2.使用随机梯度下降法,更新参数
- '''
- import numpy as np
- import pandas as pd
- import random
- from sklearn import cross_validation
- class LFM():
- '''
- 初始化隐语义模型
- 参数:
- *F 隐特征的个数
- *N 迭代次数
- *data 训练数据,要求为pandas的dataframe
- *alpha 随机梯度下降的学习速率
- *r 正则化参数
- *ratio 负样本/正样本比例
- '''
- def __init__(self,data,F=100,N=1000,alpha=0.02,r=0.01,ratio=1):
- self.F=F
- self.N=N
- self.alpha=alpha
- self.r=r
- self.data=data
- self.ratio=ratio
- '''
- 初始化物品池,物品池中物品出现的次数与其流行度成正比
- '''
- def InitItemPool(self):
- self.itemPool=[]
- groups = self.data.groupby([1])
- for item,group in groups:
- for i in range(group.shape[0]):
- self.itemPool.append(item)
- '''
- 获取每个用户对应的商品(用户购买过的商品)列表,如
- {用户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]=set(group.ix[:,1])
- return ui
- '''
- 初始化隐特征对应的参数
- numpy的array存储参数,使用dict存储每个用户(物品)对应的列
- '''
- def initParam(self):
- users=set(self.data.ix[:,0])
- items=set(self.data.ix[:,1])
- self.Pdict=dict()
- self.Qdict=dict()
- for user in users:
- self.Pdict[user]=len(self.Pdict)
- for item in items:
- self.Qdict[item]=len(self.Qdict)
- self.P=np.random.rand(self.F,len(users))/10
- self.Q=np.random.rand(self.F,len(items))/10
- '''
- 使用随机梯度下降法,更新参数
- '''
- def stochasticGradientDecent(self):
- alpha=self.alpha
- for i in range(self.N):
- for user,items in self.ui.items():
- ret=self.RandSelectNegativeSamples(items)
- for item,rui in ret.items():
- p=self.P[:,self.Pdict[user]]
- q=self.Q[:,self.Qdict[item]]
- eui=rui-sum(p*q)
- tmp=p+alpha*(eui*q-self.r*p)
- self.Q[:,self.Qdict[item]]+=alpha*(eui*p-self.r*q)
- self.P[:,self.Pdict[user]]=tmp
- alpha*=0.9
- print i
- def Train(self):
- self.InitItemPool()
- self.ui = self.user_item(self.data)
- self.initParam()
- self.stochasticGradientDecent()
- def Recommend(self,user,k):
- items=self.ui[user]
- p=self.P[:,self.Pdict[user]]
- rank = dict()
- for item,id in self.Qdict.items():
- if item in items:
- continue
- q=self.Q[:,id];
- rank[item]=sum(p*q)
- return sorted(rank.items(),lambda x,y:cmp(x[1],y[1]),reverse=True)[0:k-1];
- '''
- 生成负样本
- '''
- def RandSelectNegativeSamples(self,items):
- ret=dict()
- for item in items:
- #所有正样本评分为1
- ret[item]=1
- #负样本个数,四舍五入
- negtiveNum = int(round(len(items)*self.ratio))
- N = 0
- while N<negtiveNum:
- item = self.itemPool[random.randint(0, len(self.itemPool) - 1)]
- if item in items:
- #如果在用户已经喜欢的物品列表中,继续选
- continue
- N+=1
- #负样本评分为0
- ret[item]=0
- return ret
- data=pd.read_csv('../data/ratings.dat',sep='::',nrows=10000,header=None)
- data=data.ix[:,0:1]
- train,test=cross_validation.train_test_split(data,test_size=0.2)
- train = pd.DataFrame(train)
- test = pd.DataFrame(test)
- lfm = LFM(data=train)
- lfm.Train()
- lfm.Recommend(1, 10)
LFM 隐语义模型的更多相关文章
- RS:关于协同过滤,矩阵分解,LFM隐语义模型三者的区别
项亮老师在其所著的<推荐系统实战>中写道: 第2章 利用用户行为数据 2.2.2 用户活跃度和物品流行度的关系 [仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法.学术界对协同过滤算 ...
- LFM隐语义模型Latent Factor Model
实际应用 LFM 模型在实际使用中有一个困难,就是很难实现实时推荐.经典的 LFM 模型每次训练都需要扫描所有的用户行为记录,并且需要在用户行为记录上反复迭代来优化参数,所以每次训练都很耗时,实际应用 ...
- 【转载】使用LFM(Latent factor model)隐语义模型进行Top-N推荐
最近在拜读项亮博士的<推荐系统实践>,系统的学习一下推荐系统的相关知识.今天学习了其中的隐语义模型在Top-N推荐中的应用,在此做一个总结. 隐语义模型LFM和LSI,LDA,Topic ...
- 使用LFM(Latent factor model)隐语义模型进行Top-N推荐
最近在拜读项亮博士的<推荐系统实践>,系统的学习一下推荐系统的相关知识.今天学习了其中的隐语义模型在Top-N推荐中的应用,在此做一个总结. 隐语义模型LFM和LSI,LDA,Topic ...
- 推荐系统之隐语义模型(LFM)
LFM(latent factor model)隐语义模型,这也是在推荐系统中应用相当普遍的一种模型.那这种模型跟ItemCF或UserCF的不同在于: 对于UserCF,我们可以先计算和目标用户兴趣 ...
- 推荐系统第5周--- 基于内容的推荐,隐语义模型LFM
基于内容的推荐
- 推荐系统之隐语义模型LFM
LFM(latent factor model)隐语义模型,这也是在推荐系统中应用相当普遍的一种模型.那这种模型跟ItemCF或UserCF的不同在于: 对于UserCF,我们可以先计算和目标用户兴趣 ...
- 推荐系统--隐语义模型LFM
主要介绍 隐语义模型 LFM(latent factor model). 隐语义模型最早在文本挖掘领域被提出,用于找到文本的隐含语义,相关名词有 LSI.pLSA.LDA 等.在推荐领域,隐语义模型也 ...
- 隐语义模型LFM
隐语义模型是通过隐含特征,联系用户和物品,基于用户的特征对物品进行自动聚类,然后在用户感兴趣的类中选择物品推荐给用户. 对于推荐系统,常用的算法: USER-CF:给用户推荐和他兴趣相似的用户喜欢 ...
随机推荐
- 字符排序(hdoj1106)
Problem Description 输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整 ...
- Tip.It诞生记
灵光一闪 之所以想做 Tip.It,完全是受自己初到北京时找房子各种痛苦的启发,当时为了跳过中介租房子,去58同城,豆瓣等各种网站去看房子,比如说下图就是一个典型的58同城的租房页面. 可以看到电话号 ...
- HDU 1852 Beijing 2008 数论
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1852 这道题和HDU1452类似. 题意:给你一个n.k,让你求2008^n所有因子的和(包括1和本 ...
- 网易云课堂_C++程序设计入门(上)_第1单元:C++概览_第1单元作业 - 写代码 - 互评 (难度:易)
第1单元作业 - 写代码 - 互评 (难度:易) 查看帮助 返回 提交作业(截止时间已过) 完成并提交作业 作业批改 互评训练 互评作业 自评作业 成绩公布 查看成绩 温 ...
- http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html
http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html
- iOS GCD详解
前言 对初学者来说,GCD似乎是一道迈不过去的坎,很多人在同步.异步.串行.并行和死锁这几个名词的漩涡中渐渐放弃治疗.本文将使用图文表并茂的方式给大家形象地解释其中的原理和规律. 线程.任务和队列的概 ...
- C#中的反射原理及应用(转)
反射的概述 反射的定义:审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等, ...
- C#中HashTable的用法 【转】
一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中 ...
- H面试程序(11): 判断字符串是否包含子串问题
题目描述: 如字符串str1为''abcdef''' 字符串str2为'' bc''; 则字符串str1中含有 ...
- Javascript自由拖拽类
基本拖拽配置 new Dragdrop({target 拖拽元素 HTMLElemnt 必选bridge 指定鼠标按下哪个元素时开始拖拽,实现模态对话框时用到 dragable 是否可拖拽 (true ...