隐语义模型LFM(latent factor model)

本文介绍了基于用户兴趣分类的推荐系统实现方法,重点讲解了隐含语义分析技术(LFM)的工作原理,包括如何根据用户行为进行物品分类、确定用户兴趣程度以及计算物品权重。此外还探讨了LFM在隐性反馈数据集上的应用。

对于某个用户,首先得到他的兴趣分类,然后从分类中挑选他可能喜欢的物品。总结一下,这个基于兴趣分类的方法大概需要解决3个问题。

  1. 如何给物品进行分类?
  2. 如何确定用户对哪些类的物品感兴趣,以及感兴趣的程度?
  3. 对于一个给定的类。选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在一个类中的权重?

隐含语义分析技术采用基于用户行为统计的自动聚类,较好地解决了上面提出的问题。

隐含语义分析技术的分类来自对用户行为的统计,代表了用户对物品分类的看法。隐含语义分析技术和ItemCF在物品分类方面的思想类似,如果两个物品被很多用户同时喜欢,那么这两个物品就很有可能属于同一个类。隐含语义分析技术允许指定最终有多少个分类,这个数字越大,分类的粒度就会越细,反之分类粒度就会越粗。隐含语义分析技术会计算出物品属于每个类的权重,因此每个物品都不是硬性地被分到某一个类中。隐含语义分析技术给出的每个分类都不是同一个维度的,它是基于用户的共同兴趣计算出来的,如果用户的共同兴趣是某一个维度,那么LFM给出的类也是相同的维度。隐含语义分析技术可以通过统计用户行为决定物品在每个类中的权重,如果喜欢某个类的用户都会喜欢某个物品,那么这个物品在这个类中的权重就可能比较高。

LFM通过如下公式计算用户u物品i的兴趣:

preference(u,i)=r_{ui}=p_u^Tq_i=\sum_{f=1}^Fp_{u,k}q_{i,k}

这个公式中$p_{u,k}$$q_{i,k}$是模型的参数,其中$p_{u,k}$度量了用户$u$的兴趣和第$k$个隐类的关系,而$q_{i,k}$度量了第$k$个隐类和物品$i$之间的关系。那么下面的问题就是如何计算这两个参数。

要计算这两个参数,需要一个训练集,对于每个用户$u$,训练集里都包含了用户$u$喜欢的物品和不感兴趣的物品,通过学习这个数据集,就可以获得上面的模型参数。

推荐系统的用户行为分为显性反馈和隐性反馈。LFM在显性反馈数据(也就是评分数据)上解决评分预测问题并达到了很好的精度。这里主要讨论的是隐性反馈数据集,这种数据集的特点是只有正样本(用户喜欢什么物品),而没有负样本(用户对什么物品不感兴趣)。

对负样本采样时应该遵循以下原则:

  • 对每个用户,要保证正负样本的平衡(数目相似)。
  • 对每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品。

一般认为,很热门而用户却没有行为更加代表用户对这个物品不感兴趣。因为对于冷门的物品,用户可能是压根没在网站中发现这个物品,所以谈不上是否感兴趣。

下面的python代码实现了负样本采样过程:

def RandomSelectNegativeSample(self, items):
    #items是一个dict,它维护了用户已经有过行为的物品的集合
    #在这个列表中,物品i出现的次数和物品i的流行度成正比
    ret = dict()
    for i in items.keys():
        ret[i] = 1
    n = 0
    #将范围上限设为len(items) * 3,主要是为保证正、负样本数量接近。
    for i in range(0, len(items) * 3):
        #items_pool维护了候选物品的列表
        item = items_pool[random.randint(0, len(items_pool) - 1)]
        if item in ret:
            continue
        ret[item] = 0
        n += 1
        if n > len(items):
            break
    return ret
 

转载于:https://www.cnblogs.com/iamxyq/p/5902791.html

### 隐语义 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、付费专栏及课程。

余额充值