是否有一个发行版,或者我可以与其他发行版一起创建一个下图所示的发行版(对不好的图纸表示歉意)?
在这里我给出一个数字(在示例中为0.2、0.5和0.9),以表示峰值应位于的位置以及使函数变宽或变窄的标准偏差(sigma)。
PS:当给定数字为0.5时,分布为正态分布。
[0,1]
范围限制为,则不能将pdf范围也限制[0,1]
为(在琐碎的统一情况下除外)。
是否有一个发行版,或者我可以与其他发行版一起创建一个下图所示的发行版(对不好的图纸表示歉意)?
在这里我给出一个数字(在示例中为0.2、0.5和0.9),以表示峰值应位于的位置以及使函数变宽或变窄的标准偏差(sigma)。
PS:当给定数字为0.5时,分布为正态分布。
[0,1]
范围限制为,则不能将pdf范围也限制[0,1]
为(在琐碎的统一情况下除外)。
Answers:
一种可能的选择是β分布,但重新参数化的平均而言和精度φ,即,“固定μ的值越大φ,较小的方差ý ”(见法拉利,和Cribari-内托(2004)。的概率密度函数是通过用替换的β分布的标准参数构造α = φ μ和β = φ (1 - μ )
其中和V 一- [R (Ý )= μ (1 - μ )。
或者,您可以计算适当的和β参数,这些参数将导致β分布具有预定义的均值和方差。但是,请注意,对于可能适用于beta分布的方差可能存在一些限制。对我个人而言,使用精度进行参数化更加直观(考虑x比例在二项式分布 X,随着样品尺寸 φ和成功的概率 μ)。
Kumaraswamy分布是另一种有界连续分布,但像上面那样很难重新参数化。
正如其他人已经注意到,这是不正常的,因为正态分布的的支持,所以最好你可以使用截断正常的近似值。
Ferrari,S.和Cribari-Neto,F.(2004)。Beta回归模型化率和比例。Journal of Applied Statistics,31(7),799-815。
如果有人对我在Python中使用的用于生成接近给定数字的随机值作为参数的解决方案感兴趣。我的解决方案分为四个阶段。每个阶段生成的数字接近给定数字的机会更大。
我知道解决方案并不像使用一个发行版那样精美,但这是我能够解决问题的方式:
number_factory.py:
import random
import numpy as np
class NumberFactory:
def __init__(self):
self.functions = [self.__linear, self.__exponential_point_four, self.__exponential_point_three, self.__exponential_point_twenty_five]
self.stage = 0
def next_stage(self):
self.stage += 1
def get_mutated_number(self, number):
# True if the generated number will be higher than the given number
# False if the generated number will be lower than the given number
add = bool(np.random.choice([0,1], p=[number, 1-number]))
# Generate a number between 0 and 1 that will be used
# to multiply the new number by which the number parameter will be substracted or added
# The bigger the stage number (0-3) the more change that the mutated number is close to the number parameter
multiply_number_seed = random.uniform(0, 1)
multiply_number = self.functions[self.stage](multiply_number_seed)
if (add):
return number+((1-number)*multiply_number)
else:
return number-(number*multiply_number)
def __linear(self, x):
return -x+1
def __exponential_point_four(self, x):
return 0.4*x**2 - 1.4*x + 1
def __exponential_point_three(self, x):
return 0.8*x**2 - 1.8*x + 1
def __exponential_point_twenty_five(self, x):
return x**2 - 2*x + 1
def get_stage(self):
return self.stage
main.py:
import matplotlib.pyplot as plt
import numpy as np
factory = NumberFactory()
numbers = []
factory.next_stage()
factory.next_stage()
factory.next_stage()
for _ in range(100000):
numbers.append(factory.get_mutated_number(0.3))
bins = 100
plt.hist(numbers, bins, normed=True)
plt.plot(1, np.ones_like(bins))
plt.show()