SORU
8 ŞUBAT 2012, ÇARŞAMBA


En aza indirmek * özel bir dağıtım için NExpectation

Bu Haziran ayında geri gelen daha önceki bir soru ile ilgilidir:

Calculating expectation for a custom distribution in Mathematica

Özel karma bir dağıtım ikinci bir özel dağıtım hatlarını geçtiğimiz yıl boyunca çok sayıda yanıt @Sasha tarafından ele takip kullanarak tanımlıyorum.

Kodu aşağıdaki dağıtımları tanımlama

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]];

Bu beni dağılım parametreleri uyum ve oluşturmak için olanak sağlarPDFveCDF. Araziler bir örnek:

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]

enter image description here

Şimdi function hesaplamak için ortalama kalan yaşam (açıklama için this question) tanımlanan ettim.

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

İkinci olarak bir limit yok Bunlardan ilki uzun zaman hesaplamak için alır, ama onlar her iki çalışma.

Şimdi aynı dağıtım için MeanResidualLife işlev (ya da bazı varyasyon) en az bulmam lazım ya da en aza indirmek.

Bu varyasyonlar bir dizi denedim:

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]

Bu da sonsuza kadar çalıştırmak veya çalıştırmak için bir şey gibi görünüyor

::Güç ınfy : 1/ 0. Sonsuz ifade karşılaştı<< .

MeanResidualLife işlevi basit ama aynı şekilde dağıtım şeklinde uygulanan tek bir minimum olduğunu gösterir:

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}}]

enter image description here

Ayrıca her ikisi de:

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

LogNormalDistribution ile kullanıldığında bana cevap (mesaj önce bir grup varsa) ver.

Bu özel dağıtım için yukarıda açıklanan işe almak için nasıl bir planın var mı?

Kısıtlamaları ya da seçenekleri eklememe gerek var mı?

Özel dağılımlarının tanımları başka bir şey tanımlamak gerekiyor mu?

FindMinimum NMinimize sadece uzun vadede gerek (boşuna yaklaşık bir saat koştum belki. Sadece fonksiyonun minimum bulma hızlandırmak gerekiyor mu? Nasıl herhangi bir öneriniz var mı?

Mathematica bunu yapmak için başka bir yol var mı?

Şimdiden teşekkürler!

9 Şubat 5:50 EST ekledi:

Herkes indirebilirOleksandr PavlykWolfram Teknoloji Konferansı İncelenmiştir dağılımları oluşturma hakkında sunum 2011 Çalıştayı 'Kendi Dağıtım' 25**. Oluşturun İndirme Sturm ile gelen dağıtımların gibi tüm parçaları tek kullanabileceği bir dağıtım oluşturmak için gerekli seriyor görünüyor defter, 'ExampleOfParametricDistribution.nb' vardır.

Cevap bazı kaynağı olabilir.

CEVAP
28 EKİM 2008, Salı


İşe yaradı teşekkürler!

İşte final kodu:

$.validator.addMethod("greaterThanZero", function(value, element) {
    var the_list_array = $("#some_form .super_item:checked");
    return the_list_array.length > 0;
}, "* Please check at least one check box");

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Greater Than Gatsby Photoshop Actions & Lightroom Presets

    Greater Than

    11 ŞUBAT 2013
  • JorteexHD

    JorteexHD

    20 NİSAN 2012
  • picster

    picster

    20 NİSAN 2006