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

隐语义模型LFM(Latent Factor Model):
和LSI,LDA,Topic Model其实都属于隐含语义分析技术,是一类概念,他们在本质上是相通的,都是找出潜在的主题或分类,
然后分类存在理解上的偏差:
1. 编辑很难控制分类的粒度
2. 编辑很难给一个物品分属多个分类
3. 编辑很难决定一个物品在某一个分类中的权重
大数据推荐算法之隐语义模型(lfm)进行Top-N推荐_第1张图片
 
用户对于一个item的喜好程度 = 用户对于某些分类的喜好程度 * 这个item在这些分类中的权重
我们不需要关心分类的⾓度,结果都是基于用户行为统计自动聚类的,全凭数据自己说了算。
不需要关心分类粒度的问题,通过设置LFM的最终分类数就可控制粒度,分类数越大,粒度约细。
对于一个item,并不是明确的划分到某一类,而是计算其属于每一类的概率,是一种标准的软分类。
对于一个user,我们可以得到他对于每一类的兴趣度,而不是只关心可见列表中的那一个类。
对于每一个class,我们可以得到类中每个item的权重,越能代表这个类的item,权重越高。
大数据推荐算法之隐语义模型(lfm)进行Top-N推荐_第2张图片
建立Users对于Items的关系矩阵来
进行训练获取P以及Q的参数
训练样本:用户感兴趣的为1,不感兴趣的
选取时隐性反馈数据的收集:
1 和正样本数量相当
2 选取那些热门但是用户没有操作的样本
我们就是要求解P以及Q矩阵中的参数
大数据推荐算法之隐语义模型(lfm)进行Top-N推荐_第3张图片
 
计算不断优化参数,直到参数收敛,核心代码:
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的一个数据作为测试例子,运行结果如下:
大数据推荐算法之隐语义模型(lfm)进行Top-N推荐_第4张图片
 
本例完整源代码下载

你可能感兴趣的:(推荐系统)