根据某些外部值生成分布

时间:2017-09-05 21:41:10

标签: algorithm statistics probability distribution

假设我有四种货币,我想随意选择一种货币:

Bronze, Silver, Gold, Platinum

基于某些"评级"价值,我想为每种货币分配一个概率,以便选择它。让我们说这个评级值是0.0 - 5.0

如果我的等级更高,我现在想要将分布向铂金方面加权,如果我的评级较低,我会向青铜方面加权。

所以5.0的评级可能如下:

Bronze: 0.0, Silver: 0.10, Gold: 0.30, Platinum: 0.60

同样,0.0的评级可能如下:

Bronze: 0.60, Silver: 0.30, Gold: 0.10, Platinum: 0.0

评级为2.5可能看起来更均匀地分散在中间货币中。

我无法想到一个算法来处理这个问题。如何根据控制分布的某个值生成100%的分布?有谁知道我可以在哪里开始?

3 个答案:

答案 0 :(得分:1)

一个简单的答案是将4条直线放在您拥有的数据上并称之为一天。

更灵活的方法是以您喜欢的任何方式定义4个非负相对权重函数,例如bronze(r)silver(r)gold(r)platinum(r)。然后定义total(r) = bronze(r) + silver(r) + gold(r)+ platinum(r)。现在青铜的概率是bronze(r)/total(r)

这种方法的优势在于您可以使用以下功能:bronze(r) = 4 * 0.3^rsilver(r) = 2 * 0.7^rgold(r) = 1platinum(r) = 0.1 * 1.8^r。现在r=0青铜最有可能。在r=1最有可能是白银。 r=2金最有可能。而r=5最有可能是铂金。

你应该尝试各种各样的功能,并解决游戏中最具可玩性的结果。

答案 1 :(得分:0)

这是一些想法/草图,我可能应该受到统计学家的惩罚(至少对于执行而言)。我假设这不是一个大规模的拟合问题,可能需要其他方法。

一般的想法是:使用dirichlet-distribution生成最终分发。 dirichlet分布本身也有参数(参见wiki),我们在这里使用正态分布,因为它是对称的,只需要2个参数(我们可以修正方差,因此我们只需要在任务中定义的一个变量;方差仍然是一个设计参数来控制这个标量 - > dist函数的映射;实际上这也可以在一些1d优化问题中用作优化变量,这不是微不足道的,因为可能是非凸的,我们得到非快速-evaluated function)作为内部分布,用于定义我们的dirichlet分布。

这是一些示例代码(python),它可能是一个理论上的噩梦,在numpy / scipy用法方面也不是很好,但是嘿,这只是一个例子:

import numpy as np
from scipy.stats import norm

def get_sample(param):
    # location = mean shifted because of the task (symmetry not at zero!)
    outer_normal = np.array([norm.pdf(x, scale=1, loc=param-2.5) for x in np.linspace(-1, 1, 4)])
    # shifting (we need positive reals as dirichlet-input) maybe critical in terms of theory
    shifted_outer_normal = outer_normal + np.amin(outer_normal)
    return np.random.dirichlet(shifted_outer_normal)

# Try 3 values (borders + mean) and sample 1000 times each; calculate means
print(np.mean([get_sample(0) for i in range(1000)], axis=0))    # input: 0
print(np.mean([get_sample(2.5) for i in range(1000)], axis=0))  # input: 2.5
print(np.mean([get_sample(5) for i in range(1000)], axis=0))    # input: 5

输出:

[ 0.73142688  0.21514722  0.04402889  0.00939702]  # remark: only approximating sum=1 as independent means
[ 0.21711426  0.27841426  0.28205054  0.22242094]
[ 0.00943747  0.04039373  0.22860444  0.72156436]

答案 2 :(得分:0)

如果在x轴位置{0、1、2、3]}上设置了{青铜,银,金,白金}},我们可以想象权重采用三角形形式,可以作为光标在0和3之间移动当速率从0变为5时。

enter image description here enter image description here enter image description here

三角形由3个点定义:左,中(峰),右 center = rate * 3 / 5

这样做,比率为0时居中= 0,比率= 5时居中3 left = center - 2.5right = center + 2.5

仅通过编写即可在OpenTURNS中定义这种分布 dist = ot.Triangular(left, center, right) 然后,必须对其进行改造以满足您的需求。实际上,由于结果必须是{0,1,2,3}中的整数值,因此我们必须在-0.5左和3.5右之间截断此分布,然后将其舍入到最接近的整数,例如[-0.5,0.5 [=> 0,[0.5、1.5 [=> 1,[1.5、2.5 [=> 2,[2.5、3.5] => 3

以下是构建参数分布的代码:

import openturns as ot

def distribution (r):
    # Define ot.Triangular()
    center = r * 3 / 5 
    left = center - 3
    right = center + 3
    dist = ot.Triangular(left, center, right)
 
    # Truncate ot.Triangular()
    trunc = ot.TruncatedDistribution(dist, -0.5, 3.5)
    
    # Transforme the distribution to round its realizations 
    f = ot.PythonFunction(1, 1, lambda x: [round(x[0])])
    round_distribution = ot.CompositeDistribution(f, trunc)

    return round_distribution

尝试:

# draw a sample of size 5 when rate = 0
rate = 0
print(distribution (rate).getSample(5)
>>>    [ X0 ]
0 : [ 1  ]
1 : [ 0  ]
2 : [ 1  ]
3 : [ 0  ]
4 : [ 0  ]

更容易绘制青铜(0)和银(1)。

当rate = 5时的相同操作将给出:

 [ X0 ]
0 : [ 3  ]
1 : [ 2  ]
2 : [ 3  ]
3 : [ 3  ]
4 : [ 1  ]

在这种情况下,获得“铜牌”的可能性为0。