ディストリビューションはありますか、または下の画像のようなディストリビューションを作成するために別のディストリビューションから作業できますか(悪い描画の謝罪)?
ここで、ピークが存在する場所の数値(例では0.2、0.5、0.9)と、関数をより広くまたはより小さくする標準偏差(シグマ)を指定します。
PS:与えられた数が0.5の場合、分布は正規分布です。
[0,1]
、あなたはPDFの範囲を制限することができない[0,1]
だけでなく、は、 (些細な均一の場合を除く)。
ディストリビューションはありますか、または下の画像のようなディストリビューションを作成するために別のディストリビューションから作業できますか(悪い描画の謝罪)?
ここで、ピークが存在する場所の数値(例では0.2、0.5、0.9)と、関数をより広くまたはより小さくする標準偏差(シグマ)を指定します。
PS:与えられた数が0.5の場合、分布は正規分布です。
[0,1]
、あなたはPDFの範囲を制限することができない[0,1]
だけでなく、は、 (些細な均一の場合を除く)。
回答:
一つの可能な選択であるベータ分布が、再パラメータ化平均の点で精密φであり、「固定のためのμの値が大きいφ、小さいの分散yは」(フェラーリを参照し、Cribari- Neto、2004)。確率密度関数を用いてベータ分布の標準パラメータを置換することによって構築されるα = φ μ及びβ = φ (1 - μ )
ここで、とV R(Y )= μ (1 - μ )。
または、事前に定義された平均と分散を使用してベータ分布につながる適切なαおよびβパラメータを計算できます。ただし、ベータ分布に有効な分散の可能な値には制限があることに注意してください。個人的には、精度を使用したパラメーター化はより直感的です(xにおける割合二項分布する Xサンプルサイズと、 φと成功の確率 μ)。
クマラスワミー分布は別の有界連続分布ですが、上記のように再パラメータ化することはより困難です。
他の人が気づいてきたように、それはありません正規分布を有しているため、通常ののサポートをあなたが使用できるので、最高の状態で、切り捨て通常の近似として。
フェラーリ、S。、およびCribari-Neto、F。(2004)。モデリング率と比率のベータ回帰。Journal of Applied Statistics、31(7)、799-815。
ベータ版の分布を試してください。範囲は0〜1です。これを試しましたか?平均値は
誰かが私がPythonでパラメータとして与えられた数に近いランダムな値を生成するために使用したソリューションに興味があるなら。私のソリューションには4つの段階があります。各段階では、生成された数値が指定された数値に近くなる可能性が大きくなります。
解決策は1つのディストリビューションを使用するほど美しくないことは知っていますが、これが私の問題を解決することができた方法でした:
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()