【问题标题】:Finding Cheapest Highest Ranked Item寻找最便宜的最高排名项目
【发布时间】:2022-01-11 09:24:09
【问题描述】:

假设我有下表,它由 10,000 个项目组成,这是数据的样本。

Item Rank Item Cost
1 1000
2 800
3 900
4 500
5 400
6 200

当然,列表中的变化非常不同,有些项目排名较高但比其他项目便宜,有些项目更贵但排名比其他项目低。

我找不到术语或关键字或概念来找到价格最低的排名最高的项目,找到排名的最佳价格平衡,所以如果我正在选择一个列表,我'在获得最高排名的同时节省最多的钱。

我现在唯一能想到的是将每 10 个等级分组并按价格升序对它们进行排序,但必须有一种更“统计”的方式。

我正在尝试用python实现这个,谢谢!

我将不胜感激。

编辑:一个想法是找到价格集合中的索引

【问题讨论】:

  • 您一次只能优化一个度量,因此实际上没有任何有效的“排名最高的项目成本最低”的概念。您需要确定 (1,200) 比 (2,100) 好还是差,然后弄清楚您是如何做出这个决定的。
  • 在环顾四周时,我发现了这个 en.wikipedia.org/wiki/Knapsack_problem#0.2F1_knapsack_problem,我 100% 确定优化两个度量的概念不是迄今为止尚未解决的问题。

标签: python algorithm statistics correlation ranking


【解决方案1】:

我对你的问题的理解有点不同,所以我会提供一个替代答案。

由于您还没有计算出要计算的内容,因此这似乎不是关于 Python 的问题,而是关于基础数学/统计的问题。我认为解决这个问题的方法是找到一个等式,它可以根据排名和成本来衡量价值,然后使用基本的算术运算符在 Python 中实现它。

这个等式应该奖励低等级并惩罚高成本,所以它可能看起来像:

value = cost - A * ( 1 / rank )

其中 A 是根据您的用例和数据确定的某个整数。

我建议在用 Python 实现之前先在 Excel 中玩弄你的方程式。我试过这个,对于 A = 100,你会得到一些看起来很真实的值,但是价格为 1000 的排名 1 的项目仍然排在首位,这表明相对于成本的排名分配了过多的权重(换句话说,有对高成本没有足够的惩罚)。将 A 调整为 500 会使排名为 3 的项目排在首位,这是我在查看数据时会本能地选择的项目,因此这可能更接近您想要的值。

Item rank Item cost rank - 100/cost rank - 500/cost
1 1000 900.00 500.00
2 800 750.00 550.00
3 900 866.67 733.33
4 500 475.00 375.00
5 400 380.00 300.00
6 200 183.33 116.67

【讨论】:

  • 谢谢!是的,它更像是“这叫什么统计/数学概念”,我不知道我是否应该分配权重,或者是否有更精细的方法或 ML。感谢您的提示,我会调查一下!
  • 编辑:它应该惩罚低等级和高成本
【解决方案2】:

您的目标对我来说有点不清楚,但听起来您正在寻找排名最高的物品,而您可以以低于下一个排名较低的物品的价格获得?因此,在示例中,这将是项目排名 #2,因为它比项目排名 #3 的排名更高,成本更低。

假设这是预期目标,那么您正在寻找的是严格递减序列中的最后一个元素,从项目排名 1 的成本开始,按排名顺序进展到排名最低的项目。遇到的第一个项目的成本低于下一个项目表示严格递减序列的结束,并且将是目标值。由于搜索的序列总是从排名最高的项目开始,因此返回的值应该始终是比下一个较低排名便宜的最高排名。

items = [
('1','1000'),
('2','800'),
('3','900'),
('4','500'),
('5','400'),
('6','200')
]

def getCheapestHighestRank(items):
    for i in range(1, len(items)):
        if items[i][1] >= items[i-1][1]:
            return items[i-1]

print(getCheapestHighestRank(items))

--- 代码说明基于根据 cmets 牺牲的每个等级的最大化节省的估值---

有效地,这种方法会寻找每失去等级提供最高补偿的项目,而不是使用最高等级选项。如果您运行代码,输出将显示项目 #2 提供每失去等级 200 的节省,而项目等级 100 仅提供每失去等级 10 的节省。如果项目之间的排名是绝对度量,而不是百分比差异,则这种方法是有意义的。如果排名反映质量的百分比,那么排名#2 可能意味着该项目是排名#1 的一半,并且您只获得 200 的节省,而质量只有 1/2。如何评估排名项目的问题很有趣,但最终我认为可能需要更多关于“最佳价值”含义的上下文来给出更具体的答案。

items = [
(1,1000),
(2,800),
(3,900),
(4,500),
(5,400),
(6,200),
(100, 2)
]

maxRankItem = items[0]
for i in range(1, len(items)):
    print("")
    print((maxRankItem[1] - items[i][1]), "/", (items[i][0] - maxRankItem[0]))
    print("saving: ", (maxRankItem[1] - items[i][1]) / (items[i][0] - maxRankItem[0]), "for each rank lost")

【讨论】:

  • 基本上,假设有 100 件物品,每件物品都是由所有者主观定价的,但是,有一个客观的衡量标准来衡量每件物品的价值(排名)。现在,我正试图以我的钱获得最优惠的价格,假设在列表的前 100 名中,我想在某件商品上获得最优惠的“优惠”,其中价格与排名是“最优惠的价格” “,我正在尽我所能将它概念化。基本上它并不总是最好的最高等级,也许有一个较低等级的物品相对于它自己的“价值”(等级)定价更好,我想找到那个,这有意义吗?
  • 这是有道理的。一种可能性是评估每个等级损失的节省。我将在我的答案中添加一个示例以澄清,但@ljdyer 看起来他们也有一些很好的见解。
  • 感谢您的编辑,假设一个集合有 1500 个项目,我会说前 10% 是最有价值的,然后价值从那里呈指数下降。排名 2 的价值是排名 1 的 90%,排名 3 的价值是排名 2 的 90%,但在前 10% 之后,排名越低,下降越多。
猜你喜欢
  • 2019-07-28
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多