เพื่อจุดประสงค์บางอย่างฉันต้องสร้างตัวเลขสุ่ม (ข้อมูล) จากการกระจาย "ชุดลาด" "ความชัน" ของการกระจายนี้อาจแตกต่างกันไปในช่วงเวลาที่สมเหตุสมผลแล้วการกระจายของฉันควรเปลี่ยนจากเครื่องแบบเป็นสามเหลี่ยมตามความชัน นี่คือที่มาของฉัน:
มาทำให้มันง่ายและสร้างฟอร์มข้อมูล ถึง (สีน้ำเงิน, สีแดงคือการกระจายแบบสม่ำเสมอ) เพื่อให้ได้ฟังก์ชันความหนาแน่นของความน่าจะเป็นของเส้นสีฟ้าฉันต้องการเพียงสมการของเส้นนั้น ดังนั้น:
และตั้งแต่ (ภาพ):
เรามีสิ่งต่อไปนี้:
ตั้งแต่ คือ PDF, CDF เท่ากับ:
ทีนี้มาสร้าง data data กัน ความคิดคือถ้าฉันจะแก้ไขตัวเลขสุ่ม สามารถคำนวณได้ถ้าฉันจะรับตัวเลข จากการกระจายชุดตามที่อธิบายไว้ที่นี่ ดังนั้นถ้าฉันต้องการ 100 ตัวเลขสุ่มจากการกระจายของฉันกับการแก้ไขจากนั้นสำหรับใด ๆ จากการกระจายสม่ำเสมอ มี จาก "การกระจายแบบลาด" และ สามารถคำนวณได้เป็น:
จากทฤษฎีนี้ฉันทำรหัสใน Python ซึ่งมีลักษณะดังนี้:
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
นั้นใกล้เคียงกับศูนย์มากหรือเป็น B (ซึ่งฉันตั้งไว้ที่ 25) ไม่มีความแปรปรวนเมื่อฉันสร้างหมายเลข 100 พวกเขาทั้งหมดใกล้ถึง 25 หรือทั้งหมดอยู่ใกล้ศูนย์ ในการวิ่งครั้งเดียว:
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)