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.
