隐语义模型LFM

LFM(latent factor model)是一种隐语义模型,与LSI、LDA和Topic Model相似,用于找出潜在的主题或分类。在推荐系统中,LFM通过对用户行为的分析进行物品自动聚类,以理解用户的兴趣并个性化推荐。文章讨论了如何给物品分类、确定用户兴趣及其程度、选择推荐物品等问题,并提供了LFM的迭代优化伪代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

隐语义模型LFM和LSI,LDA,Topic Model其实都属于隐含语义分析技术,是一类概念,他们在本质上是相通的,都是找出潜在的主题或分类。这些技术一开始都是在文本挖掘领域中提出来的,近些年它们也被不断应用到其他领域中,并得到了不错的应用效果。比如,在推荐系统中它能够基于用户的行为对item进行自动聚类,也就是把item划分到不同类别/主题,这些主题/类别可以理解为用户的兴趣。

对于一个用户来说,他们可能有不同的兴趣。就以作者举的豆瓣书单的例子来说,用户A会关注数学,历史,计算机方面的书,用户B喜欢机器学习,编程语言,离散数学方面的书, 用户C喜欢大师Knuth, Jiawei Han等人的著作。那我们在推荐的时候,肯定是向用户推荐他感兴趣的类别下的图书。那么前提是我们要对所有item(图书)进行分类。那如何分呢?大家注意到没有,分类标准这个东西是因人而异的,每个用户的想法都不一样。拿B用户来说,他喜欢的三个类别其实都可以算作是计算机方面的书籍,也就是说B的分类粒度要比A小;拿离散数学来讲,他既可以算作数学,也可当做计算机方面的类别,也就是说有些item不能简单的将其划归到确定的单一类别;拿C用户来说,他倾向的是书的作者,只看某几个特定作者的书,那么跟A,B相比它的分类角度就完全不同了。

对于一个用户,首先得到他的兴趣分类,然后从分类中挑选他可能喜欢的物品。这里要解决3个问题:

  • 如何给物品分类?
  • 如何确定用户对哪些类感兴趣,以及感兴趣的程度?
  • 对于一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在该类中的权重?
LFM解决这些问题的方法:
  • 根据用户的行为实现物品的自动聚类。如果2个物品被很多用户同时喜欢,那么他们属于一个隐类的概率很大。
  • 用户的兴趣通过用户的行为统计得到。
  • 在一个隐类中,如果一个物品被很多用户喜欢,那么它必定权重较大。
对于一个给定的用户行为数据集(数据集包含的是所有的user, 所有的item,以及每个user有过行为的item列表),使用LFM对其建模后,我们可以得到如下图所示的模型:(假设数据集中有3个user, 4个item, LFM建模的分类数为4)
 
其中,R矩阵是user-item兴趣度矩阵,矩阵值Rij表示的是user i 对item j的兴趣度;P是user-class兴趣度矩阵,Pij表示user i对class j的兴趣度;Q是item-class权重矩阵,Qij表示class i中item j的权重。
LFM通过如下公式计算用户u对物品i的兴趣度:

该公式中,是LFM模型的参数,表示矩阵P,Q中的值,需要估计它们的值。
要估计参数值,首先必须要有一个训练样本集,针对每个用户,选择用户的行为数据集作为正样本,正样本中都是用户发生过行为(喜欢)的物品,设=1。然后还需要选择一些数据作为负样本,选择负样本的原则:1、对于一个用户,要保证正、负样本的数量相近;2、对一个用户采样负样本时,要选择那些很热门、而用户没有发生行为的物品(很热门而用户却没有发生行为,更能说明用户不喜欢,冷门物品用户可能根本没有看到),负样本的物品,设=0。
LFM的损失函数仍然是平方差+正则项,如下:<
### 隐语义 LFM 模型 Python 代码实现 隐语义模型(Latent Factor Model, LFM)通过引入潜在因子来表示用户和物品之间的关系,从而能够更好地捕捉数据中的隐藏模式。下面是一个基于矩阵分解方法的简单隐语义模型实现。 #### 数据准备 为了训练LFM模型,通常需要一个评分矩阵作为输入。这里假设有一个简单的用户-项目评分表: ```python import numpy as np from sklearn.metrics.pairwise import cosine_similarity ratings = { 'Alice': {'Item1': 5, 'Item2': 3}, 'Bob': {'Item1': 4, 'Item3': 2}, 'Charlie': {'Item2': 1, 'Item3': 5} } # 将字典转换成稀疏矩阵形式 users = list(ratings.keys()) items = set() for user in ratings.values(): items.update(user.keys()) n_users = len(users) n_items = len(items) item_indices = {item: i for i, item in enumerate(sorted(items))} user_indices = {user: i for i, user in enumerate(users)} rating_matrix = np.zeros((n_users, n_items)) for user, scores in ratings.items(): uid = user_indices[user] for item, score in scores.items(): rating_matrix[uid][item_indices[item]] = score ``` #### 训练LFM模型 接下来定义并训练LFM模型函数,该过程涉及初始化随机权重向量P和Q,并利用梯度下降法更新这些参数直到收敛为止。 ```python def lfm_train(R, K=2, steps=5000, alpha=0.0002, beta=0.02): """ 使用显式反馈的数据集训练LFM模型 参数: R -- 用户-项目的评分矩阵 (m x n), m代表用户的数量,n代表商品的数量. K -- 主成分个数(即隐含特征维度). steps -- 迭代次数. alpha -- 学习速率. beta -- 正则项系数. 返回值: P,Q -- 分解后的两个低秩矩阵(m×K 和 K×n),它们相乘可以近似原始R矩阵. """ N = len(R) # Number of users M = len(R[0]) # Number of movies/items P = np.random.rand(N,K) Q = np.random.rand(M,K) for step in range(steps): eij_sum_square_error = 0 for u in range(len(R)): for i in range(len(R[u])): if R[u][i]>0: eui=R[u][i]-np.dot(P[u,:],Q[i,:].T) for k in range(K): P[u][k]=P[u][k]+alpha*(eui*Q[i][k]-beta*P[u][k]) Q[i][k]=Q[i][k]+alpha*(eui*P[u][k]-beta*Q[i][k]) eij_sum_square_error += pow(eui, 2) if eij_sum_square_error<0.001: break return P, Q.T ``` 此部分实现了基本版的LFM算法,在实际应用中可能还需要考虑更多因素如偏置项、时间衰减效应等以提高预测精度[^3]。 #### 应用LFM进行推荐 一旦获得了P和Q这两个矩阵之后就可以用来做个性化推荐了: ```python P, Qt = lfm_train(rating_matrix) predicted_ratings = np.dot(P,Qt) print("Predicted Ratings:\n", predicted_ratings) ``` 上述代码展示了如何构建一个基础版本的隐语义模型以及怎样运用它来进行电影或其他产品的推荐服务。当然这只是一个非常简化例子,在真实场景下还需加入更多的优化措施和技术细节处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值