隐语义模型:

物品       表示为长度为k的向量q(每个分量都表示  物品具有某个特征的程度)
用户兴趣 表示为长度为k的向量p(每个分量都表示  用户对某个特征的喜好程度)
用户u对物品i的兴趣可以表示为
  
其损失函数定义为-
      
使用随机梯度下降,获得参数p,q
 
负样本生成:
对于只有正反馈信息(用户收藏了,关注了xxx)的数据集,需要生成负样本,原则如下
1.生成的负样本要和正样本数量相当
2.物品越热门(用户没有收藏该物品),越有可能是负样本
 
实现:
  1. # coding=gbk
  2. '''
  3. 实现隐语义模型,对隐式数据进行推荐
  4. 1.对正样本生成负样本
  5. -负样本数量相当于正样本
  6. -物品越热门,越有可能成为负样本
  7. 2.使用随机梯度下降法,更新参数
  8. '''
  9.  
  10. import numpy as np
  11. import pandas as pd
  12. import random
  13. from sklearn import cross_validation
  14.  
  15. class LFM():
  16.  
  17. '''
  18. 初始化隐语义模型
  19. 参数:
  20. *F 隐特征的个数
  21. *N 迭代次数
  22. *data 训练数据,要求为pandas的dataframe
  23. *alpha 随机梯度下降的学习速率
  24. *r 正则化参数
  25. *ratio 负样本/正样本比例
  26. '''
  27. def __init__(self,data,F=100,N=1000,alpha=0.02,r=0.01,ratio=1):
  28. self.F=F
  29. self.N=N
  30. self.alpha=alpha
  31. self.r=r
  32. self.data=data
  33. self.ratio=ratio
  34.  
  35. '''
  36. 初始化物品池,物品池中物品出现的次数与其流行度成正比
  37. '''
  38. def InitItemPool(self):
  39. self.itemPool=[]
  40. groups = self.data.groupby([1])
  41. for item,group in groups:
  42. for i in range(group.shape[0]):
  43. self.itemPool.append(item)
  44.  
  45. '''
  46. 获取每个用户对应的商品(用户购买过的商品)列表,如
  47. {用户1:[商品A,商品B,商品C],
  48. 用户2:[商品D,商品E,商品F]...}
  49. '''
  50. def user_item(self,data):
  51. ui = dict()
  52. groups = data.groupby([0])
  53. for item,group in groups:
  54. ui[item]=set(group.ix[:,1])
  55.  
  56. return ui
  57.  
  58. '''
  59. 初始化隐特征对应的参数
  60. numpy的array存储参数,使用dict存储每个用户(物品)对应的列
  61. '''
  62. def initParam(self):
  63. users=set(self.data.ix[:,0])
  64. items=set(self.data.ix[:,1])
  65.  
  66. self.Pdict=dict()
  67. self.Qdict=dict()
  68. for user in users:
  69. self.Pdict[user]=len(self.Pdict)
  70.  
  71. for item in items:
  72. self.Qdict[item]=len(self.Qdict)
  73.  
  74. self.P=np.random.rand(self.F,len(users))/10
  75. self.Q=np.random.rand(self.F,len(items))/10
  76.  
  77. '''
  78. 使用随机梯度下降法,更新参数
  79. '''
  80. def stochasticGradientDecent(self):
  81. alpha=self.alpha
  82. for i in range(self.N):
  83. for user,items in self.ui.items():
  84. ret=self.RandSelectNegativeSamples(items)
  85. for item,rui in ret.items():
  86. p=self.P[:,self.Pdict[user]]
  87. q=self.Q[:,self.Qdict[item]]
  88. eui=rui-sum(p*q)
  89. tmp=p+alpha*(eui*q-self.r*p)
  90. self.Q[:,self.Qdict[item]]+=alpha*(eui*p-self.r*q)
  91. self.P[:,self.Pdict[user]]=tmp
  92. alpha*=0.9
  93. print i
  94.  
  95. def Train(self):
  96. self.InitItemPool()
  97. self.ui = self.user_item(self.data)
  98. self.initParam()
  99. self.stochasticGradientDecent()
  100.  
  101. def Recommend(self,user,k):
  102. items=self.ui[user]
  103. p=self.P[:,self.Pdict[user]]
  104.  
  105. rank = dict()
  106. for item,id in self.Qdict.items():
  107. if item in items:
  108. continue
  109. q=self.Q[:,id];
  110. rank[item]=sum(p*q)
  111. return sorted(rank.items(),lambda x,y:cmp(x[1],y[1]),reverse=True)[0:k-1];
  112. '''
  113. 生成负样本
  114. '''
  115. def RandSelectNegativeSamples(self,items):
  116. ret=dict()
  117. for item in items:
  118. #所有正样本评分为1
  119. ret[item]=1
  120. #负样本个数,四舍五入
  121. negtiveNum = int(round(len(items)*self.ratio))
  122.  
  123. N = 0
  124. while N<negtiveNum:
  125. item = self.itemPool[random.randint(0, len(self.itemPool) - 1)]
  126. if item in items:
  127. #如果在用户已经喜欢的物品列表中,继续选
  128. continue
  129. N+=1
  130. #负样本评分为0
  131. ret[item]=0
  132. return ret
  133.  
  134. data=pd.read_csv('../data/ratings.dat',sep='::',nrows=10000,header=None)
  135. data=data.ix[:,0:1]
  136.  
  137. train,test=cross_validation.train_test_split(data,test_size=0.2)
  138. train = pd.DataFrame(train)
  139. test = pd.DataFrame(test)
  140.  
  141. lfm = LFM(data=train)
  142. lfm.Train()
  143. 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. 字符排序(hdoj1106)

    Problem Description 输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整 ...

  2. Tip.It诞生记

    灵光一闪 之所以想做 Tip.It,完全是受自己初到北京时找房子各种痛苦的启发,当时为了跳过中介租房子,去58同城,豆瓣等各种网站去看房子,比如说下图就是一个典型的58同城的租房页面. 可以看到电话号 ...

  3. HDU 1852 Beijing 2008 数论

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1852 这道题和HDU1452类似. 题意:给你一个n.k,让你求2008^n所有因子的和(包括1和本 ...

  4. 网易云课堂_C++程序设计入门(上)_第1单元:C++概览_第1单元作业 - 写代码 - 互评 (难度:易)

    第1单元作业 - 写代码 - 互评 (难度:易) 查看帮助 返回   提交作业(截止时间已过) 完成并提交作业     作业批改 互评训练   互评作业   自评作业     成绩公布 查看成绩 温 ...

  5. http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html

    http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html

  6. iOS GCD详解

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

  7. C#中的反射原理及应用(转)

    反射的概述 反射的定义:审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等, ...

  8. C#中HashTable的用法 【转】

    一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中 ...

  9. H面试程序(11): 判断字符串是否包含子串问题

    题目描述:                        如字符串str1为''abcdef'''                       字符串str2为'' bc''; 则字符串str1中含有 ...

  10. Javascript自由拖拽类

    基本拖拽配置 new Dragdrop({target 拖拽元素 HTMLElemnt 必选bridge 指定鼠标按下哪个元素时开始拖拽,实现模态对话框时用到 dragable 是否可拖拽 (true ...