问题:
有X个属性,所有浮点数介于0和1之间
选择一个属性具有恒定的C成本(而不是将其保留为0)
财产的成本与其价值成正比(无论是指数还是线性)
在给定预算B的情况下,我如何对属性子集进行无偏(随机?)选择?
让我们说“成本”函数类似于以下内容:(指数版本)
cost = C*sgn(x) + ke^(ax)
0 <= x <= 1
Constants: C, k, a
我的第一个想法是某种优化问题,但实际上并没有最大化/最小化。我猜你可以把它视为尽可能接近B的解决方案。但这并不是真的有意义,因为我不是在寻找“最佳”解决方案,任何足够接近B的解决方案都可以。
然后我开始研究随机抽样,这似乎是最相似的问题。我发现了一种叫做随机加权抽样的东西看起来很有希望,但我不确定“预算”是如何适应的。
我不是在寻找非常精确的东西,也不保证独立的结果。也许我过于复杂了?在这个阶段,我只是在寻找可以用Java或类似语言实现的快速和脏的东西。
修改:我按照下面的建议,在here的math.stackexchange.com上发布了问题。我想我在那里做得更清楚了我想要实现的目标
答案 0 :(得分:0)
您可以使用最大熵原则来指导您。 http://en.wikipedia.org/wiki/Principle_of_maximum_entropy。基本上X有很多分配,这些分配的一些(非常小的)子集将完全满足您的预算。你想从那组令人满意的任务中随机统一选择。
不幸的是,虽然这给了我一个清晰而有原则的方向来思考这个问题,但我实际上并不知道如何从该集合中有效地采样。
答案 1 :(得分:0)
MarianP的评论似乎有正确的方向。例如,如果您有3个权重为1,3和6的属性,那么您可以在心理上将长度为1 + 3 + 6 = 10的行划分为三个段:
+-+---+------+
|0|123|456789|
+-+---+------+
然后掷骰子范围(0,9)并选择被骰子击中的片段(属性)。从集合中删除该属性,并使用新的属性集从顶部递归(超出预算的那些也被过滤掉)。
这样就可以选择更长的序列(更重的属性)。
答案 2 :(得分:0)
在这里,我尝试从一个低效的过程开始,该过程满足一个随机性视图,并用更有效的视图替换它。
1)效率低下 - 我假设您有一个属性列表及其相关成本。考虑所有可能的属性集 - 如果有N个属性,则会有2 ^ N个这样的集合。从中考虑适合您预算的一组属性。从这个较小(但可能仍然很大)的集合中随机选择一组属性。
2)可能的实施。我认为成本都是中等大小的整数,或者你可以接受将它们四舍五入所涉及的不准确性。您现在可以构建一个数组A,其中A [i]是创建一组总成本i的方式数。考虑0个属性,A [0] = 1.现在考虑成本3的属性。此时A的唯一非零元素是A [0]。这为您提供了另一种生成A [0 + 3 = 3]的方法,因此您可以设置A [3] = 1 + A [0]。通过依次考虑每个属性,您可以设置A [i] =使用这些属性创建一组成本i的方式的数量。
一旦构建了数组,依次考虑每个属性,从成本B开始。通过从成本&gt; = B中抽样,选择一个确切的成本C,其概率与创建一组的方式的数量成正比那个成本。现在依次考虑每个属性。给定成本c的属性,如果它超过cntnt成本C丢弃它。如果不是,考虑A [C]和A [C - c]并在其间选择与其大小成比例的概率。如果您选择A [C],则丢弃该财产。如果选择A [C - c],则在随机集中包含该属性。
使用http://en.wikipedia.org/wiki/Metropolis%E2%80%93Hastings_algorithm可能有一种方法可以做一些相同的事情,而不用四舍五入到整数 - 也许我会坐下来担心这个问题。
是的 - 这很容易从Metropolis-Hastings中消失。基本上,你从任何有效的集合开始 - 例如空集,运行大量的Metropolis-Hastings步骤,并希望结果混合得足够好,根据你的分布,结果集几乎是随机的。如果您想要另一个随机样本,请再次运行M-H步骤。
在维基百科条目的语言中,P(x')= P(x_t)= 1.要计算Q(x_t; x'),您需要决定如何从set移动到set。如果您按照成本的排序顺序排列属性,那么考虑到集合的总成本,您可以为其添加多少剩余属性 - 例如做一个二进制印章来计算出足够便宜的属性数量,并使用某种平衡树来计算已经选择的这类属性的数量。因此,您可以计算出可以添加到当前集合的不同属性的数量,当然您也可以减去任何现有属性。如果一个步骤是添加或减去单个属性,您就知道有多少种方法可以离开x_t,并且您可以对x'进行类似的计算。所以Q(x'; x_t)是1 /(x_t之外的数量)和Q(x_t; x')是1 /(x'之外的数量),一旦你决定是否移动,如果您决定移动,则随机选择x_t中的一种方式。