गणितीय सिद्धांत से "ढलान वर्दी वितरण" से यादृच्छिक संख्या उत्पन्न करें


9

किसी उद्देश्य के लिए, मुझे "स्लोप्ड वर्दी" वितरण से यादृच्छिक संख्या (डेटा) उत्पन्न करने की आवश्यकता है। इस वितरण का "ढलान" कुछ उचित अंतराल में भिन्न हो सकता है, और फिर मेरा वितरण ढलान के आधार पर वर्दी से त्रिकोणीय में बदल जाना चाहिए। यहाँ मेरी व्युत्पत्ति है:

यहाँ छवि विवरण दर्ज करें

आइए इसे सरल बनाएं और डेटा फॉर्म से (नीला, लाल समान वितरण) उत्पन्न करें । ब्लू लाइन की प्रायिकता घनत्व फ़ंक्शन को प्राप्त करने के लिए मुझे उस लाइन के समीकरण की आवश्यकता है। इस प्रकार:0B

f(x)=tg(φ)x+Y(0)

और तब से (चित्र):

tg(φ)=1/BY(0)B/2Y(0)=1Btg(φ)B2

हमारे पास है:

f(x)=tg(φ)x+(1Btg(φ)B2)

चूंकि PDF है, CDF बराबर है:f(x)

F(x)=tg(φ)x22+x(1Btg(φ)B2)

अब एक डेटा जनरेटर बनाते हैं। विचार यह है, कि अगर मैं ठीक कर दूंगा , तो यादृच्छिक संख्या गणना की जा सकती है यदि मुझे यहां वर्णित एक समान वितरण से संख्या मिलेगी । इस प्रकार, यदि मैं तय के साथ अपने वितरण से 100 यादृच्छिक संख्या की जरूरत है , तो किसी के लिए समान वितरण से है "sloped वितरण" से है, और के रूप में गणना की जा सकती:φ,Bx(0,1)φ,Bti(0,1)xix

tg(φ)xi22+xi(1Btg(φ)B2)ti=0

इस सिद्धांत से मैंने पायथन में कोड बनाया जो दिखता है:

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]

तो मेरे कोड में कुछ बहुत गलत होना चाहिए। क्या कोई मेरी व्युत्पत्ति या कोड के साथ मेरी मदद कर सकता है? मैं अब इस बारे में पागल हूँ, मैं कोई गलती नहीं देख सकता। मुझे लगता है कि आर कोड मुझे इसी तरह के परिणाम देगा।


2
यदि आपको केवल रैंडम नंबर जनरेट करने की आवश्यकता है, तो आपको डिस्ट्रीब्यूशन बिलकुल नहीं करना होगा। बस अपने चित्र पर डार्ट्स फेंकें और उनके x- निर्देशांक को बनाए रखें, लेकिन जब बाएं त्रिकोण में एक डार्ट भूमि " " के रूप में लेबल की जाती है , तो से इसके x- समन्वय को बदल दें । उदाहरण के लिए, के लिए किसी भी मान देना और (एक वास्तविक पैरामीटर, जो जब दिए गए के बीच मूल्यों और , अपने वितरण का उत्पादन) और सेट यादृच्छिक मान आप की जरूरत की संख्या होने के लिए। यहाँ है : कोडϕxBxBtheta11nRx<-runif(n,-1,1);x<-(ifelse(runif(n,-1,1)>theta*x,-x,x)+1)*(B/2)
whuber

जवाबों:


9

आपकी व्युत्पत्ति ठीक है। ध्यान दें कि पर एक सकारात्मक घनत्व प्राप्त करने के लिए , आपको आपके कोड इसलिए आपको बीच , यह वह जगह है जहां आपका कोड विफल रहता है।(0,B)

B2tanϕ<2.
B=25ϕ±tan12625

आप (और चाहिए) एक द्विघात सॉल्वर का उपयोग करने से बचें, और फिर 0 और बीच की जड़ों का चयन करें । को हल करने के लिए द्विघात बहुपद समीकरण साथ निर्माण द्वारा और ; पर भी बढ़ता है ।Bx

F(x)=t
F(x)=12tanϕx2+(1BB2tanϕ)x.
F(0)=0F(B)=1F(0,B)

इससे यह देखना आसान है कि अगर , parabola का हिस्सा जिसमें हम रुचि रखते हैं, parabola के दाईं ओर का एक हिस्सा है, और रखने के लिए जड़ दो जड़ों में से सबसे अधिक है, है इसके विपरीत, अगर , तो परबोला उल्टा है, और हम इसके बाईं ओर रुचि रखते हैं अंश। रखने के लिए जड़ सबसे कम है। ध्यान में रखते हुए के संकेत को ऐसा लगता है कि यह एक ही जड़ है (यानी पहले मामले में )।tanϕ>0

x=1tanϕ(B2tanϕ1B+(B2tanϕ1B)2+2tanϕt.)
tanϕ<0tanϕ+Δ

यहाँ कुछ आर कोड है।

phi <- pi/8; B <- 2
f <- function(t) (-(1/B - 0.5*B*tan(phi)) + 
       sqrt( (1/B - 0.5*B*tan(phi))**2 + 2 * tan(phi) * t))/tan(phi)
hist(f(runif(1e6)))

हिस्टोग्राम 1

और :ϕ<0

phi <- -pi/8
hist(f(runif(1e6)))

यहाँ छवि विवरण दर्ज करें


1
मैंने एक गलती की, क्योंकि मैंने अपने कोण को सीमा से बाहर कर दिया, मुझे मिल गया। लेकिन आपका स्पष्टीकरण क्यों मुझे संख्यात्मक सॉल्वर का उपयोग करना चाहिए , अभी भी मेरे लिए धूमिल है। क्या आप इसे और समझाने की कोशिश कर सकते हैं, कृपया आईडी प्यार इसे पाने के लिए। F(x)
राबर्ट

@Robert मैं अपने कोड काम करता है अच्छी तरह से करता है, तो के मूल्य के बारे में सोच सही है। हालांकि, यह आपको संभावित समस्याओं को पकड़ने से रोकता है (यदि कोई समाधान 0 और बीच नहीं है ? या यदि दोनों समाधान हैं? या यदि कोई वास्तविक समाधान नहीं है?)। तैयार किए गए सॉल्वर का उपयोग करने से बचने के लिए अतिरिक्त काम इसके लायक है। ϕB
एल्विस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.