예제 #1
0
def GetCorrelationCorrectedEigensystem(T,
                                       NumEigen,
                                       Assignments,
                                       MultiplicativeFactor=6,
                                       CorrelationLength=50):
    """Get the slowest eigenvalues of a system, correcting for nonmarkovian bias.

    Inputs:
    T: Transition Matrix
    NumEigen: Number of eigenvalues to get
    Assignments: Assignments array

    Optional Arguments:
    

    Eigenvalues  estimated using a short lagtime model generally yield timescales that are far too fast.  In particular, often those timescales would be slower when estimated with a longer timescale model.  This is particularly bad when using PCCA or PCCA+, as sometimes the short-timescale eigenvalues are not in correct rank order.  This leads to poor state decompositions.  This functino uses an eigenvector correlation function analysis to get the 'long lagtime' corrected eigenvalues, in the correct order.  These eigenvalues can then be used to yield a better state decomposition.
    """

    #We first calculate more than the desired number of eigenvalues
    #Then we correct them and pick the slowest *corrected* eigenvalues
    NumEigenToCalculate = NumEigen * MultiplicativeFactor

    eigVals, eigVecs = MSMLib.GetEigenvectors(T, NumEigenToCalculate)
    #eigVals,eigVecs_Right=MSMLib.GetEigenvectors_Right(T,(NumEigen)*MultiplicativeFactor)

    #Calculate the right eigenvectors using the stationary vector
    eigVecs_Right = eigVecs.copy()
    Pi = eigVecs[:, 0]
    for i in range(NumEigenToCalculate):
        eigVecs_Right[:, i] /= Pi

    Ind, CorrelationEigVals = ReOrderEigensystem(
        Assignments,
        eigVals,
        eigVecs_Right,
        CorrelationLength=CorrelationLength)

    #Re-order using the correct ordering
    CorrelationEigVals = CorrelationEigVals[Ind]
    eigVals = eigVals[Ind]
    eigVecs = eigVecs[:, Ind]
    eigVecs_Right = eigVecs_Right[:, Ind]

    #Collect the NumEigen slowest eigenvalues and eigenvectors.
    eigVals = eigVals[0:NumEigen]
    eigVecs = eigVecs[:, 0:NumEigen]
    eigVecs_Right = eigVecs_Right[:, 0:NumEigen]
    CorrelationEigVals = CorrelationEigVals[0:NumEigen]

    print(-1 / np.log(eigVals))
    print(-1 / np.log(CorrelationEigVals))

    return eigVals, CorrelationEigVals, eigVecs, eigVecs_Right
예제 #2
0
#!/usr/bin/env python

import os, sys
import numpy as np

from msmbuilder import MSMLib
from scipy.io import mmread
from scipy import loadtxt, savetxt

usage = """Usage:  python getPops.py tProbsFn.mtx
    will write tProbsFn.Populations.dat"""

if len(sys.argv) < 2:
    print usage
    sys.exit(1)

tProbsFn = sys.argv[1]
TC = mmread(tProbsFn)
EigAns = MSMLib.GetEigenvectors(TC, 5)
Populations = EigAns[1][:, 0]

popsFn = os.path.basename(tProbsFn).replace('.mtx', '.Populations.dat')
savetxt(popsFn, Populations)