Thanks very much for your help. There is still a lot I need to learn with 
sympy.

On Thursday, 15 February 2018 07:30:50 UTC+2, Leonid Kovalev wrote:
>
> loglikelihood does not involve W anywhere, so the derivative is zero. The 
> reason is that the object Zl and Sl that you introduced have nothing to do 
> with Zk and Sk that were computed earlier, they share the name but are of a 
> different class.  Other issues: 
>
> Since you are using passive forms Sum, HadamardProduct (instead of 
> summation or hadamard_product), you'll need loglikelihood.doit() to get the 
> computation done before taking the derivative. 
>
> The summation (t, 0, Tk-1) is out of bounds. Sum ranges include the end 
> value of the index, unlike Python ranges. So you are summing over Tk values 
> of the index but the matrix does not have that many because one column was 
> dropped earlier. 
>
> Calculus with indexed symbols is still rough around the edges in SymPy. If 
> the above issues are sorted, you'll hit another one, #14216 
> <https://github.com/sympy/sympy/issues/14216> - differentiating loggamma 
> leads to unpolarify, which doesn't understand indexed matrix elements. A 
> workaround is to fill the matrix with non-indexed symbols, for example 
> generating them with symarray. This is what I do below; the code is 
> modified according to the above remarks. 
>
> n = 3
> T = 5
> eta = sympy.Symbol('eta')
> W = sympy.Matrix(symarray('W', (n, n)))
> S = sympy.Matrix(symarray('S', (n, T)))
> def detdyn(s,w):
>     '''Z if a function of S and W'''
>     f = w*s
>     f_average = sympy.HadamardProduct(f, s)
>     f_average = sympy.ones(1,f_average.shape[0]) * f_average #row sum
>     #compute coefficients of Z
>     c=f.as_mutable()
>     for r in range(T):
>         c.col_op(r, lambda i,j: i / f_average[0, r])
>     z = sympy.HadamardProduct(c,s)
>     return z
> Tk = S.shape[1] #length of the data
> Zk = detdyn(S,W)[:,:-1] #compute the deterministic dynamics
> Sk = S[:,1:] #drop first observation
> i, t = sympy.symbols('i t', cls=sympy.Idx)
> loglikelihood=(Tk-1)*sympy.loggamma(eta)+sympy.Sum(sympy.Sum(-sympy.loggamma(eta*Zk[i,t])+(eta*Zk[i,t]-1)*sympy.ln(Sk[i,t]),(i,
>  
> 0, 2)),(t, 0, Tk-2))
> print(loglikelihood.doit().diff(W[0, 0]))
>
>
>  
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sympy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/8b2c5d44-61c8-44f8-8295-453eb71587f7%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to