我有 M W 频率矩阵doc_word_freqs
表示 w 字出现在文档中的次数m 在一个scipy CSR矩阵中。我还有一个 W - 维向量z_scores
,其中一些值与每个单词相关联(在我的特定情况下,每个单词的两个子集之间的对数比率的z得分) ,但这与问题没有密切关系。)
我想计算每个文档的z分数集的一些度量(在这种情况下,方差)。就是这样:
np.var(doc_z_scores, axis=1)
其中doc_z_scores
有 M 行,每行包含文档 m 中每个单词的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 :(得分:1)
我不是100%确定我正确理解你的问题。你可以使用矩阵向量乘法:
conf
对于“无偏见”的方差,请在适当的时候使用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
。