【问题标题】:Sorting by best combinations of two按两个的最佳组合排序
【发布时间】:2013-11-18 14:08:17
【问题描述】:

我有一个“产品”列表,其中每个人都有两个功能,例如:书籍的价格和评级,或门票的时间和价格等
书籍 (10, 15),其中 10 是美元价格(越便宜越好),15 是从 0 到 100 的评分(越多越好)。

L = [(150, 100), (50, 15), (20, 70), (10, 40), (76, 30)]

列表应按价格和评级的最佳组合进行排序。
到目前为止,我有 2 个解决方案,最好的一个是通过乘以 price*(1/rating) 并按此“权重”排序来找到每一对的“权重”,越少越好。

res1 = {}
for i in L:
    res1[i] = i[0]*(1./i[1])
# {(10, 40): 0.25, (20, 70): 0.2857, (50, 15): 3.3333, (76, 30): 2.5333, (150, 100): 1.5}
sorted(res1, key=lambda x: res1[x])
# [(10, 40), (20, 70), (150, 100), (76, 30), (50, 15)]

第二种解决方案更复杂,代表性更小。它需要排序两次 - 按价格和评级(评级 - 反转)并尝试找到匹配项。 “权重”将是第一个排序列表中的索引乘以(或求和)第二个排序列表中的索引。

L1 = sorted(L, key=lambda x: x[0])
L2 = sorted(L, key=lambda x: x[1], reverse=True)
res = {}
for i in L:
    res[i] = (L1.index(i)+1) * (L2.index(i)+1)
res
# {(10, 40): 3, (20, 70): 4, (50, 15): 15, (76, 30): 16, (150, 100): 5}
sorted(res, key=lambda x: res[x])
# [(10, 40), (20, 70), (150, 100), (50, 15), (76, 30)]

当使用包含大量数据的第二个变体时,它显示的结果代表性较差。
但是我厌倦了发明轮子,那么您可以建议哪些数学和算法解决方案?有趣的是,如果这个问题有 3 个或更多特征时有解决方案:价格、供应时间、重量、评级等。

更新:感谢@georgesl 指出这一点。我该如何处理异常值,例如一本非常非常糟糕的书,但它非常便宜?我认为应该以某种方式区别对待它们。

【问题讨论】:

  • 我觉得第一个已经不错了。为什么你需要一个新算法?
  • 第一种方法就够了。但是,您需要处理异常值:例如完全是垃圾但真的很便宜的书(因此单位成本比率很高)和书籍非常好,以至于编辑可以负担得起高价。
  • 不一样的price*(1/rating) = price/rating?
  • @georgesl,这是一个非常重要的问题! :) 我需要帮助。

标签: python algorithm sorting


【解决方案1】:

为什么你不这样组合你的答案

L = [(150, 100), (50, 15), (20, 70), (10, 40), (76, 30)]
sorted(L, key=lambda x: x[0] / (x[1] * 1.0))
# [(10, 40), (20, 70), (150, 100), (76, 30), (50, 15)]

附:如果您想获得浮动答案,最好将其乘以 1.0 数字。它比在float 中划分或运行您的号码更快

【讨论】:

    【解决方案2】:

    您的目标是根据价格和评级的“最佳组合”订购您的产品。您已经考虑了两种算法,并且您报告说第一种似乎效果更好。您没有告诉我们(而且您可能没有)是一种衡量最佳订单的方法。所以没有人能提出更好的方法,因为我们不知道你会喜欢什么。质量(评级)对您有多重要?你可能比我更关心它,也可能更少关心它。简而言之:您需要一个独立的订单质量指标(例如,基于实际购买产品的人数),或者一个您手动订购并以您希望的方式查看的训练集。

    假设你有一个训练集,你可以尝试不同的排名并衡量它们与你喜欢的排序有多接近(至少在训练数据上;但你会希望算法推广到其他数据)。一种衡量方法是使用rank correlation 统计数据。

    有一整套解决方案是您的功能的线性组合:a * price + b * rating,其中a 可能是负数,因为低价是好的。 b 越大,质量等级越重要。您可以设置ab 为您提供最佳排名。或者您可以“拟合”更复杂的模型,例如涉及平方或比率。您所需要的只是一种衡量结果排序好坏的方法。

    【讨论】:

    • 你关于“什么是最好的”的问题是完全合适的,我也想过这个,但我没有答案。 :) 只有通过常识和实际用法我才能决定。使用系数是一个非常好的主意,我想只是使用 N*price/rating 这样的指标,但你的 sum 解决方案更好。
    • 谢谢,但是“只有常识和实际使用”不太正确:您可以按照我的建议为自己设置一个评估集。如果您对它感兴趣,那很好;但如果您不必手动评估每个结果,您可以尝试更多选项。
    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 2017-01-26
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多