隐语义模型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):
|
05
|
:param
classCount: 隐类数量
|
06
|
:param
iterCount: 迭代次数
|
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的一个数据作为测试例子,运行结果如下: