按两个最佳组合排序

时间:2013-11-18 14:08:17

标签: python algorithm sorting

我有“产品”列表,其中每个人都有两个功能,例如:书籍的价格和评级,或门票的时间和价格等。 书籍(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指出这一点。我怎么能处理异常值,例如一本非常糟糕的书,但它很便宜?我认为应该以不同的方式对待它们。

2 个答案:

答案 0 :(得分: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)]

P.S。如果你想得到浮动回答最好的方法乘以1.0数字。它比在float

中划分或运行您的号码更快

答案 1 :(得分:1)

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

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

有一整套解决方案是您的功能的线性组合:a * price + b * rating,其中a可能是负面的,因为低价格是好的。 b越大,质量等级越重要。您可以设置ab以获得最佳排名。或者你可以“适应”更复杂的模型,例如涉及正方形或比率。您所需要的只是一种衡量最终排序的良好程度的方法。

相关问题