假设我有四种货币,我想随意选择一种货币:
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%的分布?有谁知道我可以在哪里开始?
答案 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^r
,silver(r) = 2 * 0.7^r
,gold(r) = 1
,platinum(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时。
三角形由3个点定义:左,中(峰),右
center = rate * 3 / 5
这样做,比率为0时居中= 0,比率= 5时居中3
left = center - 2.5
和
right = 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。