احتمال دالة الكثافة من ورقة تنفيذها باستخدام C++, لا تعمل على النحو المنشود

StackOverflow https://stackoverflow.com/questions/4103477

سؤال

حتى انا تنفيذ خوارزمية الكشف عن مجريات الأمور ، لقد جئت عبر هذه الوظيفة.

لدي مجموعة من 1 إلى n (0 إلى n-1 على C w/e).أريد أن اختيار عدد من العناصر سوف نسخ إلى مجموعة أخرى.تعطى المعلمة y (0 < y <= 1) ، أريد أن يكون توزيع الأرقام التي متوسط (ذ * n).وهذا يعني أنه كلما استدعاء هذه الدالة ، انه يعطيني رقم بين 0 و ن ، و متوسط هذه الأرقام هو y*ن.

وفقا للمؤلف, "l" هو رقم عشوائي:0 < l < ن .على رمز اختبار لها حاليا توليد 0 <= l <= n.و كان الرمز الصحيح ، ولكن أنا أعبث مع هذا لساعات الآن و أنا كسول الرمز مرة أخرى.

لذا مشفرة الجزء الأول من الدالة y <= 0.5 أنا وضعت y 0.2 n إلى 100.وهذا يعني أنه اضطر إلى العودة رقم بين 0 و 99 ، مع متوسط 20.والنتائج ليست بين 0 و n, ولكن بعض العوامات.وأكبر n هو أصغر من هذا تعويم.

هذا هو C اختبار التعليمات البرمجية."x" هو "أنا" المعلمة.

//hate how code tag works, it's not even working now  
int n = 100;  
float y = 0.2;  
float n_copy;  

for(int i = 0 ; i < 20 ; i++)  
{  
    float x = (float) (rand()/(float)RAND_MAX);  // 0 <= x <= 1  
    x = x * n;                                // 0 <= x <= n  
    float p1 = (1 - y) / (n*y);  
    float p2 = (1 - ( x / n ));  
    float exp = (1 - (2*y)) / y;  
    p2 = pow(p2, exp);  
    n_copy = p1 * p2;  
    printf("%.5f\n", n_copy);  
}  

وهنا بعض النتائج (5 عشرية اقتطاع):

0.03354  
0.00484  
0.00003  
0.00029  
0.00020  
0.00028  
0.00263  
0.01619  
0.00032  
0.00000  
0.03598  
0.03975    
0.00704  
0.00176  
0.00001  
0.01333  
0.03396   
0.02795  
0.00005  
0.00860 

المادة:

http://www.scribd.com/doc/3097936/cAS-The-Cunning-Ant-System

صفحة 6 و 7.

أو البحث "cAS:النمل الماكرة النظام" على جوجل.

إذن ما الخطأ الذي فعلته ؟ أنا لا أعتقد أن الكاتب هو الخطأ, لأن هناك أكثر من 5 ورقات واصفا هذه الوظيفة نفسها.

كل ما عندي انترنيت لمن يساعدني.هذا هو المهم عملي.

شكرا :)

هل كانت مفيدة؟

المحلول

dmckee هو الصحيح في الواقع, ولكن أعتقد أن أريد أن أفصل أكثر في محاولة لتفسير بعض الارتباك هنا.أنا بالتأكيد يمكن أن تفشل. f_s(l), وظيفة الخاص بك جميلة الصيغة أعلاه, هو احتمال وظيفة التوزيع.فإنه يقول لك معين الإدخال l بين 0 و n ، احتمال أن l هو طول الجزء.مجموع (لا يتجزأ) لجميع القيم بين 0 و n يجب أن يساوي 1.

الرسم البياني في أعلى الصفحة 7 يخلط بين هذه النقطة.ومن المؤامرات l مقابل f_s(l), ولكن عليك أن احترس من الضالة العوامل فإنه يضع على الجانب.لاحظ أن القيم في الجزء السفلي من 0 إلى 1 ، ولكن هناك عامل x n على الجانب ، مما يعني أن l القيم في الواقع تذهب من 0 إلى ن.أيضا ، على المحور الصادي هناك x 1/n مما يعني أن هذه القيم في الواقع لا تصل إلى حوالي 3 ، يذهبون إلى 3/ن.

لذا ماذا تفعل الآن ؟ حسنا, أنت بحاجة إلى حل دالة التوزيع التراكمي من خلال دمج احتمال وظيفة التوزيع على l والتي في الواقع تبين أن ليس سيئا جدا (أنا فعلت هذا مع Wolfram Mathematica على الانترنت متكامل باستخدام x l و فقط باستخدام المعادلة y <= .5).ومع ذلك كان استخدام غير محددة لا يتجزأ كنت حقا التكامل على طول x من 0 إلى l.إذا وضعنا المعادلة الناتجة عن ذلك يعادل بعض المتغير (z على سبيل المثال) ، والهدف الآن هو حل ل l بوصفها وظيفة من الياء.z هنا هو رقم عشوائي بين 0 و 1.يمكنك محاولة استخدام رمزي حلالا هذا الجزء إذا كنت ترغب في (أنا).ثم لديك ليس فقط حققت هدفك من أن تكون قادرة على اختيار عشوائي ls من هذا التوزيع ، لديك أيضا تحقيق السكينة.

تعمل

سوف تساعد أكثر قليلا.حاولت فعل ما قلته عن y <= .5 ، ولكن رمزية نظام الجبر كنت تستخدم تكن قادرة على القيام عكس (بعض نظام آخر قد تكون قادرة على).ومع ذلك, ثم قررت أن محاولة استخدام معادلة .5 < y <= 1.تبين أن هذا أسهل بكثير.إذا قمت بتغيير l x في f_s(l) أحصل على

y / n / (1 - y) * (x / n)^((2 * y - 1) / (1 - y))

دمج هذا على x من 0 إلى l حصلت (باستخدام الرياضيات على الانترنت متكامل):

(l / n)^(y / (1 - y))

انها لا تحصل على أفضل من ذلك مع هذا النوع من الشيء.إذا أنا وضعت هذا يساوي z و حل l أحصل على:

l = n * z^(1 / y - 1)      for .5 < y <= 1

واحدة سريعة تحقق هو y = 1.في هذه الحالة نحصل على l = n بغض النظر عن الياء.حتى الآن جيد جدا.إن توليد z (رقم عشوائي بين 0 و 1) وتحصل على l التي يتم توزيعها على النحو المطلوب من أجل .5 < y <= 1.ولكن الانتظار, وعند النظر إلى الرسم البياني في الصفحة 7 لاحظت أن احتمال وظيفة التوزيع متماثل.وهذا يعني أنه يمكننا استخدام النتيجة أعلاه للعثور على قيمة 0 < y <= .5.نحن مجرد تغيير l -> n-l و y -> 1-y والحصول على

n - l = n * z^(1 / (1 - y) - 1)

l = n * (1 - z^(1 / (1 - y) - 1))      for 0 < y <= .5

على أي حال ، ينبغي أن حل المشكلة الخاصة بك إلا إذا كنت جعل خطأ ما في مكان ما.حظا سعيدا.

نصائح أخرى

قد يسيئون فهم ما هو متوقع منك.

تعطى (صحيح تطبيع) PDF و الرغبة في رمي عشوائي توزيع يتفق مع النموذج التراكمي التوزيع الاحتمالي (قوات الدفاع المدني) من خلال دمج PDF, ثم عكس قوات الدفاع المدني ، واستخدام موحد عشوائية المسند كما حجة مقلوب الدالة.


أكثر من ذلك بقليل من التفصيل.

f_s(l) هو PDF و تم تطبيع على [0,n).

الآن يمكنك دمج لتشكيل قوات الدفاع المدني ،

g_s(l') = \int_0^{l'} dl f_s(l)

علما أن هذا واضح لا يتجزأ غير محدد النهاية التي دعوت l'.قوات الدفاع المدني وبالتالي وظيفة l'.على افتراض لدينا التطبيع الحق ، g_s(N) = 1.0.إذا كان هذا هو لا نطبق بسيط معامل لإصلاحه.

بجانب قلب الدفاع المدني والدعوة النتيجة G^{-1}(x).لهذا ربما كنت سوف ترغب في اختيار قيمة معينة من أشعة جاما.

ثم رمي موحدة رقم عشوائي على [0,n), و استخدام هذه الحجة ، x, ، G^{-1}.النتيجة يجب أن تقع بين [0,1), و يجب أن توزع وفقا f_s.

مثل جوستين, يمكنك استخدام جهاز كمبيوتر الجبر نظام الرياضيات.

بالنظر إلى أن أي قيم l, y, n كما هو موضح ، حيث تتصل p1 و p2 على حد سواء في [0,1) و exp في [1,..) جعل الأسرى(p2, exp) أيضا في [0,1) وبالتالي أنا لا أرى كيف كنت من أي وقت مضى الحصول على الإخراج مع مجموعة [0,n)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top