稀疏矩阵乘法仅计算上三角

时间:2016-02-26 09:34:14

标签: python numpy matrix scipy scikit-learn

我正在做一些关于重复数据删除字符串的事情。 我的主要工作流程是:

df = pd.read_csv(some_path)
vect = TfidfVectorizer(min_df=1)
tfidf = vect.fit_transform(df.title.astype(unicode))

sml_matrix = (tfidf * tfidf.T)
sml_matrix = sml_matrix> similar_ratio

sml_matrix就像:

       │CHEESE CHORES GEESE  GLOVES
───────┼───────────────────────────
CHEESE │    1   0.222  0.177  0.444     
CHORES │0.222       1  0.422  0.333
GEESE  │0.177   0.422      1  0.300
GLOVES │0.444   0.333  0.300      1

显然,计算sml_matrix的上三角就足够了。

但是我不知道如何只用scipy.sparse矩阵计算上三角形。(只有我可以想象的forloop,但似乎效率不高)

for循环示例(只是伪代码):

A = tfidf
T = tfidf.T
side_length = len(A)

for i in range(side_length):
    for j in range(side_length):
        if j < i:
            # avoid calculate lower triangle and diagonal
            continue
        maxtrix[i,j] = A(i)* T(j)

来自here,我看到numpy只有np.apply_along_axis(d, 0, _)来计算上三角形,但scipy.sparse没有。

更新

无论一个大的数据集是多少,只计算上三角形会花费更少的cpu资源。我不熟悉矩阵计算,好奇心让我问这个问题(如何只计算稀疏矩阵中的上三角形),而不是用于解决内存错误。

1 个答案:

答案 0 :(得分:1)

可能你可以通过一些技巧赢得2内存因素,但数据大小总是增长......

因此,最好忍受这种情况并将Dataframe拆分成块。 你可以这样做:

df=pd.DataFrame(np.random.rand(12)) # as a mini exemple
maxsize=4
df['group']=df.index//maxsize
df.set_index('group',append=True,inplace=True)
df2=df.reorder_levels([1,0])

from itertools import combinations

print(df)
for i,j in (combinations(df2.index.levels[0],2)):
    print (df2.loc[[i,j]])
    #or do something else. 

然后df是:

                  0
    group          
0   0      0.388695
1   0      0.982780
2   0      0.632253
3   0      0.445638
4   1      0.346920
5   1      0.789327
6   1      0.311657
7   1      0.548581
8   2      0.688201
9   2      0.824547
10  2      0.980281
11  2      0.314968

大块是:

                  0
group           
0     0    0.388695
      1    0.982780
      2    0.632253
      3    0.445638
1     4    0.346920
      5    0.789327
      6    0.311657
      7    0.548581
                  0
group           
0     0    0.388695
      1    0.982780
      2    0.632253
      3    0.445638
2     8    0.688201
      9    0.824547
      10   0.980281
      11   0.314968
                  0
group           
1     4    0.346920
      5    0.789327
      6    0.311657
      7    0.548581
2     8    0.688201
      9    0.824547
      10   0.980281
      11   0.314968

然后计算并收集每个块上的好东西。 你会做两次计算,但没有更多的内存错误。