svd++

SVD++ refers to a matrix factorization model which makes use of implicit feedback information. In general, implicit feedback can refer to any kinds of users' history information that can help indicate users' preference.

CONTENTS

 [hide

MODEL FORMALIZATION

The SVD++ model is formally described as following equation:

r_{ui} = \mu + b_u + b_i + \left(p_u + \frac{1}{\sqrt{|N(u)|}}\sum_{j\in N(u)} y_j \right)^T q_i,

where N(u) is the set of implicit information( the set of items user u rated ).

GENERAL FORMALIZATION FOR USER FEEDBACK INFORMATION

A more general form of utilizing implicit/explicit information as user factor can be described in following equation

r_{ui} = \mu + b_u + b_i + \left(p_u + \sum_{i\in Ufeed(u)} \alpha_i y_i \right)^T q_i.

Here Ufeed(u) is the set of user feedback information( e.g: the web pages the user clicked, the music on users' favorite list, the movies user watched, any kinds of information that can be used to describe the user).  \alpha_i  is a feature weightassociates with the user feedback information. With the most two common choices: (1) \frac{1}{\sqrt{|N(u)|}} for implicit feedback, (2) \frac{r_{uj} - b_u}{\sqrt{|R(u)|}} for explicit feedback.

(一直搞不清楚上面公式当中yi到底是什么,现在清楚了,yi就是上面所写出来的隐式反馈!)

LEARNING

SVD++ can be trained using ALS.

It is slow to train a SVD++-style model using stochastic gradient descent due to the size of user feedback information, however, an efficient SGD training algorithm can be used. [1] describes efficient training with user feedback information in section 4

LITERATURE

IMPLEMENTATIONS


### SVD++ 算法详解 SVD++ 是一种改进版的奇异值分解(SVD)方法,在推荐系统领域得到了广泛应用。它通过引入隐式反馈数据来增强模型的表现力,从而提高预测精度。 #### 隐式反馈的作用 传统的 SVD 方法仅依赖显式的用户-物品交互数据(如评分),而忽略了用户的其他行为模式(如点击、浏览等)。然而,这些隐式反馈同样可以反映用户的偏好[^2]。因此,SVD++ 的核心思想是在原有基础上加入隐式反馈的影响,使得模型能够更全面地捕捉用户的行为特征。 #### 数学表达形式 假设 $ r_{ui} $ 表示用户 $ u $ 对物品 $ i $ 的真实评分,则 SVD++ 的目标是最小化以下损失函数: $$ \min \sum_{(u,i)\in R}(r_{ui}-\mu-b_u-b_i-(q_i+\lvert I^u\rvert^{-0.5}\sum_{j\in I^u}y_j)^Tp_u)^2 + \lambda(\|p_u\|^2+\|q_i\|^2+\|b_u\|^2+\|b_i\|^2+\sum_{j\in I^u}\|y_j\|^2) $$ 其中: - $ p_u $ 和 $ q_i $ 分别表示用户 $ u $ 和物品 $ i $ 的潜在向量; - $ b_u $ 和 $ b_i $ 分别代表用户和物品的偏置项; - $ y_j $ 表示隐式反馈对应的潜在向量; - $ I^u $ 表示用户 $ u $ 曾经互动过的物品集合; - $ \mu $ 是全局平均评分; - $ \lambda $ 为正则化参数。 此公式的含义在于综合考虑了显式评分与隐式反馈的信息,并通过正则化防止过拟合的发生。 #### 实现过程 以下是基于 Python 的简单实现代码片段,用于说明如何构建并训练 SVD++ 模型: ```python import numpy as np class SVDpp: def __init__(self, num_users, num_items, latent_dim=10, reg_param=0.01): self.num_users = num_users self.num_items = num_items self.latent_dim = latent_dim # 初始化参数 self.user_biases = np.zeros(num_users) # 用户偏差 self.item_biases = np.zeros(num_items) # 物品偏差 self.global_mean = 0 # 全局均值 self.P = np.random.normal(scale=1./latent_dim, size=(num_users, latent_dim)) # 用户潜向量 self.Q = np.random.normal(scale=1./latent_dim, size=(num_items, latent_dim)) # 商品潜向量 self.Y = np.random.normal(scale=1./latent_dim, size=(num_items, latent_dim)) # 隐式反馈潜向量 self.reg_param = reg_param # 正则化系数 def predict(self, user_id, item_id, implicit_feedback=None): if implicit_feedback is None or len(implicit_feedback)==0: return self.global_mean + self.user_biases[user_id] + self.item_biases[item_id] \ + np.dot(self.P[user_id], self.Q[item_id]) sqrt_len_implicit = np.sqrt(len(implicit_feedback)) sum_y = np.sum([self.Y[j] for j in implicit_feedback], axis=0) modified_q = self.Q[item_id] + (1/sqrt_len_implicit)*sum_y prediction = self.global_mean + self.user_biases[user_id] + self.item_biases[item_id] \ + np.dot(self.P[user_id], modified_q) return prediction def train_step(self, ratings, learning_rate=0.01): for uid, iid, rating, implicit_feedback in ratings: error = rating - self.predict(uid, iid, implicit_feedback) # 更新规则 self.user_biases[uid] += learning_rate * (error - self.reg_param*self.user_biases[uid]) self.item_biases[iid] += learning_rate * (error - self.reg_param*self.item_biases[iid]) P_update = learning_rate*(error*self.Q[iid]-self.reg_param*self.P[uid]) Q_update = learning_rate*(error*self.P[uid]-self.reg_param*self.Q[iid]) if implicit_feedback and len(implicit_feedback)>0: sqrt_len_implicit = np.sqrt(len(implicit_feedback)) Y_sum = np.sum([self.Y[j] for j in implicit_feedback], axis=0)/sqrt_len_implicit Q_update += learning_rate*error*Y_sum for j in implicit_feedback: self.Y[j] += learning_rate*(error/self.sqrt_len_implicit*self.P[uid]-self.reg_param*self.Y[j]) self.P[uid] += P_update self.Q[iid] += Q_update ``` #### 应用场景 SVD++ 可广泛应用于各种个性化推荐服务中,尤其是在处理大规模稀疏数据集时表现出色。例如: - **电子商务平台**:根据历史购买记录及浏览习惯给用户提供商品建议。 - **流媒体网站**:分析观看者喜好后推送相似类型的视频内容。 - **社交网络环境下的好友匹配功能**:依据共同兴趣爱好建立连接关系。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值