2017-02-10 88 views
0

我有一個中號通過W¯¯頻率矩陣doc_word_freqs表示倍字的數w出現在文檔在SciPy的CSR矩陣。我也有一個W維矢量z_scores與一些值與每個單詞相關聯(在我的具體情況下,一個語料庫的兩個子集之間的每個單詞的對數比率的z-分數,但這與問題沒有密切關係)。創建「虛擬」 numpy的從SciPy的頻率矩陣和值數組陣列

我想計算每個文檔的一組z值的一些度量(在這種情況下,方差)。也就是說,這樣的:

np.var(doc_z_scores, axis=1) 

其中doc_z_scores中號行,每行包含在文件 z分數爲每個單詞的列表。這是我現在有,但它是相當不雅的速度很慢:

docs = [[]] * doc_word_freqs.shape[0] # Make a list of M empty lists 

for m, w in zip(*doc_word_freqs.nonzero()): 
    # For each non-zero index in doc_word_freqs, append the 
    # the z-score of that word the appropriate number of times 
    for _ in range(doc_word_freqs[m, w]): 
     docs[m].append(word_z_scores[w]) 

# Calculate the variance of each of the resulting lists and return 
return np.array([np.var(m) for m in docs]) 

是否有某種方式來做到這一點,而不實際創建差異(或任何其他措施可能是)的陣列?

+0

我能夠通過細分方差計算來優化事物,並且僅爲每個文檔字對(僅限非零頻率的對)計算'abs(z_score - doc_mean)** 2'一次。這大大加快了速度,但我仍然很想知道是否有辦法做到這一點,而不需要預先了解未來的操作。 – err1100

回答

1

我不是100%確定我正確理解你的問題。你可以使用矩陣向量乘法:

weight = (doc_word_freqs @ np.ones_like(word_z_scores)).A.ravel() 
mean = (doc_word_freqs @ word_z_scores).A.ravel()/weight 
raw_2nd = (doc_word_freqs @ (word_z_scores**2)).A.ravel() 
variance = raw_2nd/weight - mean**2 

對於「平常心」分散使用-1在適當情況下。

+0

這正是我所期待的。謝謝,保羅。 – err1100