【问题标题】:Which distance metric to use for binary values?哪个距离度量用于二​​进制值?
【发布时间】:2020-03-16 00:02:00
【问题描述】:

我有 100 个用户喜欢/不喜欢 500 件商品。 所以,我用二进制值对矩阵进行了转换,也就是说,如果用户 u1 喜欢某个项目 I1,则值为 1,如果他不喜欢该项目,则值为 0。

矩阵如下所示:

所以,现在我需要对喜欢相似项目的相似用户进行聚类。我使用 K-modes 聚类对它们进行聚类,但我的轮廓分数非常低。我不确定我应该使用哪个距离度量。 欧几里得距离不是解决这个问题的好方法。如果我的数据集很大,Jaccard 距离也不是很有效。我应该使用哪个其他距离度量来降低模型的成本。

【问题讨论】:

  • 严格回答问题,我建议cosinehammingdistance。但在此之前,我想问一下你是如何构建这个矩阵的?通常用实数代替二进制值,并通过计算“项目”和“用户”之间的相似度得分来获得这些数字。
  • 我猜stats.stackexchange.com/questions/58706/…是相关的,那里的答案可以在这里使用吗?
  • @SiddhantTandon 我同时使用了余弦和汉明。价值观还是很差。我不知道如何提高我的剪影分数。为了构建矩阵,我使用了 dataset.pivot_table() 函数。而且,我使用了 preprocessing.LabelEncoder() 并将其应用于 pivot_table。如果您有兴趣,下面是代码 sn-p。 pivot_table = dataset.pivot_table(values='Checked', index='USERID', columns = 'ITEMID').fillna(0); le = preprocessing.LabelEncoder(); pivot_table = pivot_table.apply(le.fit_transform)
  • @PH 因此,如果用户喜欢该项目,则您只有 yes 的信息,如果不喜欢该项目,则为 no。而且items没有其他信息吗?如果你有一些文本需要处理,通常你必须使用tf-idfstuff 来构造itemprofiles。
  • @SiddhantTandon。不,没有关于项目的信息。只有 itemID 和 itemName 存在。我不需要了解更多关于项目的信息,因为我正在对喜欢相似项目的用户进行聚类。所以,只有“喜欢/不喜欢”的信息就足以对它们进行聚类!此外,没有可使用的文本!很容易将 itemID 与其 itemDescription 集成。但是,我不需要知道这些。因此,我已将其从数据框中删除。

标签: python machine-learning math cluster-analysis k-means


【解决方案1】:

您可以考虑使用“汉明距离”来计算距离。请参阅here 的文档以了解在 scipy 库中实现的方法。

【讨论】:

  • 谢谢。但同样,不知何故这并没有提高剪影分数。如果我们使用正确的距离度量,模型将工作得最好,即形成正确的集群。
  • 另外,为 10000 个用户计算这个可能需要很长时间。
  • 汉明是他最便宜的指标。甚至比欧几里得距离更简单。在二进制数据上,只有 XORPOPCNT 指令在单个时钟周期内执行...
  • 但是如果你的数据被存储为只包含 0 和 1 的整数向量,欧几里得距离几乎是一样的,正好是 sqrt(Hamming)。
  • @HasQUIT--Anony-Mousse 但是欧几里得距离给我的分数较低并且没有任何改进。当您在答案中提到“将矩阵分解为 n x k 和 k x m 矩阵时,将用户映射到因素和因素到喜欢”。 ,我可以在用户矩阵上运行 K-modes,n x k 矩阵来找到相似的用户吗?
【解决方案2】:

处理此类数据的常用方法是使用非负矩阵分解 (NMF)。粗略地说,这意味着将矩阵分解为 n x k 和 k x m 矩阵,将用户映射到因素和因素到喜欢。

【讨论】:

  • 谢谢。我也读过它。但是,我不确定如何进一步解决我的问题。我需要对喜欢相似项目的相似用户进行聚类。因此,该数据以二进制矩阵表示。现在,我不确定如何将矩阵分解为 n x k 和 k x m 矩阵,因为这有助于推荐。但是,集群呢?
猜你喜欢
  • 1970-01-01
  • 2017-04-03
  • 2011-07-29
  • 1970-01-01
  • 2013-11-18
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
相关资源
最近更新 更多