如何从带有特征列表字符串的 tsv 到 python 中的 csr 矩阵?
How to go from a tsv with feature list strings to a csr matrix in python?
我一直在使用一些 R
包来计算来自稀疏二进制矩阵的(余弦)(稀疏)相似度矩阵,例如proxyC
.
因为我现在也开始(和学习)使用 python
,并且有人告诉我它甚至可能更快,所以我想尝试 运行 那里的相同计算。
我觉得这很有趣 post:
What's the fastest way in Python to calculate cosine similarity given sparse matrix data?
描述了一些方法。
我自己手写了一个小的测试矩阵后,确实尝试了其中的一些。
现在我想尝试 'real' 数据。
这就是我遇到的一个我目前无法解决的问题。
我的数据来自 tsv 文件,这些文件将对象 (ID) 与逗号分隔的特征列表 (FP) 相关联。例如:
ID FP
1 A,B,C
2 A,D
3 C,D,F
4 A,F
5 E,H,M
我需要将其转换为稀疏二进制矩阵。
即使在 R 中,我也花了一些时间来找出最好的方法。
我首先 strsplit
FP
以逗号列出,将 FP
列从字符向量转换为字符向量列表。然后我 unlist
FP
,重复每个 ID
与 FP
向量的 lengths
一样多的次数,这给了我这个:
ID FP
1 A
1 B
1 C
2 A
2 D
3 C
3 D
3 F
4 A
4 F
5 E
5 H
5 M
然后我通过 xtabs
:
制作稀疏二进制特征矩阵
5 x 8 sparse Matrix of class "dgCMatrix"
FP
ID A B C D E F H M
1 1 1 1 . . . . .
2 1 . . 1 . . . .
3 . . 1 1 . 1 . .
4 1 . . . . 1 . .
5 . . . . 1 . 1 1
我确信可以在 python
中执行此操作(在这种情况下,从 tsv 文件到 csr 矩阵,就像我链接的 post 中一样),但我仍然一个初学者,我怀疑我需要很长时间才能弄清楚所有细节并正确处理。
任何人都可以帮助/指出 posts 描述必要的步骤和示例吗?
谢谢!
import pandas as pd
df = pd.DataFrame({'ID':[1,2,3], 'FP':["A,B,C","A,D","C,D,F"]})
>>> df
ID FP
0 1 A,B,C
1 2 A,D
2 3 C,D,F
拆分列并将其展开为长table
df['FP'] = df['FP'].str.split(",")
df = df.explode(column="FP")
>>> df
ID FP
0 1 A
0 1 B
0 1 C
1 2 A
1 2 D
2 3 C
2 3 D
2 3 F
对分类列进行编码
df['FP'] = df['FP'].astype('category')
写成稀疏矩阵:
from scipy.sparse import csr_matrix
import numpy as np
mat = csr_matrix((np.ones(df.shape[0]), (df['ID'], df['FP'].cat.codes)))
>>> mat.A
array([[0., 0., 0., 0., 0.],
[1., 1., 1., 0., 0.],
[1., 0., 0., 1., 0.],
[0., 0., 1., 1., 1.]])
确保跟踪哪些列是哪些分类级别。如果您愿意,也可以对 ID
列进行编码(如果它们不是 0 索引整数,这可能是个好主意)。
df['ID'] = df['ID'].astype('category')
mat = csr_matrix((np.ones(df.shape[0]), (df['ID'].cat.codes, df['FP'].cat.codes)))
>>> mat.A
array([[1., 1., 1., 0., 0.],
[1., 0., 0., 1., 0.],
[0., 0., 1., 1., 1.]])
同样,跟踪您的分类水平。
我一直在使用一些 R
包来计算来自稀疏二进制矩阵的(余弦)(稀疏)相似度矩阵,例如proxyC
.
因为我现在也开始(和学习)使用 python
,并且有人告诉我它甚至可能更快,所以我想尝试 运行 那里的相同计算。
我觉得这很有趣 post:
What's the fastest way in Python to calculate cosine similarity given sparse matrix data?
描述了一些方法。
我自己手写了一个小的测试矩阵后,确实尝试了其中的一些。
现在我想尝试 'real' 数据。
这就是我遇到的一个我目前无法解决的问题。
我的数据来自 tsv 文件,这些文件将对象 (ID) 与逗号分隔的特征列表 (FP) 相关联。例如:
ID FP
1 A,B,C
2 A,D
3 C,D,F
4 A,F
5 E,H,M
我需要将其转换为稀疏二进制矩阵。
即使在 R 中,我也花了一些时间来找出最好的方法。
我首先 strsplit
FP
以逗号列出,将 FP
列从字符向量转换为字符向量列表。然后我 unlist
FP
,重复每个 ID
与 FP
向量的 lengths
一样多的次数,这给了我这个:
ID FP
1 A
1 B
1 C
2 A
2 D
3 C
3 D
3 F
4 A
4 F
5 E
5 H
5 M
然后我通过 xtabs
:
5 x 8 sparse Matrix of class "dgCMatrix"
FP
ID A B C D E F H M
1 1 1 1 . . . . .
2 1 . . 1 . . . .
3 . . 1 1 . 1 . .
4 1 . . . . 1 . .
5 . . . . 1 . 1 1
我确信可以在 python
中执行此操作(在这种情况下,从 tsv 文件到 csr 矩阵,就像我链接的 post 中一样),但我仍然一个初学者,我怀疑我需要很长时间才能弄清楚所有细节并正确处理。
任何人都可以帮助/指出 posts 描述必要的步骤和示例吗?
谢谢!
import pandas as pd
df = pd.DataFrame({'ID':[1,2,3], 'FP':["A,B,C","A,D","C,D,F"]})
>>> df
ID FP
0 1 A,B,C
1 2 A,D
2 3 C,D,F
拆分列并将其展开为长table
df['FP'] = df['FP'].str.split(",")
df = df.explode(column="FP")
>>> df
ID FP
0 1 A
0 1 B
0 1 C
1 2 A
1 2 D
2 3 C
2 3 D
2 3 F
对分类列进行编码
df['FP'] = df['FP'].astype('category')
写成稀疏矩阵:
from scipy.sparse import csr_matrix
import numpy as np
mat = csr_matrix((np.ones(df.shape[0]), (df['ID'], df['FP'].cat.codes)))
>>> mat.A
array([[0., 0., 0., 0., 0.],
[1., 1., 1., 0., 0.],
[1., 0., 0., 1., 0.],
[0., 0., 1., 1., 1.]])
确保跟踪哪些列是哪些分类级别。如果您愿意,也可以对 ID
列进行编码(如果它们不是 0 索引整数,这可能是个好主意)。
df['ID'] = df['ID'].astype('category')
mat = csr_matrix((np.ones(df.shape[0]), (df['ID'].cat.codes, df['FP'].cat.codes)))
>>> mat.A
array([[1., 1., 1., 0., 0.],
[1., 0., 0., 1., 0.],
[0., 0., 1., 1., 1.]])
同样,跟踪您的分类水平。