如何用Python创建库仑矩阵?

2024-09-30 00:39:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一些库仑分子矩阵来完成机器学习任务。 库仑矩阵?这里有一个paper来描述它

我找到了python包molml,它有一个方法。然而,我不知道如何将api仅用于单个分子。在所有的examples中,他们提供的方法被称为双分子,为什么?在

示例如何提供方法:

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])

我需要这样的东西:

^{pr2}$

我还发现了另一个lib(QML),它承诺有可能生成库仑矩阵,但是,我不能在windows上安装它,因为它依赖于linux gcc fortran编译器,为此我已经安装了cygwin和gcc fortran。在

谢谢你们,伙计们


Tags: 方法机器api示例transform矩阵h2分子
1条回答
网友
1楼 · 发布于 2024-09-30 00:39:36

我已经为这个问题实施了我自己的解决方案。还有很大的改进空间。E、 g.随机排序的库仑矩阵和键袋仍未实现。在

    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

相关问题 更多 >

    热门问题