【问题标题】:Using levenshtein distance in knn regression model在 knn 回归模型中使用 levenshtein 距离
【发布时间】:2020-07-21 10:04:00
【问题描述】:

我有兴趣使用 KNN 回归模型预测我的蛋白质的稳定性,但是我想使用作为我的蛋白质嵌入计算的 levenshtein 距离而不是序列本身,作为我的模型的输入变量。我希望根据每个序列的 levenshtein 距离,使用 k 个最近邻的训练误差来衡量每个实例的不一致性。

如果可能的话,我不希望对它们进行热编码。

我的输入表如下所示:

new_host  sequence    expression
FALSE     AQVPYGVS-   0.039267878
FALSE     ASVPYGVSI   0.039267878
FALSE     STNL-GSGR   0.261456561
FALSE     NLYGSGL-R   0.265188519
FALSE     SLGP-NLYG   0.419680588
FALSE     A-SLGTTNG   0.145710993

对于我的输出,我不确定我是否真的可以得到每个特定的距离,以及这是否会用于我的 KNN 回归模型的输入。

我计算 levenshtein 距离的函数:

def levenshtein(seq1, seq2):
    size_x = len(seq1) + 1
    size_y = len(seq2) + 1
    matrix = np.zeros ((size_x, size_y))
    for x in range(size_x):
        matrix [x, 0] = x
    for y in range(size_y):
        matrix [0, y] = y

    for x in range(1, size_x):
        for y in range(1, size_y):
            if seq1[x-1] == seq2[y-1]:
                matrix [x,y] = min(
                    matrix[x-1, y] + 1,
                    matrix[x-1, y-1],
                    matrix[x, y-1] + 1
                )
            else:
                matrix [x,y] = min(
                    matrix[x-1,y] + 1,
                    matrix[x-1,y-1] + 1,
                    matrix[x,y-1] + 1
                )
    print (matrix)
    return (matrix[size_x - 1, size_y - 1])

我的函数来计算每个实例的不合格:

  def nonconformity(self, z, Z):
        """Return k-Nearest Neighbours (kNN) nonconformity measure.
        
        Parameters
        ----------
        z : array-like, shape (n_features,)
            Test vector, where n_features is the number of features.
        Z : array-like, shape (n_samples, n_features)
            Training vectors, where n_samples is the number of samples,
            n_features is the number of features.
        Returns
        -------
        r : float
            kNN nonconformity measure on z with respect to Z.
        """
        # Take the k smallest distances between z rows and zn and sum them.
        dist = cdist(Z, [z])[:,0]
        r = np.sort(dist)[:self.k].sum()
    
        return r

期望的输出(不确定这是否可能)

new_host  sequence    expression   Levenshtein Distance
FALSE     AQVPYGVS-   0.039267878    0
FALSE     ASVPYGVSI   0.039267878    0.1
FALSE     STNL-GSGR   0.261456561    0.2 
FALSE     NLYGSGL-R   0.265188519    0.2 
FALSE     SLGP-NLYG   0.419680588    0.4
FALSE     A-SLGTTNG   0.145710993    0.5

【问题讨论】:

  • 交叉发布:biostars.org/p/450586
  • @Pierre 正如我从上一个论坛中删除的那样,我认为这不会是一个问题,因为我认为它们是完全不同的两个论坛。

标签: python machine-learning regression bioinformatics levenshtein-distance


【解决方案1】:

据我了解,您需要找到每个字符串与所有字符串的距离。但是这样做会失败,就好像序列的长度是 n 和序列长度是 m 然后 O(n*n*m*m) 复杂性一样。您可以尝试使用虚拟字符串(如 origin:"---------")来计算所有序列的 Levenshtein 距离。

import pandas as pd
import numpy as np

sequence = ["AQVPYGVS-", "ASVPYGVSI", "STNL-GSGR", "NLYGSGL-R", "SLGP-NLYG", "A-SLGTTNG"]   
expression = [0.039267878, 0.039267878, 0.145710993, 0.419680588, 0.265188519, 0.261456561]

def levenshtein(seq1, seq2):
    size_x = len(seq1) + 1
    size_y = len(seq2) + 1
    matrix = np.zeros ((size_x, size_y))
    for x in range(size_x):
        matrix [x, 0] = x
    for y in range(size_y):
        matrix [0, y] = y

    for x in range(1, size_x):
        for y in range(1, size_y):
            if seq1[x-1] == seq2[y-1]:
                matrix [x,y] = min(
                    matrix[x-1, y] + 1,
                    matrix[x-1, y-1],
                    matrix[x, y-1] + 1
                )
            else:
                matrix [x,y] = min(
                    matrix[x-1,y] + 1,
                    matrix[x-1,y-1] + 1,
                    matrix[x,y-1] + 1
                )
    # print (matrix)
    return (matrix[size_x - 1, size_y - 1])


seq_distances = np.empty((0, len(sequence)), int)
for seq1 in range(0, len(sequence)):
    seq1_dist = []
    for seq2 in range(0, len(sequence)):
        seq1_dist.append(levenshtein(sequence[seq1], sequence[seq2]))    
    seq_distances = np.vstack((seq_distances, np.array(seq1_dist)))

print(seq_distances)

# Something of this sort can be used.
dist = distance.cdist(seq_distances, [seq_distances[0]])
r = np.sort(dist, axis=0)[:k].sum()

输出:

[[0. 2. 8. 8. 8. 8.]
 [2. 0. 8. 8. 8. 8.]
 [8. 8. 0. 5. 7. 8.]
 [8. 8. 5. 0. 7. 9.]
 [8. 8. 7. 7. 0. 6.]
 [8. 8. 8. 9. 6. 0.]]

【讨论】:

  • 嘿!感谢您的跟进,基本上我很好奇我是否可以得到上面提到的输出,不过这很棒。请看我的新问题。
  • 看到上面你提到的只有当你从一个虚拟序列计算每个序列距离时才能完成,对于我的回答你需要两列seq_1seq_2,因为它们是矩阵索引并给出他们的 Levenshtein 距离。您可以展平矩阵并获得所需的结果。
猜你喜欢
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 2014-04-14
相关资源
最近更新 更多