我想计算用户之间的“距离”,以便为任何给定用户返回前 n 个相似用户。每个用户都有一堆功能。
这接近于推荐系统,但是我没有评级,也无法将每个用户分配给不同的产品,因此我需要比较用户的“相似程度”。
您对此类问题的算法/方法有什么建议吗?我发现很多基于推荐系统的资源(有评分和项目),但这与我想要实现的不同
我想计算用户之间的“距离”,以便为任何给定用户返回前 n 个相似用户。每个用户都有一堆功能。
这接近于推荐系统,但是我没有评级,也无法将每个用户分配给不同的产品,因此我需要比较用户的“相似程度”。
您对此类问题的算法/方法有什么建议吗?我发现很多基于推荐系统的资源(有评分和项目),但这与我想要实现的不同
不需要算法或推荐系统。你有:
每个用户都有一堆功能。
只要它们是数字的,或者可以是数字的(例如聚合值或对它们进行一次热编码),您就已经有了距离。您可能没有跨特征空间的适当方差,即特征按不同数量级缩放。
如果您知道与用户相似度相关的特征的确切权重,您可以尝试手动调整(缩放)特征。否则,您可以简单地使每个特征都具有均值 0 和标准差 1。换句话说,每个特征从所有点中减去均值并除以当前标准差。(sklearn
有一个StandardScaler
正是这样做的。)
在缩放数据集中,从任何点(用户),您可以计算到任何其他点的欧几里得距离。并且点越接近,这对用户就越相似。即顶部 与用户相似的用户只是 最近的点。
普通欧几里得距离在许多情况下都有效。如果欧几里得距离不适用于手头的问题,那么您可以探索更复杂的可能性:从曼哈顿距离开始,通过minkowski 距离(欧几里得距离和曼哈顿距离的组合)。
正如其他人还指出的那样,只要您有数字数据(或可以转换为数字的数据),您就可以在用户之间使用某种距离度量。
简单的解决方案是欧几里得距离(或其他一些,如 minkowski 或 manhattan)。他们的问题是他们对变量中的不同尺度很敏感。您可以通过规范化数据来解决它,但请记住,在这种情况下,您将为每个特征分配同等重要性。您可能需要根据您的领域知识手动调整它。
如果您在稀疏空间中有大量特征,则值得考虑使用余弦相似度,它会更加关注数据点的方向(客户特征)。
您可能还想先进行PCA,从而降低维度并消除某些特征可能彼此相似(因此它们相互关联)的事实。
如果您想尝试更复杂的解决方案,您可以尝试使用自动编码器。一种神经网络,您的输入和输出是相同的(用户特征),但在隐藏层中您会抑制维度,从而获得更密集的数据表示。在这种表示中,特征也可能具有语义意义。在这种更密集的表示上,您可以再次计算开始时提出的一些距离度量。
人们考虑的主要事情是距离的某种度量。将每个变量视为一个轴,可以将用户表示为多维空间中的数据点。欧几里得距离是最常见的,但可以使用Manhattan、Minkowsky、Mahalanobis,......有无数的公式。
常见的替代方法是(不)相似度度量,例如余弦相似度和KL 散度。它们都返回两个数组“有多么不同”的度量。
在这里,您可以找到最常见的相似性度量的 Python 实现。
亚历克斯,尝试聚类怎么样。它可能会为您提供有关数据集的更多信息。
因此,您可以首先sklearn.cluster.Kmeans
将一些用户随机作为集群的中心,然后寻找其他类似的用户,检查他们的特征之间的距离是否接近中心用户。
如果您确定集群的大小可能不同(在某些集群中,特征非常接近,而在某些集群中,特征可能更加分散),您可以尝试sklearn.cluster.DBSCAN
在可以应用不同的地方sklearn.metrics.pairwise_distances