गणित में एक कस्टम वितरण के लिए NExpectation को कम करना


238

यह जून में पिछले प्रश्न से संबंधित है:

गणित में एक कस्टम वितरण के लिए उम्मीद की गणना

मेरे पास एक कस्टम मिश्रित वितरण है @Sashaजो पिछले वर्ष में कई उत्तरों द्वारा चर्चा की गई लाइनों के साथ एक दूसरे कस्टम वितरण का उपयोग करके परिभाषित किया गया है।

वितरण को परिभाषित करने वाला कोड इस प्रकार है:

nDist /: CharacteristicFunction[nDist[a_, b_, m_, s_], 
   t_] := (a b E^(I m t - (s^2 t^2)/2))/((I a + t) (-I b + t));
nDist /: PDF[nDist[a_, b_, m_, s_], x_] := (1/(2*(a + b)))*a* 
   b*(E^(a*(m + (a*s^2)/2 - x))* Erfc[(m + a*s^2 - x)/(Sqrt[2]*s)] + 
     E^(b*(-m + (b*s^2)/2 + x))* 
      Erfc[(-m + b*s^2 + x)/(Sqrt[2]*s)]); 
nDist /: CDF[nDist[a_, b_, m_, s_], 
   x_] := ((1/(2*(a + b)))*((a + b)*E^(a*x)* 
        Erfc[(m - x)/(Sqrt[2]*s)] - 
       b*E^(a*m + (a^2*s^2)/2)*Erfc[(m + a*s^2 - x)/(Sqrt[2]*s)] + 
       a*E^((-b)*m + (b^2*s^2)/2 + a*x + b*x)*
        Erfc[(-m + b*s^2 + x)/(Sqrt[2]*s)]))/ E^(a*x);         

nDist /: Quantile[nDist[a_, b_, m_, s_], p_] :=  
 Module[{x}, 
   x /. FindRoot[CDF[nDist[a, b, m, s], x] == #, {x, m}] & /@ p] /; 
  VectorQ[p, 0 < # < 1 &]
nDist /: Quantile[nDist[a_, b_, m_, s_], p_] := 
 Module[{x}, x /. FindRoot[CDF[nDist[a, b, m, s], x] == p, {x, m}]] /;
   0 < p < 1
nDist /: Quantile[nDist[a_, b_, m_, s_], p_] := -Infinity /; p == 0
nDist /: Quantile[nDist[a_, b_, m_, s_], p_] := Infinity /; p == 1
nDist /: Mean[nDist[a_, b_, m_, s_]] := 1/a - 1/b + m;
nDist /: Variance[nDist[a_, b_, m_, s_]] := 1/a^2 + 1/b^2 + s^2;
nDist /: StandardDeviation[ nDist[a_, b_, m_, s_]] := 
  Sqrt[ 1/a^2 + 1/b^2 + s^2];
nDist /: DistributionDomain[nDist[a_, b_, m_, s_]] := 
 Interval[{0, Infinity}]
nDist /: DistributionParameterQ[nDist[a_, b_, m_, s_]] := ! 
  TrueQ[Not[Element[{a, b, s, m}, Reals] && a > 0 && b > 0 && s > 0]]
nDist /: DistributionParameterAssumptions[nDist[a_, b_, m_, s_]] := 
 Element[{a, b, s, m}, Reals] && a > 0 && b > 0 && s > 0
nDist /: Random`DistributionVector[nDist[a_, b_, m_, s_], n_, prec_] :=

    RandomVariate[ExponentialDistribution[a], n, 
    WorkingPrecision -> prec] - 
   RandomVariate[ExponentialDistribution[b], n, 
    WorkingPrecision -> prec] + 
   RandomVariate[NormalDistribution[m, s], n, 
    WorkingPrecision -> prec];

(* Fitting: This uses Mean, central moments 2 and 3 and 4th cumulant \
but it often does not provide a solution *)

nDistParam[data_] := Module[{mn, vv, m3, k4, al, be, m, si},
      mn = Mean[data];
      vv = CentralMoment[data, 2];
      m3 = CentralMoment[data, 3];
      k4 = Cumulant[data, 4];
      al = 
    ConditionalExpression[
     Root[864 - 864 m3 #1^3 - 216 k4 #1^4 + 648 m3^2 #1^6 + 
        36 k4^2 #1^8 - 216 m3^3 #1^9 + (-2 k4^3 + 27 m3^4) #1^12 &, 
      2], k4 > Root[-27 m3^4 + 4 #1^3 &, 1]];
      be = ConditionalExpression[

     Root[2 Root[
           864 - 864 m3 #1^3 - 216 k4 #1^4 + 648 m3^2 #1^6 + 
             36 k4^2 #1^8 - 
             216 m3^3 #1^9 + (-2 k4^3 + 27 m3^4) #1^12 &, 
           2]^3 + (-2 + 
           m3 Root[
              864 - 864 m3 #1^3 - 216 k4 #1^4 + 648 m3^2 #1^6 + 
                36 k4^2 #1^8 - 
                216 m3^3 #1^9 + (-2 k4^3 + 27 m3^4) #1^12 &, 
              2]^3) #1^3 &, 1], k4 > Root[-27 m3^4 + 4 #1^3 &, 1]];
      m = mn - 1/al + 1/be;
      si = 
    Sqrt[Abs[-al^-2 - be^-2 + vv ]];(*Ensure positive*)
      {al, 
    be, m, si}];

nDistLL = 
  Compile[{a, b, m, s, {x, _Real, 1}}, 
   Total[Log[
     1/(2 (a + 
           b)) a b (E^(a (m + (a s^2)/2 - x)) Erfc[(m + a s^2 - 
             x)/(Sqrt[2] s)] + 
        E^(b (-m + (b s^2)/2 + x)) Erfc[(-m + b s^2 + 
             x)/(Sqrt[2] s)])]](*, CompilationTarget->"C", 
   RuntimeAttributes->{Listable}, Parallelization->True*)];

nlloglike[data_, a_?NumericQ, b_?NumericQ, m_?NumericQ, s_?NumericQ] := 
  nDistLL[a, b, m, s, data];

nFit[data_] := Module[{a, b, m, s, a0, b0, m0, s0, res},

      (* So far have not found a good way to quickly estimate a and \
b.  Starting assumption is that they both = 2,then m0 ~= 
   Mean and s0 ~= 
   StandardDeviation it seems to work better if a and b are not the \
same at start. *)

   {a0, b0, m0, s0} = nDistParam[data];(*may give Undefined values*)

     If[! (VectorQ[{a0, b0, m0, s0}, NumericQ] && 
       VectorQ[{a0, b0, s0}, # > 0 &]),
            m0 = Mean[data];
            s0 = StandardDeviation[data];
            a0 = 1;
            b0 = 2;];
   res = {a, b, m, s} /. 
     FindMaximum[
       nlloglike[data, Abs[a], Abs[b], m,  
        Abs[s]], {{a, a0}, {b, b0}, {m, m0}, {s, s0}},
               Method -> "PrincipalAxis"][[2]];
      {Abs[res[[1]]], Abs[res[[2]]], res[[3]], Abs[res[[4]]]}];

nFit[data_, {a0_, b0_, m0_, s0_}] := Module[{a, b, m, s, res},
      res = {a, b, m, s} /. 
     FindMaximum[
       nlloglike[data, Abs[a], Abs[b], m, 
        Abs[s]], {{a, a0}, {b, b0}, {m, m0}, {s, s0}},
               Method -> "PrincipalAxis"][[2]];
      {Abs[res[[1]]], Abs[res[[2]]], res[[3]], Abs[res[[4]]]}];

dDist /: PDF[dDist[a_, b_, m_, s_], x_] := 
  PDF[nDist[a, b, m, s], Log[x]]/x;
dDist /: CDF[dDist[a_, b_, m_, s_], x_] := 
  CDF[nDist[a, b, m, s], Log[x]];
dDist /: EstimatedDistribution[data_, dDist[a_, b_, m_, s_]] := 
  dDist[Sequence @@ nFit[Log[data]]];
dDist /: EstimatedDistribution[data_, 
   dDist[a_, b_, m_, 
    s_], {{a_, a0_}, {b_, b0_}, {m_, m0_}, {s_, s0_}}] := 
  dDist[Sequence @@ nFit[Log[data], {a0, b0, m0, s0}]];
dDist /: Quantile[dDist[a_, b_, m_, s_], p_] := 
 Module[{x}, x /. FindRoot[CDF[dDist[a, b, m, s], x] == p, {x, s}]] /;
   0 < p < 1
dDist /: Quantile[dDist[a_, b_, m_, s_], p_] :=  
 Module[{x}, 
   x /. FindRoot[ CDF[dDist[a, b, m, s], x] == #, {x, s}] & /@ p] /; 
  VectorQ[p, 0 < # < 1 &]
dDist /: Quantile[dDist[a_, b_, m_, s_], p_] := -Infinity /; p == 0
dDist /: Quantile[dDist[a_, b_, m_, s_], p_] := Infinity /; p == 1
dDist /: DistributionDomain[dDist[a_, b_, m_, s_]] := 
 Interval[{0, Infinity}]
dDist /: DistributionParameterQ[dDist[a_, b_, m_, s_]] := ! 
  TrueQ[Not[Element[{a, b, s, m}, Reals] && a > 0 && b > 0 && s > 0]]
dDist /: DistributionParameterAssumptions[dDist[a_, b_, m_, s_]] := 
 Element[{a, b, s, m}, Reals] && a > 0 && b > 0 && s > 0
dDist /: Random`DistributionVector[dDist[a_, b_, m_, s_], n_, prec_] :=
   Exp[RandomVariate[ExponentialDistribution[a], n, 
     WorkingPrecision -> prec] - 
       RandomVariate[ExponentialDistribution[b], n, 
     WorkingPrecision -> prec] + 
    RandomVariate[NormalDistribution[m, s], n, 
     WorkingPrecision -> prec]];

यह मुझे वितरण मापदंडों को फिट करने और पीडीएफ और सीडीएफ उत्पन्न करने में सक्षम बनाता है । भूखंडों का एक उदाहरण:

Plot[PDF[dDist[3.77, 1.34, -2.65, 0.40], x], {x, 0, .3}, 
 PlotRange -> All]
Plot[CDF[dDist[3.77, 1.34, -2.65, 0.40], x], {x, 0, .3}, 
 PlotRange -> All]

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

अब मैंने functionऔसत अवशिष्ट जीवन की गणना के लिए परिभाषित किया है ( स्पष्टीकरण के लिए इस प्रश्न को देखें )।

MeanResidualLife[start_, dist_] := 
 NExpectation[X \[Conditioned] X > start, X \[Distributed] dist] - 
  start
MeanResidualLife[start_, limit_, dist_] := 
 NExpectation[X \[Conditioned] start <= X <= limit, 
   X \[Distributed] dist] - start

इनमें से पहला जो एक सीमा निर्धारित नहीं करता है जैसा कि दूसरे में गणना करने के लिए एक लंबा समय लगता है, लेकिन वे दोनों काम करते हैं।

अब मुझे MeanResidualLifeसमान वितरण (या इसके कुछ भिन्नता) के लिए फ़ंक्शन का न्यूनतम पता लगाने या इसे कम करने की आवश्यकता है।

मैंने इस पर कई बदलावों की कोशिश की है:

FindMinimum[MeanResidualLife[x, dDist[3.77, 1.34, -2.65, 0.40]], x]
FindMinimum[MeanResidualLife[x, 1, dDist[3.77, 1.34, -2.65, 0.40]], x]

NMinimize[{MeanResidualLife[x, dDist[3.77, 1.34, -2.65, 0.40]], 
  0 <= x <= 1}, x]
NMinimize[{MeanResidualLife[x, 1, dDist[3.77, 1.34, -2.65, 0.40]], 0 <= x <= 1}, x]

ये या तो हमेशा के लिए चलने लगते हैं या इनमें भाग लेते हैं:

पावर :: infy: अनंत अभिव्यक्ति 1 / 0. का सामना करना पड़ा। >>

MeanResidualLifeसमारोह एक सरल लेकिन इसी तरह के आकार का वितरण से पता चलता है यह एक एकल न्यूनतम है कि करने के लिए लागू:

Plot[PDF[LogNormalDistribution[1.75, 0.65], x], {x, 0, 30}, 
 PlotRange -> All]
Plot[MeanResidualLife[x, LogNormalDistribution[1.75, 0.65]], {x, 0, 
  30},
 PlotRange -> {{0, 30}, {4.5, 8}}]

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

इसके अलावा दोनों:

FindMinimum[MeanResidualLife[x, LogNormalDistribution[1.75, 0.65]], x]
FindMinimum[MeanResidualLife[x, 30, LogNormalDistribution[1.75, 0.65]], x]

मुझे जवाब दे (यदि पहले संदेशों का एक गुच्छा के साथ) जब के साथ प्रयोग किया जाता है LogNormalDistribution

ऊपर वर्णित कस्टम वितरण के लिए काम करने के तरीके के बारे में कोई विचार?

क्या मुझे बाधाओं या विकल्पों को जोड़ने की आवश्यकता है?

क्या मुझे कस्टम वितरण की परिभाषा में कुछ और परिभाषित करने की आवश्यकता है?

हो सकता है FindMinimumया NMinimizeअभी लंबे समय तक चलाने की जरूरत है (मैं उन्हें लगभग एक घंटे का कोई फायदा नहीं हुआ)। यदि ऐसा है तो मुझे फंक्शन का न्यूनतम पता लगाने के लिए किसी तरह की आवश्यकता है? कैसे पर कोई सुझाव?

क्या Mathematicaऐसा करने का एक और तरीका है?

जोड़ा गया 9 फ़रवरी 5:50 अपराह्न ईएसटी:

वुल्फराम टेक्नोलॉजी कॉन्फ्रेंस 2011 की कार्यशाला 'क्रिएट योर ओन डिस्ट्रीब्यूशन' से मैथेमेटिका में वितरण बनाने के बारे में ओलेक्ज़ेंडर पाविलक की प्रस्तुति को कोई भी डाउनलोड कर सकता है । डाउनलोड में नोटबुक शामिल है, 'ExampleOfParametricDistribution.nb'जो एक वितरण बनाने के लिए आवश्यक सभी टुकड़ों को बाहर करने के लिए लगता है जो कि गणित के साथ आने वाले वितरण की तरह उपयोग कर सकता है।

यह उत्तर की कुछ आपूर्ति कर सकता है।


9
गणितज्ञ विशेषज्ञ नहीं, लेकिन मुझे अन्य जगहों पर भी ऐसी ही समस्याओं का सामना करना पड़ा है। ऐसा लगता है कि जब आपका डोमेन 0. पर शुरू होता है, तो आप 0.1 और ऊपर शुरू करने की कोशिश करते हैं और देखते हैं कि क्या समस्याएँ हैं।
मकरकेट्रोनिक्स

7
@Makketronix - इसके लिए धन्यवाद। मजेदार तुल्यकालन, यह देखते हुए कि मैंने 3 साल बाद इसे फिर से शुरू किया है।
जगरा

8
मुझे यकीन नहीं है कि मैं आपकी मदद कर सकता हूं, लेकिन आप गणितज्ञ-विशिष्ट स्टैकओवरफ़्लो पर पूछने की कोशिश कर सकते हैं । शुभकामनाएँ!
ओलिविया स्टॉर्क

4
क्या आपने प्रयास किया: reference.wolfram.com/language/ref/Expectation.html ?
Cplusplusplus

1
Zbmath.org पर इसके बारे में लेखों का एक समूह है। अपेक्षाओं के लिए खोजें
इवान वी

जवाबों:


11

जहाँ तक मैं देख रहा हूँ, समस्या यह है (जैसा कि आपने पहले ही लिखा है), कि MeanResidualLifeगणना के लिए एक लंबा समय लगता है, यहां तक ​​कि एक मूल्यांकन के लिए भी। अब, FindMinimumया समान फ़ंक्शन फ़ंक्शन को न्यूनतम खोजने का प्रयास करते हैं। न्यूनतम खोजने के लिए या तो फ़ंक्शन शून्य का पहला व्युत्पन्न सेट करना होगा और समाधान के लिए हल करना होगा। चूंकि आपका फ़ंक्शन काफी जटिल है (और शायद अलग नहीं है), दूसरी संभावना संख्यात्मक न्यूनीकरण करना है, जिसके लिए आपके फ़ंक्शन के कई मूल्यांकन की आवश्यकता होती है। एर्गो, यह बहुत धीमा है।

मैं इसे मैथमेटिका मैजिक के बिना आज़माने का सुझाव दूंगा।

पहले देखते हैं कि क्या MeanResidualLifeहै, जैसा कि आपने इसे परिभाषित किया है। NExpectationया अपेक्षित मान कीExpectation गणना करें । अपेक्षित मूल्य के लिए, हमें केवल आपके वितरण की आवश्यकता है । आइए इसे सरल कार्यों में अपनी परिभाषा से निकालें:PDF

pdf[a_, b_, m_, s_, x_] := (1/(2*(a + b)))*a*b*
    (E^(a*(m + (a*s^2)/2 - x))*Erfc[(m + a*s^2 - x)/(Sqrt[2]*s)] + 
    E^(b*(-m + (b*s^2)/2 + x))*Erfc[(-m + b*s^2 + x)/(Sqrt[2]*s)])
pdf2[a_, b_, m_, s_, x_] := pdf[a, b, m, s, Log[x]]/x;

अगर हम pdf2 को प्लॉट करते हैं तो यह बिल्कुल आपके प्लॉट जैसा दिखता है

Plot[pdf2[3.77, 1.34, -2.65, 0.40, x], {x, 0, .3}]

पीडीएफ का प्लॉट

अब अपेक्षित मूल्य पर। अगर मैं इसे सही ढंग से समझते हैं कि हम एकीकृत करने के लिए है x * pdf[x]से -infकरने के लिए +infएक सामान्य की उम्मीद मूल्य के लिए।

x * pdf[x] की तरह लगता है

Plot[pdf2[3.77, 1.34, -2.65, 0.40, x]*x, {x, 0, .3}, PlotRange -> All]

एक्स * पीडीएफ का प्लॉट

और अपेक्षित मूल्य है

NIntegrate[pdf2[3.77, 1.34, -2.65, 0.40, x]*x, {x, 0, \[Infinity]}]
Out= 0.0596504

लेकिन जब से आप के बीच अपेक्षित मान चाहते हैं startऔर +infहमें इस सीमा में एकीकृत करने की आवश्यकता है, और पीडीएफ के बाद से अब इस छोटे से अंतराल में 1 से एकीकृत नहीं होता है, मुझे लगता है कि हमें पीडीएफ के अभिन्न द्वारा परिणाम को सामान्य करना होगा यह रेंज। इसलिए बाईं ओर के अनुमानित मूल्य के लिए मेरा अनुमान है

expVal[start_] := 
    NIntegrate[pdf2[3.77, 1.34, -2.65, 0.40, x]*x, {x, start, \[Infinity]}]/
    NIntegrate[pdf2[3.77, 1.34, -2.65, 0.40, x], {x, start, \[Infinity]}]

और उसके लिए MeanResidualLifeतुम से घटाओ start, दे रहे हो

MRL[start_] := expVal[start] - start

के रूप में जो भूखंडों

Plot[MRL[start], {start, 0, 0.3}, PlotRange -> {0, All}]

मीन अवशिष्ट जीवन का प्लॉट

प्रशंसनीय लगता है, लेकिन मैं कोई विशेषज्ञ नहीं हूं। इसलिए अंत में हम इसे कम से कम करना चाहते हैं, अर्थात startजिसके लिए यह फ़ंक्शन एक स्थानीय न्यूनतम है। न्यूनतम 0.05 के आसपास लगता है, लेकिन आइए उस अनुमान से शुरू होने वाले अधिक सटीक मूल्य का पता लगाएं

FindMinimum[MRL[start], {start, 0.05}]

और कुछ त्रुटियों के बाद (आपका फ़ंक्शन 0 से नीचे परिभाषित नहीं किया गया है, इसलिए मुझे लगता है कि न्यूनतम निषिद्ध क्षेत्र उस निषिद्ध क्षेत्र में थोड़ा-बहुत चलता है)

{0.0418137, {शुरू -> 0.0584312}}

तो इष्टतम start = 0.0584312एक औसत अवशिष्ट जीवन के साथ होना चाहिए 0.0418137

मुझे नहीं पता कि यह सही है, लेकिन यह प्रशंसनीय लगता है।


+1 - बस इसे देखा इसलिए मुझे इसके माध्यम से काम करने की आवश्यकता होगी, लेकिन मुझे लगता है कि जिस तरह से आपने समस्या को हल करने योग्य चरणों में विभाजित किया है वह बहुत मायने रखता है। इसके अलावा, आपके MRL फ़ंक्शन का प्लॉट, निश्चित रूप से स्पॉट पर दिखता है। बहुत धन्यवाद, मैं जल्द ही इस पर वापस आऊंगा क्योंकि मैं आपके उत्तर का अध्ययन करने के लिए समय निकाल सकता हूं।
जगरा २
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.