选择最佳附近场地以在地图上显示的逻辑

时间:2015-01-04 17:57:55

标签: ruby-on-rails solr geolocation logic

我有一个应用程序,显示有关某些场地的信息。每个场地的评分均为0-100。该应用程序包含一张地图,并在地图上我想显示附近最好的场地。 (重点是向用户推荐他们可能喜欢的其他场所。)

解决此问题的最佳方法是什么?

  • 如果我取最近的 x 场地,那么很多不好的场地(即那些有场地的场地) 低评级)显示。
  • 如果我获得评分最高的场地,其中很多都是 将太远而无法作为建议。

对于任何地理位置应用来说,这似乎是一个非常普遍的挑战,所以我很想知道其他人采取了什么方法。

  • 考虑到其评分及其以英里为单位的距离,我考虑过“评分”每个可能的场地。
  • 我还考虑过在 y 里程半径内获得评分最高的场地,但这会产生问题,因为在一些城市,小区域内有很多场地(例如纽约)和在其他地方,推荐更远的场地是合理的。

(这是一个Rails应用程序,我正在使用Solr和Sunspot gem来检索数据。但我不一定在这里寻找代码中的答案,更多的是关于逻辑的建议。)

3 个答案:

答案 0 :(得分:2)

就个人而言,我会实现一些公式并使用某种形式的A/B testing来了解哪些公式可以在某些结果指标上产生最佳结果。具体指标取决于您。它可能是点击,也可能是更复杂的事情。

从您可以想到的最简单的公式(理想情况下,计算上也便宜的公式)开始建立基线。从那里,你可以迭代,但绝对的关键概念是,你有硬数据告诉你,如果你变得更好或更坏,而不仅仅是预感(也许更复杂的公式更好) 。即使你掌握了Yelp的配方,它也可能不适合你。

例如,正如您所提到的,基于反距离和建立质量的某种线性组合计算的单个分数将是一个很好的起点,您可以在几分钟内将其推出。确保以某种方式规范化每个组件分数。这是一个可以开始的非常简单的算法:

  1. 在快速查询属性(按类型,国家/地区等)上尽可能过滤场地
  2. 在相当宽的范围内过滤剩余的场地(您需要对其进行一些研究,确切地知道如何以高效的方式执行此操作; Stackoverflow上有很多帖子,其他地方就是这样。你'我想要在纬度和经度上索引你的数据库表,并遵循一些其他最佳实践)。
  3. 使用一些看似直观的权重对剩下的场地进行评分(我任意选择0.25和0.75,但它们应该加起来为1:
  4.   

    得分= 0.25 *(1 - ((剩余距离最远的场地的距离/距离)   设置) - 距离最近的场地))+ 0.75 *(质量得分/最高质量   剩下的分数)

    1. 按分数对其进行排序,并选择顶部 n
    2. 我会使用这个简单的想法的一些花哨裤版本把钱投入Yelp。他们可能正在使用机器学习来实际选择每个组件分数的权重,但概念基础是相似的。

      虽然计算不同复杂度的公式有很多可能性,但真正了解哪一种最佳方法的唯一方法是收集数据。

答案 1 :(得分:0)

我会确定7点返回的场地数量。

丢弃所有评分最低四分位数得分的场地,以避免糟糕的客户体验,然后在邮政编码中返回前7位。如果这导致少于7个条目,则查看相邻的邮政编码以找到最佳分数以完成列表。

这将导致在本地获得一系列平庸得分,也许只有很短的距离才有一些非常好的分数。

从用户体验的角度来看,这很容易让用户选择他们感兴趣的邮政编码/区域,或允许用户确定其位置。

从数据的角度来看,您已经拥有了地址。唯一的"棘手" bit正在确定相邻的邮政编码/区域是什么,但我确定有人已经知道了这一点。

顺便说一句,我很擅长改变事物。就像餐馆易手或业主醒来并变得更好。我会考虑提供一个危险的"不合标准的餐馆名单"风险自负"作为晚间娱乐的另一种形式。就个人而言,我发现我最糟糕的一些用餐体验形成了我最好的一些餐饮故事:-)如果这个地方过去经过严厉评判,你有时会发现它现在正在制作中。

答案 2 :(得分:0)

首先我建议您使用贝叶斯平均值来维持所有场地的整体评分,更多信息请参见:https://github.com/tyrauber/acts_rateable

然后您可以检索按距离排序的最近的场地,然后按评级排序。查询中的两个按语句排序