隐语义模型:

物品       表示为长度为k的向量q(每个分量都表示  物品具有某个特征的程度)
用户兴趣 表示为长度为k的向量p(每个分量都表示  用户对某个特征的喜好程度)
用户u对物品i的兴趣可以表示为
  
其损失函数定义为-
      
使用随机梯度下降,获得参数p,q
 
负样本生成:
对于只有正反馈信息(用户收藏了,关注了xxx)的数据集,需要生成负样本,原则如下
1.生成的负样本要和正样本数量相当
2.物品越热门(用户没有收藏该物品),越有可能是负样本
 
实现:
# 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 隐语义模型的更多相关文章

  1. RS:关于协同过滤,矩阵分解,LFM隐语义模型三者的区别

    项亮老师在其所著的<推荐系统实战>中写道: 第2章 利用用户行为数据 2.2.2 用户活跃度和物品流行度的关系 [仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法.学术界对协同过滤算 ...

  2. LFM隐语义模型Latent Factor Model

    实际应用 LFM 模型在实际使用中有一个困难,就是很难实现实时推荐.经典的 LFM 模型每次训练都需要扫描所有的用户行为记录,并且需要在用户行为记录上反复迭代来优化参数,所以每次训练都很耗时,实际应用 ...

  3. 【转载】使用LFM(Latent factor model)隐语义模型进行Top-N推荐

    最近在拜读项亮博士的<推荐系统实践>,系统的学习一下推荐系统的相关知识.今天学习了其中的隐语义模型在Top-N推荐中的应用,在此做一个总结. 隐语义模型LFM和LSI,LDA,Topic ...

  4. 使用LFM(Latent factor model)隐语义模型进行Top-N推荐

    最近在拜读项亮博士的<推荐系统实践>,系统的学习一下推荐系统的相关知识.今天学习了其中的隐语义模型在Top-N推荐中的应用,在此做一个总结. 隐语义模型LFM和LSI,LDA,Topic ...

  5. 推荐系统之隐语义模型(LFM)

    LFM(latent factor model)隐语义模型,这也是在推荐系统中应用相当普遍的一种模型.那这种模型跟ItemCF或UserCF的不同在于: 对于UserCF,我们可以先计算和目标用户兴趣 ...

  6. 推荐系统第5周--- 基于内容的推荐,隐语义模型LFM

    基于内容的推荐

  7. 推荐系统之隐语义模型LFM

    LFM(latent factor model)隐语义模型,这也是在推荐系统中应用相当普遍的一种模型.那这种模型跟ItemCF或UserCF的不同在于: 对于UserCF,我们可以先计算和目标用户兴趣 ...

  8. 推荐系统--隐语义模型LFM

    主要介绍 隐语义模型 LFM(latent factor model). 隐语义模型最早在文本挖掘领域被提出,用于找到文本的隐含语义,相关名词有 LSI.pLSA.LDA 等.在推荐领域,隐语义模型也 ...

  9. 隐语义模型LFM

      隐语义模型是通过隐含特征,联系用户和物品,基于用户的特征对物品进行自动聚类,然后在用户感兴趣的类中选择物品推荐给用户. 对于推荐系统,常用的算法: USER-CF:给用户推荐和他兴趣相似的用户喜欢 ...

随机推荐

  1. 阿里云CentOS 7.1使用yum安装MySql5.6.24

    正确的安装方法: 众所周知,Linux系统自带的repo是不会自动更新每个软件的最新版本(基本都是比较靠后的稳定版),所以无法通过yum方式安装MySQL的高级版本.所以我们需要先安装带有当前可用的m ...

  2. Callable,Runnable比较及用法

    http://blog.csdn.net/xtwolf008/article/details/7713580 http://www.cnblogs.com/whgw/archive/2011/09/2 ...

  3. interbase C++Builder 简单例子

    interbase C++Builder  的例子,网上找了半天也没找到合适的,下面是一般能搜索到的文章,现在整理下: 下面我以interbase―――C++Builder,介绍一个简单的例子(不过很 ...

  4. D、GO、Rust 谁会在未来取代 C?为什么?——Go语言的定位非常好,Rust语言非常优秀,D语言也不错

    不要管我的地位和 D 语言创造者之一的身份.我会坦诚的回答这个问题.我熟悉 Go 和 Rust,并且知道 D 的缺点在哪里.我鼓励人们在 Rust 和 Go 社区相似身份的人,也可以提出他们诚恳的观点 ...

  5. JavaScript学习总结(十六)——Javascript闭包(Closure)

    原文地址: http://www.cnblogs.com/xdp-gacl/p/3703876.html 闭包(closure)是Javascript语言的一个难点,也是它的特色, 很多高级应用都要依 ...

  6. 关于App的一些迷思以及一些动画效果开源库的推荐

    http://www.open-open.com/lib/view/open1427856817396.html

  7. MySQL的零碎知识点

    让Windows下的MySQL表名大小写敏感: 在mysql查询中执行:SHOW VARIABLES LIKE 'lower_case_table_names'; 值的含义--->0:大小写敏感 ...

  8. SQLite.dll混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。

    其他信息: V5.7.4.4 Can't find the System.Data.SQLite.dll more info : 混合模式程序集是针对"v2.0.50727"版的运 ...

  9. zoj 3229 有源汇有上下界的最大流模板题

    /*坑啊,pe的程序在zoj上原来是wa. 题目大意:一个屌丝给m个女神拍照.计划拍照n天,每一天屌丝最多个C个女神拍照,每天拍照数不能超过D张,并且给每一个女神i拍照有数量限制[Li,Ri], 对于 ...

  10. ListView嵌套ListView时发生:View too large to fit into drawing cache的问题

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXkxMzg3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...