Как создать кулоновскую матрицу с помощью Python?

Мне нужны кулоновские матрицы молекул для задачи машинного обучения. Кулоновская матрица? Вот статья, описывающая это

Я нашел пакет python molml, у которого есть метод для этого. Однако я не могу понять, как использовать API только для одной молекулы. Во всех примерах они дают метод, который называется с двумя молекулами, почему?

Как пример предоставляет метод:

H2 = (['H', 'H'],
      [[0.0, 0.0, 0.0],
      [1.0, 0.0, 0.0]])

HCN = (['H', 'C', 'N'],
       [[-1.0, 0.0, 0.0],
        [ 0.0, 0.0, 0.0],
        [ 1.0, 0.0, 0.0]])

feat.transform([H2, HCN])

Мне нужно что-то вроде этого:

 atomnames = [list of atomsymbols]
 atomcoords = [list of [x,y,z] for the atoms] 
 coulombMatrice = CoulombMatrix((atomnames,atomcoords)

Я также нашел другую библиотеку ( QML), которая обещает возможность генерировать кулоновские матрицы, но я не могу установить ее на Windows, потому что это зависит от компиляторов Linux GCC-Fortran, я уже установил Cygwin и GCC-Fortran для этой цели,

Спасибо вам, ребята

1 ответ

Я реализовал свое собственное решение проблемы. Там много места для улучшений. Например, случайно отсортированная матрица кулонов и пакет облигаций до сих пор не реализованы.

    import numpy as np

def get_coulombmatrix(molecule, largest_mol_size=None):
    """
    This function generates a coulomb matrix for the given molecule
    if largest_mol size is provided matrix will have dimension lm x lm.
    Padding is provided for the bottom and right _|
    """
    numberAtoms = len(molecule.atoms)
    if largest_mol_size == None or largest_mol_size == 0: largest_mol_size = numberAtoms

    cij = np.zeros((largest_mol_size, largest_mol_size))

    xyzmatrix = [[atom.position.x, atom.position.y, atom.position.z] for atom in molecule.atoms]
    chargearray = [atom.atomic_number for atom in molecule.atoms]

    for i in range(numberAtoms):
        for j in range(numberAtoms):
            if i == j:
                cij[i][j] = 0.5 * chargearray[i] ** 2.4  # Diagonal term described by Potential energy of isolated atom
            else:
                dist = np.linalg.norm(np.array(xyzmatrix[i]) - np.array(xyzmatrix[j]))
                cij[i][j] = chargearray[i] * chargearray[j] / dist  # Pair-wise repulsion
    return cij
Другие вопросы по тегам