سؤال

في محاولة استخدام scipy رباعية طريقة لدمج جاوس (دعنا نقول أن هناك طريقة جاوس اسمه غاوس), كنت أعاني من مشاكل عابرة حاجة المعلمات إلى غاوس وترك رباعية للقيام التكامل على الصحيح متغير.هل من أحد لديه مثال جيد على كيفية استخدام رباعية w/ متعدد الأبعاد ؟

ولكن هذا أدى بي إلى أكثر الكبير على سؤال حول أفضل طريقة لدمج جاوس بشكل عام.لم أجد جاوس الاندماج في scipy (المفاجأة).كانت خطتي أن كتابة بسيطة جاوس وظيفة ونقله إلى رباعية (أو ربما الآن عرض ثابت متكامل).ماذا كنت ستفعل ؟

تحرير:عرض ثابت يعني شيء مثل trapz يستخدم ثابت dx لحساب المناطق الواقعة تحت منحنى.

ما جئت حتى الآن هو طريقة جعل___غاوس أن يعود امدا وظيفة التي يمكن أن ثم انتقل إلى رباعية.بهذه الطريقة يمكنني جعل وظيفة طبيعية مع متوسط و الفرق أحتاج قبل دمج.

def make_gauss(N, sigma, mu):
    return (lambda x: N/(sigma * (2*numpy.pi)**.5) *
            numpy.e ** (-(x-mu)**2/(2 * sigma**2)))

quad(make_gauss(N=10, sigma=2, mu=0), -inf, inf)

عندما حاولت تمرير العامة جاوس وظيفة (الذي يحتاج إلى أن يدعى مع x, N, مو, و سيجما) و تعبئة بعض القيم باستخدام رباعية مثل

quad(gen_gauss, -inf, inf, (10,2,0))

المعلمات من 10 ، 2 ، 0 لا تتطابق بالضرورة مع N=10, sigma=2, mu=0, الأمر الذي دفع أكثر من تعريف موسع.

في منتدى البحوث الاقتصادية(z) في scipy.خاصة يتطلب مني أن تحدد بالضبط ما ر في البداية, ولكن من الجميل أن تعرف أنها هناك.

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

المحلول

حسنا, أنت تبدو جميلة الخلط حول العديد من الأشياء.دعونا نبدأ من البداية:ذكرت "الأبعاد وظيفة" ، ولكن ثم انتقل إلى مناقشة المعتادة واحد متغير جاوس منحنى.هذا هو لا متعدد الأبعاد وظيفة:عند دمج, يمكنك فقط إدراج متغير واحد (x).الفرق هو مهم لجعل لأن هناك هو وحش يسمى "متعدد المتغيرات توزيع جاوس" وهو صحيح الأبعاد وظيفة ، إذا متكاملة يتطلب دمج أكثر من اثنين أو أكثر من المتغيرات (الذي يستخدم مكلفة مونت كارلو تقنية ذكرت من قبل).لكن يبدو فقط أن أتحدث عن واحد متغير الضبابي ، وهو أسهل بكثير من العمل مع ودمج كل ذلك.

واحد متغير توزيع جاوس اثنين من المعلمات ، sigma و mu, و هي وظيفة من متغير واحد سوف دلالة x.يمكنك أيضا يبدو أن تحمل نحو تطبيع المعلمة n (التي هي مفيدة في بعض التطبيقات).التطبيع المعلمات عادة لا المدرجة في الحسابات لأنه يمكنك فقط تك لهم في النهاية (تذكر ، التكامل الخطي المشغل: int(n*f(x), x) = n*int(f(x), x) ).ولكن يمكننا تحملها إذا كنت مثل ؛ تدوين أنا مثل التوزيع الطبيعي ثم

N(x | mu, sigma, n) := (n/(sigma*sqrt(2*pi))) * exp((-(x-mu)^2)/(2*sigma^2))

(قراءة أن "التوزيع الطبيعي من x نظرا sigma, mu, ، n تعطى من قبل...") حتى الآن جيدة ، هذا يطابق وظيفة كنت قد حصلت.لاحظ أن فقط صحيح متغير هنا x:الثلاثة الأخرى المعلمات ثابت لأي جاوس.

الآن حقيقة الرياضية:فمن بصورة مبرهنة صحيح أن جميع جاوس منحنيات لها نفس الشكل ، انهم مجرد تحول في جميع أنحاء قليلا.حتى نتمكن من العمل مع N(x|0,1,1), يسمى "التوزيع الطبيعي المعياري" و لدينا ترجمة النتائج إلى العامة جاوس منحنى.حتى إذا كان لديك لا يتجزأ من N(x|0,1,1), يمكنك مسلي حساب جزءا لا يتجزأ من أي جاوس.هذا لا يتجزأ يظهر ذلك في كثير من الأحيان أن له اسم خاص:على خطأ وظيفة erf.لأن بعض الاتفاقيات القديمة ، ليس بالضبط erf;هناك بضعة المضافة المضاعف العوامل أيضا يجري حولها.

إذا Phi(z) = integral(N(x|0,1,1), -inf, z);وهذا هو ، Phi(z) هو جزء لا يتجزأ من التوزيع الطبيعي المعياري من ناقص ما لا نهاية حتى z, ثم إنه صحيح في تعريف الخطأ وظيفة

Phi(z) = 0.5 + 0.5 * erf(z / sqrt(2)).

وبالمثل ، إذا Phi(z | mu, sigma, n) = integral( N(x|sigma, mu, n), -inf, z);وهذا هو ، Phi(z | mu, sigma, n) هو جزء لا يتجزأ من التوزيع الطبيعي إعطاء المعلمات mu, sigma, ، n من ناقص ما لا نهاية حتى z, ثم إنه صحيح في تعريف الخطأ وظيفة

Phi(z | mu, sigma, n) = (n/2) * (1 + erf((x - mu) / (sigma * sqrt(2)))).

نلقي نظرة على مقالة ويكيبيديا عن العادي CDF إذا كنت تريد المزيد من التفاصيل أو دليل على هذا الواقع.

حسنا, يجب أن يكون ما يكفي من الخلفية التفسير.إلى (تحرير) وظيفة.تقول "منتدى البحوث الاقتصادية(z) في scipy.خاصة يتطلب مني أن تحدد بالضبط ما ر في البداية".ليس لدي أي فكرة عما يعني هذا ؛ أين t (الوقت؟) الدخول في كل هذا ؟ نأمل التوضيح أعلاه قد بسط الخطأ وظيفة قليلا و هو أوضح الآن لماذا الخطأ وظيفة هو وظيفة للحصول على الوظيفة.

الخاص بك كود بايثون على ما يرام, ولكن أود أن تفضل إغلاق أكثر من لامدا:

def make_gauss(N, sigma, mu):
    k = N / (sigma * math.sqrt(2*math.pi))
    s = -1.0 / (2 * sigma * sigma)
    def f(x):
        return k * math.exp(s * (x - mu)*(x - mu))
    return f

باستخدام الإغلاق تمكن precomputation من الثوابت k و s, حتى عاد وظيفة سوف تحتاج إلى القيام بعمل أقل في كل مرة انها تسمى (والتي يمكن أن تكون مهمة إذا كنت إدماج ذلك ، وهو ما يعني أنه سوف يكون دعا مرات عديدة).كما يجب تجنب استخدام أي من الأسي المشغل **, الذي هو أبطأ من مجرد كتابة التوفيق و رفع تقسيم الخروج من الحلقة الداخلية والاستعاضة عن ذلك مع مضاعفة.أنا لم ينظر في تنفيذها في بيثون ، ولكن من آخر الوقت ضبط داخلي حلقة نقية السرعة باستخدام الخام x87 الجمعية أتذكر أن يضيف ينقص أو يضاعف يستغرق حوالي 4 دورات وحدة المعالجة المركزية لكل منهما ، يقسم حوالي 36 ، الأسي 200.كان ذلك منذ بضع سنوات ، حتى تأخذ هذه الأرقام مع حبة الملح.لا يزال ، ويوضح النسبية التعقيد.وكذلك حساب exp(x) القوة الغاشمة طريقة هي فكرة سيئة جدا;هناك الحيل يمكنك أن تأخذ عند كتابة حسن تنفيذ exp(x) التي تجعل بشكل أسرع وأكثر دقة من العام a**b نمط الأسي.

أنا لم تستخدم numpy نسخة من الثوابت بي و ه ؛ لقد تمسك دائما مع القديم عادي الرياضيات وحدة الإصدارات.أنا لا أعرف لماذا قد تفضل أحد.

لست متأكدا ما كنت تريد الذهاب مع quad() المكالمة. quad(gen_gauss, -inf, inf, (10,2,0)) يجب أن تدمج renormalized الضبابي من ناقص ما لا نهاية بالإضافة إلى اللانهاية ، ينبغي دائما بصق 10 (الخاص التطبيع عامل) ، منذ جاوس يدمج 1 على الخط الحقيقي.أي إجابة حتى الآن من 10 (لا أتوقع بالضبط 10 منذ quad() هو فقط تقريبي ، بعد كل شيء) يعني شيء عبث في مكان ما...من الصعب القول ما أفسدت من دون معرفة العائد الفعلي قيمة وربما الداخلي quad().

نأمل أن هذا قد بسط بعض الارتباك ، وأوضح سبب الخطأ وظيفة هو الجواب الصحيح للمشكلة ، وكذلك كيف أن تفعل كل شيء بنفسك إذا كنت غريبة.إذا كان أي من شرحي لم تكن واضحة ، أقترح أخذ نظرة سريعة على ويكيبيديا أولا ؛ إذا كنت لا تزال لديك أسئلة, لا تتردد في طلب.

نصائح أخرى

scipy السفن مع الخطأ "وظيفة" ، الملقب جاوس لا يتجزأ:

import scipy.special
help(scipy.special.erf)

أفترض أنك التعامل مع المتغيرات Gaussians;إذا كان الأمر كذلك ، SciPy بالفعل لديه وظيفة كنت تبحث عن:هذا يسمى MVNDIST ("التوزيع الطبيعي متعدد المتغيرات).على SciPy الوثائق من أي وقت مضى, الرهيب, لذلك أنا لا يمكن أن تجد حتى حيث وظيفة دفن ، ولكن انه في مكان ما هناك.الوثائق بسهولة أسوأ جزء من SciPy, وقد أحبطت لي إلى ما لا نهاية في الماضي.

واحد متغير Gaussians فقط استخدام الخوالي خطأ وظيفة ، منها العديد من التطبيقات المتاحة.

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

توزيع جاوس هو أيضا يسمى التوزيع الطبيعي.قوات الدفاع المدني تعمل في scipy القاعدة وحدة يفعل ما تريد.

from scipy.stats import norm
print norm.cdf(0.0)
>>>0.5

http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html#scipy.stats.norm

لماذا لا تفعل دائما التكامل من -ما لا نهاية +ما لا نهاية ، حتى يتسنى لك أن تعرف دائما الجواب ؟ (أمزح!)

أعتقد أن السبب الوحيد الذي ليس هناك بالفعل المعلبة جاوس وظيفة في SciPy أنها تافهة وظيفة الكتابة.اقتراحك حول الكتابة الخاصة بك وظيفة وتمريرها إلى رباعية لدمج الأصوات ممتازة.ويستخدم قبول SciPy أداة تقوم بذلك هذا الحد الأدنى رمز جهد لك جدا للقراءة من أجل الآخرين حتى لو أنهم لم يروا SciPy.

ماذا تقصد بالضبط من خلال عرض ثابت متكامل?تعني باستخدام خوارزمية مختلفة من كل ما QUADPACK تستخدمه ؟

تحرير:عن اكتمال هنا شيء مثل ما أود أن محاولة التمويه مع متوسط 0 و الانحراف المعياري 1 من 0 الى +ما لا نهاية:

from scipy.integrate import quad
from math import pi, exp
mean = 0
sd   = 1
quad(lambda x: 1 / ( sd * ( 2 * pi ) ** 0.5 ) * exp( x ** 2 / (-2 * sd ** 2) ), 0, inf )

هذا قبيحة قليلا لأن وظيفة جاوس هو طويل قليلا, ولكن لا يزال تافهة جدا في الكتابة.

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