矩阵补充(matrix completion)

矩阵补充是一种向量召回通道,通过用户ID和物品ID的embedding向量内积预估用户兴趣。然而,矩阵补充在实践中往往逊色于双塔模型,因为它忽略了丰富的用户和物品属性。模型训练基于用户-物品兴趣分数的平方误差,目标是最小化预测误差。矩阵补全的意义在于完成矩阵以实现推荐,但其局限性在于简单使用两个embedding层且训练效果不佳。矩阵分解是矩阵补全的一种手段,可用于估计和填充缺失值。

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

这篇文章介绍矩阵补充(matrix completion),它是一种向量召回通道。矩阵补充的本质是对用户 ID 和物品 ID 做 embedding,并用两个 embedding 向量的內积预估用户对物品的兴趣。值得注意的是,矩阵补充存在诸多缺点,在实践中效果远不及双塔模型。

上篇文章介绍了embedding,它可以把用户ID和物品ID 映射成向量,这张图就是基于embedding做推荐的。模型的输入是用户ID和物品ID,模型的输出是一个实数,是用户对于物品兴趣的预估值,这个数越大表示用户对物品越感兴趣。这张图的左边有一个embedding层,把一个用户ID映射到一个向量,记作a,这个向量是对用户的表征。上篇文章讲了,embedding层的参数是一个矩阵,矩阵中列的数量是用户数量,每一列都是图中a这么大的向量。embedding层的参数数量=用户数量*向量a的大小。右边结构也是一个embedding层,把一个物品ID映射到一个向量,记作b,这个向量是对物品的表征。因为embedding层的参数是一个矩阵,矩阵中列的数量是物品数量,每一列都是图中b这么大的向量。embedding层的参数数量=物品数量*向量b的大小。对向量a和向量b求内积得到一个实数作为模型的输出,这个模型就是矩阵补充模型。

问题来了,这么训练这个模型呢?

 

数据集:使用一个(用户ID,物品ID,兴趣分数) 三元组集合

 详细解释一下这个公式,这里的是训练集中的一条数据,意思是用户u对物品i的真实兴趣分数y,是向量a和b的内积,它是模型对兴趣分数的预估,反映的是第u号用户有多喜欢第i号物品,是真实兴趣分数y与预估值之间的差,我们希望这个差越小越好,干脆取差的平方,差的平方越小,证明预估值越接近真实值y。对每一条记录的差的平方求和,作为优化的目标函数,对目标函数求最小化。

刚才拿绿色位置的数据作为数据集训练出了模型,这个模型又返回来预测出所有灰色位置的分数,即把矩阵中空的位置补全。这就是模型叫矩阵补充的原因。

那么补全到底有什么意义呢?把矩阵补全后就可以做推荐。选出一行中分数最高的几个物品推荐给这一行的这个用户。是不是看起来很高级?其实这个方法是有很大缺点的,它仅仅用了2个embedding层,把用户ID和物品ID 映射成2个向量,仅此而已。以小红书为例,小红书会记录物品属性(类目,关键词,地理位置,作者信息)和用户属性 (性别,年龄,地理位置,感兴趣的类目),这个方法根本没用到这些信息,如果我们能把这些信息应用到召回中,召回会做的更加精准。其次,这个方法做训练的效果很不好,因为用内积不如用余弦相似度,用平方损失(做回归)不如用交叉熵损失(做分类)。

总结一下矩阵补充:

 最后来思考一个比较深入的问题:矩阵分解和矩阵补充有什么区别呢?

矩阵填充是一个task,矩阵分解是一类operation。(填充是目的,分解是手段!)

已知一个部分可观察的矩阵M,用M其他行的已知值(每一行包含一个用户对所有商品的已知评分),来估计并填充某一行的缺失值。若要对所有用户进行预测,便是填充整个矩阵,这是所谓“协同过滤本质是矩阵填充”。

矩阵补全(Matrix Completion)目的是为了估计矩阵中缺失的部分(不可观察的部分),可以看做是用矩阵X近似矩阵M,然后用X中的元素作为矩阵M中不可观察部分的元素的估计。

矩阵分解(Matrix Factorization)是指用 A*B 来近似矩阵M,那么 A*B 的元素就可以用于估计M中对应不可见位置的元素值,而A*B可以看做是M的分解,所以称作Matrix Factorization。

上面有一个词叫『近似』,这个近似的方式是有多种的,有各种不同的loss和不同的表达『近似』的建模方法。

总的来说,通过以上描述可知,矩阵分解可以用于矩阵补全任务。此外,做矩阵分解也可以用于分解一个完全观察的矩阵,比如通过分解来对一个完全观察的矩阵做有损压缩和低维表示等等。而且,矩阵补全也并不总是采用分解的方法



 

 

 

 

 

### 关于矩阵补全算法及其在机器学习中的实现 矩阵补全是机器学习领域的一个重要研究方向,其目标是从部分观测数据中恢复完整的低秩矩阵。这一技术广泛应用于推荐系统、图像处理等领域。以下是几种常见的精确矩阵补全方法: #### 1. 基于核范数最小化的凸优化方法 一种经典的矩阵补全方法是基于核范数(nuclear norm)的凸优化问题。该方法假设待补全的矩阵具有较低的秩特性,并通过求解如下形式的目标函数来完成补全任务: \[ \min_{X} \| X \|_* \quad \text{subject to } P_\Omega(X) = P_\Omega(M), \] 其中 \(M\) 是已知的部分观察值矩阵,\(P_\Omega(\cdot)\) 表示投影到已知位置的操作符。\(^*]\|_表示矩阵的核范数[^3]。 这种方法的优点在于理论上有较好的收敛性和稳定性保障;然而,在实际应用中可能面临计算效率低下等问题。 #### 2. 非负矩阵分解 (Non-negative Matrix Factorization, NMF) 对于某些特定场景下的矩阵补全问题,可以采用NMF作为解决方案之一。它试图将原始矩阵近似分解成两个较小规模的非负因子矩阵之积的形式: \[ M \approx WH, \] 这里W和H均为非负矩阵。相比传统的SVD方法,NMF能够提供更直观可解释的结果尤其当输入数据本身是非负的时候效果更好[^4]。 #### 3. 深度学习驱动的方法 近年来随着深度神经网络的发展,也有不少工作尝试利用DL模型来进行更加灵活高效的矩阵填充操作。例如Autoencoder架构可以通过自动编码器捕捉潜在空间特征从而达到更好的预测精度;另外还有些研究探索了图卷积网络(Graph Convolutional Networks, GCNs),它们能有效建模节点间复杂关系进而改善最终性能表现[^5]。 ```python import numpy as np from sklearn.decomposition import NMF def nmf_matrix_completion(observed_matrix, rank=5): model = NMF(n_components=rank, init='random', random_state=0) W = model.fit_transform(observed_matrix) H = model.components_ completed_matrix = np.dot(W,H) return completed_matrix ``` 上述代码片段展示了如何使用Python库`sklearn`中的NMF类实现简单的矩阵补全功能[^6]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值