隐语义模型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): |
11 | P, Q = initModel(classCount) |
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 f 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]) |
|
本例采用了movielens的一个数据作为测试例子,运行结果如下: