gpt4 book ai didi

python - 获取 numpy 稀疏矩阵行的范数

转载 作者:太空狗 更新时间:2023-10-30 00:29:57 25 4
gpt4 key购买 nike

我有一个通过使用 Sklearn 的 TfidfVectorizer 对象获得的稀疏矩阵:

vect = TfidfVectorizer(sublinear_tf=True, max_df=0.5, analyzer='word', vocabulary=my_vocab, stop_words='english')
tfidf = vect.fit_transform([my_docs])

稀疏矩阵是(为了一般性,去掉了数字):

<sparse matrix of type '<type 'numpy.float64'>'
with stored elements in Compressed Sparse Row format>]

我正在尝试为每一行获取一个数值,以告诉我文档中包含我正在查找的术语的高度。我真的不在乎它包含哪些单词,我只想知道它包含多少个单词。所以我想得到每个或 row*row.T 的范数。但是,我很难使用 numpy 来获得它。

我的第一个方法是简单地做:

tfidf[i] * numpy.transpose(tfidf[i])

但是,numpy 显然不会转置小于一维的数组,因此只会对向量进行平方。所以我尝试这样做:

tfidf[i] * numpy.transpose(numpy.atleast_2d(tfidf[0]))

但是 numpy.transpose(numpy.atleast_2d(tfidf[0])) 仍然不会转置该行。

我继续尝试获取行的规范(无论如何这种方法可能更好)。我最初的方法是使用 numpy.linalg。

numpy.linalg.norm(tfidf[0])

但这给了我一个“维度不匹配”的错误。所以我试着手动计算范数。我首先设置一个等于稀疏矩阵的 numpy 数组版本的变量并打印出第一行的 len:

my_array = numpy.array(tfidf)
print my_array
print len(my_array[0])

它正确地打印出 my_array,但是当我尝试访问 len 时它告诉我:

IndexError: 0-d arrays can't be indexed

我只是想获取 fit_transform 返回的稀疏矩阵中每一行的数值。获得规范将是最好的。非常感谢此处的任何帮助。

最佳答案

一些简单的假数据:

a = np.arange(9.).reshape(3,3)
s = sparse.csr_matrix(a)

要从稀疏中获取每一行的范数,您可以使用:

np.sqrt(s.multiply(s).sum(1))

并且重新规范化的 s 将是

s.multiply(1/np.sqrt(s.multiply(s).sum(1)))

或者在重新归一化之前保持稀疏:

s.multiply(sparse.csr_matrix(1/np.sqrt(s.multiply(s).sum(1))))

要从中获取普通矩阵或数组,请使用:

m = s.todense()
a = s.toarray()

如果你有足够的内存用于密集版本,你可以通过以下方式获得每一行的范数:

n = np.sqrt(np.einsum('ij,ij->i',a,a))

n = np.apply_along_axis(np.linalg.norm, 1, a)

要归一化,你可以这样做

an = a / n[:, None]

或者,就地规范化原始数组:

a /= n[:, None]

[:, None] 基本上将 n 转换为垂直数组。

关于python - 获取 numpy 稀疏矩阵行的范数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20168881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com