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
#!/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)