您的位置:首页 > 大数据

大数据推荐算法之隐语义模型(lfm)进行Top-N推荐

2017-07-15 21:24 274 查看
隐语义模型LFM(Latent Factor Model):

和LSI,LDA,Topic Model其实都属于隐含语义分析技术,是一类概念,他们在本质上是相通的,都是找出潜在的主题或分类,

然后分类存在理解上的偏差:

1. 编辑很难控制分类的粒度

2. 编辑很难给一个物品分属多个分类

3. 编辑很难决定一个物品在某一个分类中的权重



 

用户对于一个item的喜好程度 = 用户对于某些分类的喜好程度 * 这个item在这些分类中的权重

我们不需要关心分类的⾓度,结果都是基于用户行为统计自动聚类的,全凭数据自己说了算。

不需要关心分类粒度的问题,通过设置LFM的最终分类数就可控制粒度,分类数越大,粒度约细。

对于一个item,并不是明确的划分到某一类,而是计算其属于每一类的概率,是一种标准的软分类。

对于一个user,我们可以得到他对于每一类的兴趣度,而不是只关心可见列表中的那一个类。

对于每一个class,我们可以得到类中每个item的权重,越能代表这个类的item,权重越高。



建立Users对于Items的关系矩阵来

进行训练获取P以及Q的参数

训练样本:用户感兴趣的为1,不感兴趣的

选取时隐性反馈数据的收集:

1 和正样本数量相当

2 选取那些热门但是用户没有操作的样本

我们就是要求解P以及Q矩阵中的参数



 

计算不断优化参数,直到参数收敛,核心代码:

01
def
 
latenFactorModel(classCount,
iterCount, alpha, lamda):
02
    
'''
03
    
隐语义模型计算参数p,q
04
    
:param
frame: 源数据
05
    
:param
classCount: 隐类数量
06
    
:param
iterCount: 迭代次数
07
    
:param
alpha: 步长
08
    
:param
lamda: 正则化参数
09
    
:return:
参数p,q
10
    
'''
11
    
P,
Q 
=
 
initModel(classCount)
12
    
 
13
    
for
 
step 
in
 
range
(
0
,
iterCount):
14
        
for
 
user,
uitems 
in
 
user_items.items():
15
                
samples
=
RandSelectNegativeSamples(uitems)
16
                
for
 
item,
rui 
in
 
samples.items():
17
                    
eui 
=
 
rui 
-
 
Predict(P,
Q, user, item)
18
                    
for
 
in
 
range
(
0
,
classCount):
19
                        
P[user][f] 
+
=
 
alpha 
*
 
(eui 
*
 
Q[f][item] 
-
lamda 
*
 
P[user][f])
20
                        
Q[f][item] 
+
=
 
alpha 
*
 
(eui 
*
 
P[user][f] 
-
lamda 
*
 
Q[f][item])
21
            
 
22
        
alpha 
*
=
 
0.9
23
        
 
24
    
return
 
P,
Q
 

本例采用了movielens的一个数据作为测试例子,运行结果如下:



 

本例完整源代码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: