趋近智
为了找到口味相似的用户或经常被一起喜爱的物品,我们必须先将交互数据整理成一种支持数学比较的结构。在协同过滤中,标准的方法是构建一个用户-物品交互矩阵。
该矩阵完整地反映了数据集中所有的用户-物品交互情况。按照惯例,每一行代表一个唯一的用户,每一列代表一个唯一的物品。用户行与物品列相交单元格中的数值(记作 )表示用户 与物品 之间的交互。
的值可以是:
null,表示没有发生交互。最显著的特点是,对于任何给定的用户,他们通常只与所有可选物品中的极小部分产生过交互。这意味着矩阵中的大部分单元格都是空的。这种特性被称为稀疏性,它是推荐系统数据集的一个典型特征。
该图显示了一个稀疏矩阵,其中彩色单元格代表已记录的评分,带有问号的灰色单元格代表未知的交互。协同过滤的目标就是预测这些未知单元格的值。
在实际操作中,你的数据通常以“长表”格式存在,每一行代表一次交互(例如:user_id, item_id, rating)。我们可以使用 pandas 库将这些数据转换为所需的用户-物品矩阵。
假设我们有一个结构如下的 DataFrame ratings_df:
import pandas as pd
import numpy as np
data = {
'user_id': ['用户 A', '用户 A', '用户 B', '用户 B', '用户 C', '用户 C'],
'item_id': ['物品 1', '物品 3', '物品 2', '物品 5', '物品 1', '物品 4'],
'rating': [5, 2, 3, 4, 4, 1]
}
ratings_df = pd.DataFrame(data)
print(ratings_df)
输出:
user_id item_id rating
0 用户 A 物品 1 5
1 用户 A 物品 3 2
2 用户 B 物品 2 3
3 用户 B 物品 5 4
4 用户 C 物品 1 4
5 用户 C 物品 4 1
我们可以对该 DataFrame 进行透视操作来创建用户-物品矩阵,其中索引为 user_id,列为 item_id,数值为 rating。缺失的交互将自动填充为 NaN 等空值。
user_item_matrix = ratings_df.pivot_table(
index='user_id',
columns='item_id',
values='rating'
)
print(user_item_matrix)
输出:
item_id 物品 1 物品 2 物品 3 物品 4 物品 5
user_id
用户 A 5.0 NaN 2.0 NaN NaN
用户 B NaN 3.0 NaN NaN 4.0
用户 C 4.0 NaN NaN 1.0 NaN
得到的 DataFrame 就是我们的用户-物品交互矩阵。NaN 值直观地表现了我们提到的稀疏性。由于对于真实数据集,这些矩阵可能会变得非常庞大,专业的库通常会使用 SciPy 中的稀疏矩阵等高效数据结构来存储它们,以避免消耗过多的内存。在目前的学习和实现中,pandas DataFrame 已经非常合适了。
一旦有了这个矩阵,我们就可以将每一行看作一个用户向量,将每一列看作一个物品向量。
用户 A 的向量是 [5.0, NaN, 2.0, NaN, NaN]。物品 1 的向量是 [5.0, NaN, 4.0]。这种向量表示法非常有用,因为它允许我们使用数学方法来衡量距离或相似度。例如,我们可以计算 用户 A 和 用户 C 向量之间的相似度,以判断他们是否有相似的口味。这是我们在接下来的“寻找邻居”章节中要学习的核心操作。通过将抽象的用户行为转化为具体的矩阵,我们已经为协同过滤算法打下了基础。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•