criar distribuições em mathematica

votos
3

I têm uma função que sei ser uma distribuição multivariada em (x, y), e mathematica está a ter problemas de estabilidade numéricos quando formam as distribuições marginais.

Por exemplo, ao longo marginalizando y produz o seguinte: 0.e ^ (154.88-0.5x ^ 2)

Desde que eu sei o resultado deve ser uma distribuição, eu gostaria de extrair apenas o e ^ (-. 5x ^ 2) e fazer um renormalization mim. Alternativamente, seria ainda melhor se mathematica me deixaria levar uma função multivariada e de alguma forma especificá-lo como uma distribuição de probabilidade.

De qualquer forma, alguém sabe como implementar qualquer um dos acima duas soluções através de programação?

Publicado 16/10/2009 em 23:29
fonte usuário
Em outras línguas...                            


3 respostas

votos
1

Ok, aqui está um exemplo do que quero dizer. Suponha que eu tenho a seguinte distribuição 2D:

Dist = 
3.045975040844157` E^(-(x^2/2) - y^2/
2) (-1 + E^(-1.` (x + 0.1` y) UnitStep[x + 0.1` y]))^2

E eu tento

Integrate[Dist, {y, -Infinity, Infinity}]

O Mathematica não fornecer uma resposta, ou pelo menos não o faz por um bom tempo no meu computador. Sugestões?

Edit: Ok, então ele realmente faz, mas leva 5 minutos no meu Intel i5 com 4 GB de RAM ... Eu ainda estou esperando theres alguma maneira de tocar em do Mathematica construído no tipo de distribuição (embora parece ser única variável única) e fazer uso de seu RandomReal [dist]. O melhor que eu poderia esperar é se Mathematica iria deixar-me especificar esta função 2D como uma distribuição, e ser capaz de chamar RandomRealVector [dist].

Respondeu 19/10/2009 em 01:36
fonte usuário

votos
1

ProbabilityDistribution toma funções multivariadas, embora a sua função Dist é um pouco estranho demais para seu gosto.

Adicionalmente, parece que as distribuições multivariadas definidas pelo usuário atualmente não funcionam em combinação com RandomVariate(a versão V8 um pouco mais versátil de RandomReal/ RandomInteger). Distribuições univariadas trabalhar. I apresentou um relatório de bug para WRI.

Respondeu 15/02/2011 em 00:05
fonte usuário

votos
1

Bem, lidar com expressões simbólicas em Mathematica, é melhor manter as coisas exata, ou seja, evitar números aproximados:

In[36]:= pdf = PiecewiseExpand[Rationalize[E^(-(x^2/2) - y^2/2)*
         (-1 + E^(-1.*(x + 0.1*y)*UnitStep[x + 0.1*y]))^2], 
  Element[{x, y}, Reals]]

Out[36]= Piecewise[{{E^(-2*x - x^2/2 - y/5 - y^2/2)*(-1 + 
       E^(x + y/10))^2, 10*x + y >= 0}}, 0]

A fim de atacar o problema, é melhor mudar variáveis:

In[56]:= cvr = 
 First[Solve[{10 x + y == u, (10 y - x)/101 == v}, {x, y}]]

Out[56]= {x -> (10 u)/101 - v, y -> u/101 + 10 v}

Observe que os coeficientes foram escolhidos para que jacobian é uma unidade:

In[42]:= jac = Simplify[Det[Outer[D, {x, y} /. cvr, {u, v}]]]

Out[42]= 1

Após a mudança de variáveis, você vê que a densidade fatoriza em um produto:

In[45]:= npdf = FullSimplify[jac*pdf /. cvr]

Out[45]= Piecewise[{{E^(-(u/5) - u^2/202 - (101*v^2)/2)*(-1 + 
       E^(u/10))^2, u >= 0}}, 0]

Isto é, agora variáveis 'u' e 'V' são independentes. A variável 'v' é NormalDistribution[0, 1/101], enquanto o 'u' variável é um pouco mais complicado, mas agora pode ser tratado por ProbabilityDistribution.

In[53]:= updf = 
 Refine[npdf/nc, u >= 0]/PDF[NormalDistribution[0, 1/Sqrt[101]], v]

Out[53]= (E^(-(u/5) - u^2/202)*(-1 + E^(u/10))^2*Sqrt[2/(101*Pi)])/
   (1 - 2*E^(101/200)*Erfc[Sqrt[101/2]/10] + 
   E^(101/50)*Erfc[Sqrt[101/2]/5])

Então, agora você pode definir a distribuição conjunta para o vetor {u,v}:

dist = ProductDistribution[NormalDistribution[0, 1/101], 
   ProbabilityDistribution[updf, {u, 0, Infinity}]];

Uma vez que a relação entre {u,v}e {x,y}é conhecido, geradora de {x,y}variates é fácil:

XYRandomVariates[len_] := 
 RandomVariate[dist, len].{{-1, 10}, {10/101, 1/101}}

Você pode encapsular o conhecimento acumulado usando TransformedDistribution:

origdist = 
  TransformedDistribution[{(10 u)/101 - v, 
    u/101 + 10 v}, {Distributed[v, NormalDistribution[0, 1/101]], 
    Distributed[u, ProbabilityDistribution[updf, {u, 0, Infinity}]]}];

Por exemplo:

In[68]:= Mean[RandomVariate[origdist, 10^4]]

Out[68]= {1.27198, 0.126733}
Respondeu 19/02/2011 em 20:52
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more