堆叠两个不同维度的稀疏矩阵

Posted

技术标签:

【中文标题】堆叠两个不同维度的稀疏矩阵【英文标题】:Stacking two sparse matrices with different dimensions 【发布时间】:2017-04-06 07:47:06 【问题描述】:

我有两个稀疏矩阵(由sklearnHashVectorizer 创建,来自两组特征 - 每组对应一个特征)。我想将它们连接起来以便以后将它们用于聚类。但是,我遇到了尺寸问题,因为这两个矩阵没有相同的行尺寸。

这是一个例子:

Xa = [-0.57735027 -0.57735027  0.57735027 -0.57735027 -0.57735027  0.57735027
  0.5         0.5        -0.5         0.5         0.5        -0.5         0.5
  0.5        -0.5         0.5        -0.5         0.5         0.5        -0.5
  0.5         0.5       ]

Xb = [-0.57735027 -0.57735027  0.57735027 -0.57735027  0.57735027  0.57735027
 -0.5         0.5         0.5         0.5        -0.5        -0.5         0.5
 -0.5        -0.5        -0.5         0.5         0.5       ]

XaXb 都是 <class 'scipy.sparse.csr.csr_matrix'> 类型。形状是Xa.shape = (6, 1048576) Xb.shape = (5, 1048576)。我得到的错误是(我现在知道为什么会发生):

    X = hstack((Xa, Xb))
  File "/usr/local/lib/python2.7/site-packages/scipy/sparse/construct.py", line 464, in hstack
    return bmat([blocks], format=format, dtype=dtype)
  File "/usr/local/lib/python2.7/site-packages/scipy/sparse/construct.py", line 581, in bmat
    'row dimensions' % i)
ValueError: blocks[0,:] has incompatible row dimensions

有没有办法堆叠稀疏矩阵,尽管它们的尺寸不规则?也许有一些填充?

我查看了这些帖子:

Concatenate sparse matrices in Python using SciPy/Numpy

Is there an efficient way of concatenating scipy.sparse matrices?.

【问题讨论】:

你能发布你的矩阵 Xa 和 Xb 的形状吗? 用形状更新了帖子。 我想我找到了一个解决方法:使用颠簸连接并将结果转换为 csr_matrix。研究更多,看看这是否可以。 Xc = np.concatenate([Xa.data, Xb.data]) 然后做:sm = sparse.csr_matrix(Xc)。 性能方面这不是一个好主意,您应该尝试始终将矩阵保持为稀疏格式,以免内存不足。你试过我的答案了吗? 尚未尝试。我试图了解正在发生的事情。如果我错了,请纠正我:您正在使用行数较少的矩阵,垂直堆叠使用具有行数差异的自定义矩阵(此处为 4-3 = 1)和列-值相同(Xb.shape[1])。一旦你 vstack 它,生成的矩阵将与另一个矩阵具有相同的维度。我的问题是:这个自定义矩阵你正在 vstacking - 它的内容是什么?它们是零吗? 【参考方案1】:

你可以用一个空的稀疏矩阵来填充它。

您想要水平堆叠它,因此您需要填充较小的矩阵,使其与较大的矩阵具有相同的行数。为此,您垂直堆叠它与形状为(difference in number of rows, number of columns of original matrix) 的矩阵。

像这样:

from scipy.sparse import csr_matrix
from scipy.sparse import hstack
from scipy.sparse import vstack

# Create 2 empty sparse matrix for demo
Xa = csr_matrix((4, 4))
Xb = csr_matrix((3, 5))


diff_n_rows = Xa.shape[0] - Xb.shape[0]

Xb_new = vstack((Xb, csr_matrix((diff_n_rows, Xb.shape[1])))) 
#where diff_n_rows is the difference of the number of rows between Xa and Xb

X = hstack((Xa, Xb_new))
X

结果:

<4x9 sparse matrix of type '<class 'numpy.float64'>'
    with 0 stored elements in COOrdinate format>

【讨论】:

以上是关于堆叠两个不同维度的稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章

python 堆叠稀疏矩阵。

Scipy稀疏矩阵维度问题

将稀疏矩阵块作为稀疏矩阵

如何从 scipy 稀疏块矩阵中取回块?

将稀疏 scipy 矩阵加载到现有的 numpy 密集矩阵中

稀疏矩阵 part 5