分布范围是0到1,并且它们之间有峰值?


13

是否有一个发行版,或者我可以与其他发行版一起创建一个下图所示的发行版(对不好的图纸表示歉意)?

分配 在这里我给出一个数字(在示例中为0.2、0.5和0.9),以表示峰值应位于的位置以及使函数变宽或变窄的标准偏差(sigma)。

PS:当给定数字为0.5时,分布为正态分布。



19
注意的是,0.5的情况下也不会因为正常分布的范围的正态分布是±

8
如果按字面意义拍照,则不会出现类似的分布,因为在所有情况下面积均严格小于1。如果要将支持[0,1]范围限制为,则不能将pdf范围也限制[0,1]为(在琐碎的统一情况下除外)。
约翰·科尔曼

Answers:


29

一种可能的选择是β分布,但重新参数化的平均而言和精度φ,即,“固定μ的值越大φ,较小的方差ý ”(见法拉利,和Cribari-内托(2004)。的概率密度函数是通过用替换的β分布的标准参数构造α = φ μβ = φ 1 - μ μϕμϕyα=ϕμβ=ϕ(1μ)

f(y)=1B(ϕμ,ϕ(1μ))yϕμ1(1y)ϕ(1μ)1

其中V - [R Ý = μ 1 - μ E(Y)=μVar(Y)=μ(1μ)1+ϕ

或者,您可以计算适当的β参数,这些参数将导致β分布具有预定义的均值和方差。但是,请注意,对于可能适用于beta分布的方差可能存在一些限制。对我个人而言,使用精度进行参数化更加直观(考虑xαβ比例在二项式分布 X,随着样品尺寸 φ和成功的概率 μ)。x/ϕ Xϕμ

Kumaraswamy分布是另一种有界连续分布,但像上面那样很难重新参数化。

正如其他人已经注意到,这是正常的,因为正态分布的的支持,所以最好你可以使用截断正常的近似值。(,)

Ferrari,S.和Cribari-Neto,F.(2004)。Beta回归模型化率和比例。Journal of Applied Statistics,31(7),799-815。


我喜欢您的回答,我从中构造了一些图形。我唯一的问题是我似乎无法控制宽度(曲线的正态分布中的sigma)。我想有一个公式,当给定特定的sigma值时,可以计算phi值。我的问题是曲线上下颠倒或呈怪异形状,这就是我要避免的行为。
Stan Callewaert

简而言之:我想给该函数赋予一个mu和一个sigma,然后在sigma大时得到一个分布,该分布在sigma大时变薄(但不会倒置或表现出怪异的行为) 。
Stan Callewaert

1
精度和标准偏差的关系:。此外,Beta分布是单峰的(不会显示怪异的行为),当αβ是大于1,这意味着当μ = 1 / 2,则应该选择φ > 2或等价σ < 0.707ϕ=μ(1μ)/σ21αβμ=1/2ϕ>2σ<0.707
knrumsey

2
要提到的另一件事是,如果单个beta发行版不够灵活,您当然可以使用beta发行版的混合。
比约恩

@knrumsey我对phi使用了相同的公式,我似乎唯一的问题是,当sigma为大数时,phi变为负数,这意味着alpha也变为负数。根据维基百科,Alpha不能为负。有解决方案吗?
Stan Callewaert

5

α(α+β)


1
看起来很有趣,但是如何将我的数字(峰值)和sigma转换为alpha和beta值?
Stan Callewaert

1
只需在Wikipedia上查找它即可。它是两参数分布。在这两者之间,它们可以调整到您的峰值(具有更大的自由度)。

5

y=exp(x)1+exp(x)yx

函数没什么特别的exp(x)1+exp(x)

y=F(x)F()yF()xxyxy

yxF()


0

如果有人对我在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()

执行此代码的结果如下图所示: 图形


0

您可能想看看“约翰逊曲线”。参见NL Johnson:通过平移方法生成的频率曲线系统。1949 Biometrika第36卷149-176页。R支持将它们拟合为任意曲线。特别是他的SB(有界)曲线可能会有用。

自从我使用它们已有40年了,但是那时它们对我非常有用,我认为它们会为您效劳。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.