Source code for MDAnalysis.analysis.encore.dimensionality_reduction.DimensionalityReductionMethod
# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*-
# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
#
# MDAnalysis --- https://www.mdanalysis.org
# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors
# (see the file AUTHORS for the full list of names)
#
# Released under the GNU Public Licence, v2 or any higher version
#
# Please cite your use of MDAnalysis in published work:
#
# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler,
# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein.
# MDAnalysis: A Python package for the rapid analysis of molecular dynamics
# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th
# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy.
# doi: 10.25080/majora-629e541a-00e
#
# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein.
# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations.
# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787
#
"""
dimensionality reduction frontend --- :mod:`MDAnalysis.analysis.encore.clustering.DimensionalityReductionMethod`
================================================================================================================
The module defines classes for interfacing to various dimensionality reduction
algorithms. One has been implemented natively, and will always be available,
while others are available only if scikit-learn is installed
:Author: Matteo Tiberti, Wouter Boomsma, Tone Bengtsen
.. versionadded:: 0.16.0
"""
from __future__ import absolute_import
import logging
import warnings
# Import native affinity propagation implementation
from . import stochasticproxembed
# Attempt to import scikit-learn clustering algorithms
try:
import sklearn.decomposition
except ImportError:
sklearn = None
import warnings
warnings.warn("sklearn.decomposition could not be imported: some "
"functionality will not be available in "
"encore.dimensionality_reduction()", category=ImportWarning)
[docs]class DimensionalityReductionMethod (object):
"""
Base class for any Dimensionality Reduction Method
"""
# Whether the method accepts a distance matrix
accepts_distance_matrix=True
def __call__(self, x):
"""
Parameters
----------
x
either trajectory coordinate data (np.array) or an
encore.utils.TriangularMatrix, encoding the conformational
distance matrix
Returns
-------
numpy.array
coordinates in reduced space
"""
raise NotImplementedError("Class {0} doesn't implement __call__()"
.format(self.__class__.__name__))
[docs]class StochasticProximityEmbeddingNative(DimensionalityReductionMethod):
"""
Interface to the natively implemented Affinity propagation procedure.
"""
def __init__(self,
dimension = 2,
distance_cutoff = 1.5,
min_lam = 0.1,
max_lam = 2.0,
ncycle = 100,
nstep = 10000,):
"""
Parameters
----------
dimension : int
Number of dimensions to which the conformational space will be
reduced to (default is 3).
min_lam : float, optional
Final lambda learning rate (default is 0.1).
max_lam : float, optional
Starting lambda learning rate parameter (default is 2.0).
ncycle : int, optional
Number of cycles per run (default is 100). At the end of every
cycle, lambda is updated.
nstep : int, optional
Number of steps per cycle (default is 10000)
"""
self.dimension = dimension
self.distance_cutoff = distance_cutoff
self.min_lam = min_lam
self.max_lam = max_lam
self.ncycle = ncycle
self.nstep = nstep
self.stressfreq = -1
def __call__(self, distance_matrix):
"""
Parameters
----------
distance_matrix : encore.utils.TriangularMatrix
conformational distance matrix
Returns
-------
numpy.array
coordinates in reduced space
"""
final_stress, coordinates = \
stochasticproxembed.StochasticProximityEmbedding(
s=distance_matrix,
rco=self.distance_cutoff,
dim=self.dimension,
minlam = self.min_lam,
maxlam = self.max_lam,
ncycle = self.ncycle,
nstep = self.nstep,
stressfreq = self.stressfreq
)
return coordinates, {"final_stress": final_stress}
if sklearn:
[docs] class PrincipalComponentAnalysis(DimensionalityReductionMethod):
"""
Interface to the PCA dimensionality reduction method implemented in
sklearn.
"""
# Whether the method accepts a distance matrix
accepts_distance_matrix = False
def __init__(self,
dimension = 2,
**kwargs):
"""
Parameters
----------
dimension : int
Number of dimensions to which the conformational space will be
reduced to (default is 3).
"""
self.pca = sklearn.decomposition.PCA(n_components=dimension,
**kwargs)
def __call__(self, coordinates):
"""
Parameters
----------
coordinates : np.array
trajectory atom coordinates
Returns
-------
numpy.array
coordinates in reduced space
"""
coordinates = self.pca.fit_transform(coordinates)
return coordinates.T, {}