গাণিতিকায় একটি কাস্টম বিতরণের জন্য 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 pm EST:

যে কেউ ডাউনলোড করতে পারেন Oleksandr Pavlyk এর উল্ফর্যাম প্রযুক্তি সম্মেলন 2011 কর্মশালার আপনার নিজের 'বিতরণ তৈরি করুন' থেকে ম্যাথামেটিকাল মধ্যে ডিস্ট্রিবিউশন তৈরি সম্পর্কে উপস্থাপনা এখানে । ডাউনলোডগুলিতে নোটবুক অন্তর্ভুক্ত রয়েছে, 'ExampleOfParametricDistribution.nb'যা গণিতের সাথে আসা বিতরণগুলির মতো ব্যবহার করতে পারে এমন একটি বিতরণ তৈরি করতে প্রয়োজনীয় সমস্ত টুকরোগুলি রেখে দেয়।

এটি কিছু উত্তর সরবরাহ করতে পারে।


9
গণিত বিশেষজ্ঞ নয়, তবে অন্যান্য জায়গাগুলিতেও আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি। মনে হয় আপনার ডোমেনটি ০.০০০ থেকে শুরু হওয়ার সময় আপনার সমস্যা রয়েছে 0.1.০ এবং তারপরে শুরু করার চেষ্টা করুন এবং দেখুন কী ঘটে।
মককেট্রনিক্স

7
@ মাকেট্রোনিক্স - এটির জন্য ধন্যবাদ। মজার সিনক্রোনসিটি, প্রদত্ত আমি 3 বছর পরে এটি পুনরায় দেখা শুরু করেছি।
জাগ্রা

8
আমি নিশ্চিত না যে আমি আপনাকে সাহায্য করতে পারি তবে আপনি গণিত-নির্দিষ্ট স্ট্যাকওভারফ্লোতে জিজ্ঞাসা করার চেষ্টা করতে পারেন । ভাগ্য সুপ্রসন্ন হোক!
অলিভিয়া স্টর্ক


1
Zbmath.org এ সম্পর্কে এটি সম্পর্কে অনেকগুলি নিবন্ধ রয়েছে প্রত্যাশাগুলির জন্য অনুসন্ধান করুন
ইভান ভি

উত্তর:


11

যতদূর আমি দেখতে পাচ্ছি, সমস্যাটি (যেমন আপনি ইতিমধ্যে লিখেছেন), এটি MeanResidualLifeএকক মূল্যায়নের জন্য, এমনকি গণনা করতে দীর্ঘ সময় নেয়। এখন, FindMinimumবা অনুরূপ ফাংশনগুলি ফাংশনটির সর্বনিম্ন সন্ধান করার চেষ্টা করে। ন্যূনতম সন্ধানের জন্য হয় কার্য শূন্যের প্রথম ডেরাইভেটিভ সেট করতে হবে এবং সমাধানের সমাধান করতে হবে। যেহেতু আপনার ফাংশনটি বেশ জটিল (এবং সম্ভবত পৃথক নয়), দ্বিতীয় সম্ভাবনাটি হ'ল একটি সংখ্যাসূচক হ্রাস করা, যার জন্য আপনার ফাংশনটির অনেক মূল্যায়ন প্রয়োজন। কিন্তু, এটা খুব ধীর।

আমি ম্যাথামেটিকা ​​যাদু ছাড়াই চেষ্টা করার পরামর্শ দিই।

প্রথমে আসুন দেখুন এটি MeanResidualLifeকী, আপনি এটি সংজ্ঞায়িত করেছেন। NExpectationবা প্রত্যাশিত মানExpectation গণনা করুন । প্রত্যাশিত মানের জন্য আমাদের কেবল আপনার বিতরণ দরকার the আসুন এটির উপরে আপনার সংজ্ঞাটি সরল ফাংশনগুলিতে সরান: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;

আমরা যদি পিডিএফ 2 প্লট করি তবে এটি আপনার প্লটের মতোই দেখাবে

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

তবে যেহেতু আপনি a এর মধ্যে প্রত্যাশিত মানটি চান 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জন্য স্থানীয় ফাংশনটি সর্বনিম্ন find সর্বনিম্নটি ​​0.05 এর কাছাকাছি বলে মনে হচ্ছে তবে আসুন সেই অনুমানের থেকে আরও সঠিক মান খুঁজে পাওয়া যাক

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

এবং কিছু ত্রুটির পরে (আপনার ফাংশন 0 এর নীচে সংজ্ঞায়িত করা হয়নি, তাই আমি অনুমান করি যে মিনিমাইজারটি সেই নিষিদ্ধ অঞ্চলে কিছুটা ঝুঁকে পড়ে) আমরা পাই

{0.0418137, {শুরু -> 0.0584312}

সুতরাং সর্বোত্তম হওয়া উচিত start = 0.0584312একটি গড় অবকাশ জীবন নিয়ে 0.0418137

আমি জানি না এটি সঠিক কিনা তবে এটি প্রশংসনীয় বলে মনে হয়।


+1 - সবেমাত্র এটি দেখেছি তাই এটির মাধ্যমে আমার কাজ করা দরকার, তবে আমি মনে করি যেভাবে আপনি সমস্যার সমাধানযোগ্য পদক্ষেপে ভাগ করেছেন তাতে প্রচুর অর্থ পাওয়া যায়। এছাড়াও, আপনার এমআরএল ফাংশনের প্লটটি অবশ্যই স্পট লাগবে। অনেক ধন্যবাদ, আমি আপনার উত্তরটি অধ্যয়নের জন্য সময় করতে পারার সাথে সাথেই এটিতে ফিরে আসব।
জাগ্রা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.