【问题标题】:Ranking array items by similarity按相似度排列数组项
【发布时间】:2015-06-21 06:42:59
【问题描述】:

假设我要按兼容性对用户进行排名,每个用户在不同的属性中都有一个分数(都是 1-5):

吸烟者:1
清洁度:3
夜猫子:2个

我希望每个用户数组都包含这些属性,我会将所有这些用户放在一个多维数组中。

是否有一种简单的方法可以让我根据用户与给定用户的兼容性对多维数组进行排序?

例如,我有User1: smoker = 1. Cleanliness = 3. Night owl = 2.,我想对所有其他用户进行排序以使其兼容。

我还有这 2 个其他用户:

User2: smoker = 5. Cleanliness = 1. Night owl = 4
User3: smoker = 1. Cleanliness = 3. Night owl = 2.

由于User3User1 相同(我希望对其进行评分),因此我的数组应按如下方式排序:User1User3User2。困难的部分似乎是按接近度排序它们,而不是按 asc 或 desc 顺序,比如用户有smoker = 3 我要么希望排序数组中的下一个用户有smoker = 2smoker = 4(假设没有其他用途有 3)。我需要一种方法来衡量每个用户的每个属性的整体接近度。

有没有简单的方法来做到这一点?一个通用的方法会很棒,一个PHP的例子会更好。

【问题讨论】:

  • 你能否展示一下你尝试过的艰难方法,让我试试简单的方法!
  • 您可以比较并查看用户 A 与用户 B 的接近程度,但您无法订购它们,因为您有多个功能,例如3 个特征 A(0,0,0), B(1,0,0), C(0,1,0), D(2,0,0),E(2,0,0)... 距离AB、AC、BD 和 CE 是 1,所以你可能想要 ABD 和 ACE,那么你需要一个图表!
  • 嗯,这仍然有明确的 ECABD 顺序(或相反),要使这一点越过你还需要 F(0,0,1) 和 G(0,0,2) 因为那你真的不知道如何对积分进行排序。 (在最后一条评论中,E 应该是 E(0,2,0))
  • 您可以尝试订购它们,但根据数据的不同,结果可能会很糟糕,那么您基本上要做的就是找到从任何用户开始的所有用户的最短路径而不访问一个用户两次......这非常复杂。 (用户只是多维空间中的一个点,但距离可能是一个特殊的加权函数)
  • 你能把你的数组结构和预期的输出一起发布

标签: php arrays sorting search multidimensional-array


【解决方案1】:

在此类问题中,您需要根据故事或逻辑对每个部分(如 smokerCleanlinessnight owlday's chicken...)进行加权!

例如,我知道在我的应用程序中 smokerCleanliness 更重要 10 倍,因此,如果我将 Cleanliness 排名为 5,我会将 smoker 排名为 50!

所以User1: smoker = 1. Cleanliness = 3. Night owl = 2 我会拥有

1*50 + 3*5 + 2*1 = 67

这样的排名合乎逻辑吗?这取决于!正如我之前提到的......

使用加权方案,您可以计算每一行的值并轻松对集合进行排序。

【讨论】:

  • 你可以这样做,但考虑一下:你有两个同等重要的特征 X 和 Y,用户 A 有 (0,10) 和 B 有 (10,0)...不能' t更加不同,仍然给出相同的分数。即使是路线的事情也会给出不好的结果,最短的路线安排 2 云和 2 点:[ ] : [ ] 中间的点非常接近,但在路线中彼此相距很远。
  • ...也许,再次需要更多的组和维度来正确演示
  • 这没什么大不了的@maraca,按照你的意愿对它们进行排序,你需要一个解决应用程序而不是理论大学问题的解决方案!我知道还有许多其他考虑因素,但这只是一个简单的解决方案;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 2016-08-01
相关资源
最近更新 更多