-
Notifications
You must be signed in to change notification settings - Fork 21
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Generalized Procrustes #76
Comments
The following markdown is rendered in the attached PDF. Generalized Procrustes AnalysisThe following notes on generalized Procrustes Analysis are based on: While scaling and translation are complicated (indeed, they are complicated for any non-orthogonal transformation), in The objective function is obtained by transforming multiple matrices in generalized Procrustes analysis. So: The nice thing about this algorithm is that it generalizes to any generalized Procrustes problem. If you pass multple matrices to any Procrustes method, then you end up with the generic problem |
So the short answer is that any Procrustes method can be generalized; the same algorithm(s) work in all cases. But the convergence is only guaranteed for one-sided methods I think, and maybe even only one-sided orthogonal. Other cases are less prevalent, though by no means verboten. There was similar work a long time ago by Carbo-Dorca, who wanted to find a way to align/pose molecules so that a single transformation (for each molecule) maximized the resemblance of all molecule-pairs, collectively. I don't know the reference I can write him for it. |
Thanks for the notes, making things clear. @PaulWAyers and me discussed this before and we can generalize this by using all the modules which have been built. This is going to be a very interesting feature. It should be fast for single-sided Procrustes but can be slow for two-sided Procrustes methods, such as two-sided permutation Procrustes. So, the short question is do we need to generalize it or shall we just implement the generalized orthogonal Procrustes for now? I can implement it once we agreed on which algorithm we are going to generalize. Thanks. |
It is a good question. I would probably attempt to implement a very generalized method, with
Then you could
|
A new update on the notes (see attached PDF). I strongly feel that this issue should not be implemented for this release; it is not that it is difficult to write code for this issue, but writing well-tested well-documented code is going to take some effort. What is currently there is going to be irrelevant to this more general approach, which will need to be written from scratch. The documentation of the code should indicate that this is a preliminary untested implementation. The paper should mention generalized Procrustes as a future prospect (perhaps together with Issue ##49 and #32 ). Note that this issue should only be addressed after all other one- and two-sided methods are in great shape, because it uses them internally!! ==== Generalized Procrustes AnalysisThe following notes on generalized Procrustes Analysis are based on: While scaling and translation are complicated (indeed, they are complicated for any non-orthogonal transformation), in The objective function is obtained by transforming multiple matrices in generalized Procrustes analysis. So: The nice thing about this algorithm is that it generalizes to any generalized Procrustes problem. If you pass multple matrices to any Procrustes method, then you end up with the generic problem ProposalProblem Description$$
Input
Check
Algorithm (Generalized Flip-Flop Algorithm)This algorithm is a greedy-ish fixed-point iteration algorithm. When the problem is convex, the solution is found. Otherwise a local minima is found.
|
We may need to add support of missing values for generalized Procrustes analysis at some point, #110. |
The missing-values correction can be appended as an "outer loop" where one fixes the missing values for each matrix, in turn, and loops over the Procrustes problem for a selection of the missing values. The initial choice of the missing values could be the mean of the values that are present for that entry (of the other matrices) or zeros. |
A short-term enhancement is to generalize our implementation to permit both orthogonal Procrustes, rotation Procrustes, and "generic" Procrustes. These all have easy "inside" loops. Or even every one-sided Procrustes (using this algorithm). We (think we) have a use case for "generic Procrustes" with @ramirandaq . |
I a bit confused with the generalized Procrustes method. I understand that every matrix has a right-hand-side transformation, but does it needs to be an orthogonal transformation (as implemented)? The documentation does not say anything about it and just used T. See: https://github.com/theochem/procrustes/blob/master/procrustes/generalized.py#L87
The text was updated successfully, but these errors were encountered: