Python 在knn回归模型中使用levenshtein距离

Python 在knn回归模型中使用levenshtein距离,python,machine-learning,regression,bioinformatics,levenshtein-distance,Python,Machine Learning,Regression,Bioinformatics,Levenshtein Distance,我对使用KNN回归模型预测蛋白质的稳定性感兴趣,但是我想使用作为蛋白质嵌入计算的levenshtein距离作为模型的输入变量,而不是序列本身。我希望根据每个序列的levenshtein距离,使用k个最近邻的训练误差来衡量每个实例的不一致性 我不希望一个热编码,如果可能的话 我的输入表如下所示: new_host sequence expression FALSE AQVPYGVS- 0.039267878 FALSE ASVPYGVSI 0.039267878 F

我对使用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
所需输出(不确定这是否可行)


根据我的理解,你需要找到每个字符串与所有字符串的距离。但是,如果序列长度为
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.]]

根据我的理解,你需要找到每个字符串与所有字符串的距离。但是,如果序列长度为
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.]]

交叉发布:@Pierre如前所述我从上一个论坛中删除了,我认为这不会是一个问题,因为我认为他们是完全不同的两个论坛。交叉发布:@Pierre如前所述我从上一个论坛中删除了,我认为这不会是一个问题,因为我认为他们是完全不同的两个论坛。嘿!感谢您的跟进,基本上我很好奇我是否能得到上面提到的输出,尽管这很好。请看我的新问题。请看上面提到的,只有当你从一个伪序列计算每个序列距离时才能完成。对于我的答案,你需要两列
seq_1
seq_2
,因为它们是矩阵索引并给出它们的Levenshtein距离。你可以把矩阵展平,得到想要的结果。嘿!感谢您的跟进,基本上我很好奇我是否能得到上面提到的输出,尽管这很好。请看我的新问题。请看上面提到的,只有当你从一个伪序列计算每个序列距离时才能完成。对于我的答案,你需要两列
seq_1
seq_2
,因为它们是矩阵索引并给出它们的Levenshtein距离。您可以展平矩阵并获得所需的结果。