[SciPy-User] [SciPy-user] Maximum entropy distribution for Ising model - setup?

Jordi Molins Coronado jordi_molins@hotmail....
Thu Jan 7 03:19:30 CST 2010

Sorry, I see my previous message has been a disaster in formatting. I try now in a different way. Sorry for the inconveniences.

Hello, I am new to this forum. I am looking for a numerical solution to the inverse problem of an Ising model (or a model not-unlike the Ising model, see below). I have seen an old discussion, but very interesting, about this subject on this forum (http://mail.scipy.org/pipermail/scipy-user/2006-October/009703.html).
I would like to pose my problem (which is quite similar to the problem discussed in the thread above) and kindly ask you your opinion on that:

My space is a set of discrete nodes,s_i, where i=1,...,N, which can take two values, {0,1}. Empirically I have the following information: 
<s_i>_emp and <s_i*s_j>_emp, where i,j=1,...,N with i!=j.

It is well known in the literature that the Ising model

P(s_1, s_2, ..., s_N) = 1 / Z * exp( sum{for all i}(h_i*s_i) + 0.5*sum{for all i!=j}(J_ij*s_i*s_j) ) 
maximizes entropy with the constraints given above (in fact, this is not the Ising model, because the Ising model assumes only nearest-neigbour interactions, and I have interactions with all other nodes, but I believe it is still true that the above P(s1,...sN) still maximizes entropy given the constraints above).
What I would like is to solve the inverse problem of finding the h_i and J_ij which maximize entropy given my constraints. However, I would like to restrict the number of h_i and J_ij possible, since having complete freedom could become an unwieldly problem. For example, I could restrict h_i = H and J_ij = J for all i,j=1,...N, i!=j, or I could have a partition of my nodes, say nodes from 1 to M having h_i = H1 and J_ij=J1 i,j=1,...,M i!=j, and h_i=H2 and J_ij=J2 i,j=M+1,...,N i!=j, and the J_ij=J3 for i=1,...,M and j=M+1,...N.
If I understand correctly the discussion in the thread shown above, a numerical solution for the inverse problem would be:
hi_{new}=hi_{old} + K * (<si> - <si>_{emp})
Jij_{new}=Jij_{old}+ K' * (<si*sj> - <si*sj>_{emp})

where K and K' are pos. "step size" constants. (On the RHS, <si> and <si*sj> are w.r.t. hi_{old} and Jij_{old}.)
Have I understood all this correctly? In particular, for the case h_i = H and J_ij = J for all i,j=1,...N, i!=j could I simplify the previous algorithm by restricting the calculations only to say i=1 (i=2,...,N should be the same?), and for the case h_i = H1 and J_ij=J1 i,j=1,...,M i!=j, and h_i=H2 and J_ij=J2 i,j=M+1,...,N i!=j simplify it by restricting the calculations only to say i=1 and i=M+1?
Thank you for your help and sorry if I am new here and I have committed some "ettiquette" mistake.

More information about the SciPy-User mailing list