如何根据用户的属性将用户与具有相似兴趣的其他用户匹配?

数据挖掘 机器学习 Python 深度学习 推荐系统
2022-03-11 00:20:24

可用信息

考虑一下,有“n”个用户,他们有这些属性和值

User A:
Row   | Attribute a | Attribute b | Attribute c
Item 1|    0.593    |    0.7852   |   0.484
Item 2|    0.18     |    0.96     |   0.05
Item 3|    0.423    |    0.886    |   0.156

User B:
Row   | Attribute a | Attribute b | Attribute c
Item 7|    0.228    |    0.148    |   0.658
Item 8|    0.785    |    0.33     |   0.887
Item 9|    0.569    |    0.994    |   0.374

该数据集中的项目可以使用属性 a、b 和 c 来描述。因此,对于不同的用户,这些项目可能相同也可能不同,但属性解释了用户的品味。

目前,我有这种格式的大约 1000 个用户的数据,我可以为一个用户创建一个分类器,说明用户是否会喜欢给定的项目。

目标

我想做的是使用上面提供的信息来匹配具有相似品味的用户。我对推荐系统了解不多,如果有人能帮助我,我将不胜感激。

2个回答

我可能误读了您的数据,但我假设 Item # 会重复,并且它们不是用户独有的。虽然,在您的示例中没有重叠。

如果我是对的并且项目是有限的,那么我将添加一列项目 x 属性(那是很多列),它将创建一个非常稀疏的矩阵,如下所示:

+--------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+---+--------------------+--------------------+--------------------+
|        | Item 1 Attribute a | Item 1 Attribute b | Item 1 Attribute c | Item 2 Attribute a | Item 2 Attribute b | Item 2 Attribute c | … | Item 9 Attribute a | Item 9 Attribute b | Item 9 Attribute c |
+--------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+---+--------------------+--------------------+--------------------+
| User A |              0.593 |             0.7852 |              0.484 |               0.18 |               0.96 |               0.05 | … |                    |                    |                    |
| User B |                    |                    |                    |                    |                    |                    | … |              0.569 |              0.994 |              0.374 |
+--------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+---+--------------------+--------------------+--------------------+

然后,给定一个新用户及其属性,您可以使用余弦相似度来查找该数据中与该新行最近的行。我认为这是您问题的关键,如果您正在做用户与用户的相似性,您希望每一行都成为用户。

你当然可以考虑用关于他们的元数据来描述用户,如果你有产品属性,你可以研究更复杂的东西,比如矩阵分解。我不是专家,但我只是想为您指出正确的方向。

当您将每一行设为用户时,您采取的很多方向将取决于此结果矩阵中出现的稀疏程度(多少空白)。另外,列太多?接下来你可以尝试降维。如果您有一个稀疏矩阵,则某些技术比其他技术效果更好。

用户太多?您可以进行集群并将每个用户分配给集群。然后,在下一步中对集群而不是单个用户执行练习。

有很多方法可以做到这一点,抱歉没有太多具体的说法。但是我认为关键是设置数据,以便每一行都是一个用户。

一种可能的方法是创建 N 个分类器(每个用户一个),然后选择 M 个随机项目,并将它们运行到 N 个分类器中。结果将是这样的:

        User 1 | User 2 | ... | User N
Item 1:    1   |    0   | ... |   1    --> User 1 and N both like item 1
Item 2:    1   |    1   | ... |   1    --> All users like item 2
...      ...   |   ...  | ... |  ...
Item M:    0   |    0   | ... |   0    --> No user likes item M

其中第 i 行包含在所有 N 个分类器中运行第 i 项的结果,第 j 列包含在第 j 个分类器中运行所有 M 项的结果。

然后,您可以将每个用户视为一个 M 维点,并使用简单的分类器(例如带有汉明距离的 KNN)作为距离度量。

使用较大的 M,您将获得更准确的结果,因为您使用更多变量来比较每个用户。这里唯一需要注意的是,您需要这 N 个分类器非常准确,以最大程度地减少错误传播。