如何构建距离或相异矩阵?
How can I construct a distance or dissimilarity matrix?
我有一个df如下:
0 111155555511111116666611111111
1 555555111111111116666611222222
2 221111114444411111111777777777
3 111111116666666661111111111111
.......
1000 114444111111111111555555111111
我正在计算每个字符串之间的距离。例如,要获取前 2 个字符串之间的距离:textdistance.hamming(df[0], df[1])
。这将 return 一个整数。
现在,我想创建一个 df 来存储每个字符串之间的所有距离。在这种情况下,因为我有 1000 个字符串,所以我将有一个 1000 x 1000 df。第一个值是字符串 1 和它本身之间的距离,然后是字符串 1 和字符串 2 等等。然后在下一行它的字符串 2 和字符串 1,字符串 2 和它本身等等。
创建 Series
值的所有组合并在列表中获取 hamming
距离,然后转换为数组并为 DataFrame
整形:
import textdistance
from itertools import product
L = [textdistance.hamming(x, y) for x , y in product(df, repeat=2)]
df = pd.DataFrame(np.array(L).reshape(len(df), len(df)))
print (df)
0 1 2 3 4
0 0 14 24 18 15
1 14 0 24 26 19
2 24 24 0 20 23
3 18 26 20 0 19
4 15 19 23 19 0
编辑:
为了提高性能,请使用 更改 lambda 函数的解决方案:
import numpy as np
from scipy.spatial.distance import pdist, squareform
# prepare 2 dimensional array M x N (M entries (3) with N dimensions (1))
transformed_strings = np.array(df).reshape(-1,1)
# calculate condensed distance matrix by wrapping the hamming distance function
distance_matrix = pdist(transformed_strings,lambda x,y: textdistance.hamming(x[0],y[0]))
# get square matrix
df1 = pd.DataFrame(squareform(distance_matrix), dtype=int)
print (df1)
0 1 2 3 4
0 0 14 24 18 15
1 14 0 24 26 19
2 24 24 0 20 23
3 18 26 20 0 19
4 15 19 23 19 0
我有一个df如下:
0 111155555511111116666611111111
1 555555111111111116666611222222
2 221111114444411111111777777777
3 111111116666666661111111111111
.......
1000 114444111111111111555555111111
我正在计算每个字符串之间的距离。例如,要获取前 2 个字符串之间的距离:textdistance.hamming(df[0], df[1])
。这将 return 一个整数。
现在,我想创建一个 df 来存储每个字符串之间的所有距离。在这种情况下,因为我有 1000 个字符串,所以我将有一个 1000 x 1000 df。第一个值是字符串 1 和它本身之间的距离,然后是字符串 1 和字符串 2 等等。然后在下一行它的字符串 2 和字符串 1,字符串 2 和它本身等等。
创建 Series
值的所有组合并在列表中获取 hamming
距离,然后转换为数组并为 DataFrame
整形:
import textdistance
from itertools import product
L = [textdistance.hamming(x, y) for x , y in product(df, repeat=2)]
df = pd.DataFrame(np.array(L).reshape(len(df), len(df)))
print (df)
0 1 2 3 4
0 0 14 24 18 15
1 14 0 24 26 19
2 24 24 0 20 23
3 18 26 20 0 19
4 15 19 23 19 0
编辑:
为了提高性能,请使用
import numpy as np
from scipy.spatial.distance import pdist, squareform
# prepare 2 dimensional array M x N (M entries (3) with N dimensions (1))
transformed_strings = np.array(df).reshape(-1,1)
# calculate condensed distance matrix by wrapping the hamming distance function
distance_matrix = pdist(transformed_strings,lambda x,y: textdistance.hamming(x[0],y[0]))
# get square matrix
df1 = pd.DataFrame(squareform(distance_matrix), dtype=int)
print (df1)
0 1 2 3 4
0 0 14 24 18 15
1 14 0 24 26 19
2 24 24 0 20 23
3 18 26 20 0 19
4 15 19 23 19 0