Python 在knn回归模型中使用levenshtein距离
我对使用KNN回归模型预测蛋白质的稳定性感兴趣,但是我想使用作为蛋白质嵌入计算的levenshtein距离作为模型的输入变量,而不是序列本身。我希望根据每个序列的levenshtein距离,使用k个最近邻的训练误差来衡量每个实例的不一致性 我不希望一个热编码,如果可能的话 我的输入表如下所示: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
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距离。您可以展平矩阵并获得所需的结果。