어떤 목적을 위해, "경사 균일 한"분포로부터 난수 (데이터)를 생성해야합니다. 이 분포의 "기울기"는 적절한 간격으로 다를 수 있으며,이 분포에 따라 경사도에 따라 분포가 균일에서 삼각형으로 변경되어야합니다. 여기 내 파생물이 있습니다.
간단하게 만들고 에서 까지의 데이터 형식을 생성합시다 (파란색, 빨간색은 균일 분포). 파란색 선의 확률 밀도 함수를 구하려면 해당 선의 방정식 만 있으면됩니다. 그러므로:
그리고 이후 (그림) :
우리는 그것을 가지고 있습니다 :
이후 PDF이며, CDF 같음 :
이제 데이터 생성기를 만들어 봅시다. 아이디어는 고치면 여기에 설명 된 균일 분포 에서 에서 숫자를 얻을 경우 임의의 숫자 를 계산할 수 있다는 것 입니다. 나는 고정 된 내 분포 (100 개) 난수가 필요한 경우 따라서, , 그 다음 어떤을 위해 균일 한 분포에서 가 "경사 유통"에서, 그리고 로 계산 될 수있다 :
이 이론을 통해 파이썬으로 코드를 만들었습니다.
import numpy as np
import math
import random
def tan_choice():
x = random.uniform(-math.pi/3, math.pi/3)
tan = math.tan(x)
return tan
def rand_shape_unif(N, B, tg_fi):
res = []
n = 0
while N > n:
c = random.uniform(0,1)
a = tg_fi/2
b = 1/B - (tg_fi*B)/2
quadratic = np.poly1d([a,b,-c])
rots = quadratic.roots
rot = rots[(rots.imag == 0) & (rots.real >= 0) & (rots.real <= B)].real
rot = float(rot)
res.append(rot)
n += 1
return res
def rand_numb(N_, B_):
tan_ = tan_choice()
res = rand_shape_unif(N_, B_, tan_)
return res
그러나 생성 된 숫자는 rand_numb
0 또는 B에 매우 가깝습니다 (25로 설정 한 경우). 100 개의 숫자를 생성 할 때 분산이 없습니다. 모두 25에 가깝거나 모두 0에 가깝습니다. 한번에 :
num = rand_numb(100, 25)
numb
Out[140]:
[0.1063241766836174,
0.011086243095907753,
0.05690217839063588,
0.08551031241199764,
0.03411227661295121,
0.10927087752739746,
0.1173334720516189,
0.14160616846114774,
0.020124543145515768,
0.10794924067959207]
따라서 내 코드에는 매우 잘못된 것이 있습니다. 누구든지 내 파생 또는 코드를 도와 줄 수 있습니까? 나는 지금 이것에 대해 미쳤다. 나는 어떤 실수도 볼 수 없다. R 코드가 비슷한 결과를 줄 것이라고 생각합니다.
B
theta
n
R
x<-runif(n,-1,1);x<-(ifelse(runif(n,-1,1)>theta*x,-x,x)+1)*(B/2)