numpy 如何在python中使用1xn矩阵运行SVD?

mftmpeh8  于 5个月前  发布在  Python
关注(0)|答案(1)|浏览(76)

所以我想在我的数据集上运行一个算法,第一步是奇异值分解(SVD)。我是基于我在一本书上找到的一个例子,他们使用MatLab并在这个维度为1xn的时间序列上运行SVD。然而,当我试图在python中使用numpy.linalg.svd运行它时,这个错误总是出现,矩阵需要至少有2xn维度。
所以我的问题是:我怎样才能运行SVD与1 × n矩阵(或向量)没有得到这个错误?有人有一个想法吗?这将是非常apreciated:)
现在我知道我可以对这个数据矩阵进行时间堆叠,但我首先想在不执行这一步的情况下运行它,看看我会得到什么样的特征值(我知道它们不能准确地描述我的数据,但我仍然想看看到底是怎么回事)。

qrjkbowd

qrjkbowd1#

在MATLAB中,一切都是二维的(或更多)。在numpy中,数组可能是一维的。在将MATLAB示例应用于numpy时请记住这一点。
这个错误总是导致矩阵需要具有至少2 × N维。
2xn dimension到底是什么意思?对于大多数numpy用户来说,它意味着(2,n)的形状,而不是(1,n)或(n,)。
当问SO问题时,最好包括实际代码,并准确引用错误。
当我在一个3元素列表上使用svd时,它变成了一个(3,)数组:

In [27]: np.linalg.svd([1,2,3])
---------------------------------------------------------------------------
LinAlgError                               Traceback (most recent call last)
Cell In[27], line 1
----> 1 np.linalg.svd([1,2,3])

File <__array_function__ internals>:200, in svd(*args, **kwargs)

File ~\miniconda3\lib\site-packages\numpy\linalg\linalg.py:1623, in svd(a, full_matrices, compute_uv, hermitian)
   1620         s = abs(s)
   1621         return sort(s)[..., ::-1]
-> 1623 _assert_stacked_2d(a)
   1624 t, result_t = _commonType(a)
   1626 extobj = get_linalg_error_extobj(_raise_linalgerror_svd_nonconvergence)

File ~\miniconda3\lib\site-packages\numpy\linalg\linalg.py:183, in _assert_stacked_2d(*arrays)
    181 for a in arrays:
    182     if a.ndim < 2:
--> 183         raise LinAlgError('%d-dimensional array given. Array must be '
    184                 'at least two-dimensional' % a.ndim)

LinAlgError: 1-dimensional array given. Array must be at least two-dimensional

字符串
“2xn dimension”是对这个错误的错误解释。
有一个(1,3)参数:

In [28]: np.linalg.svd([[1,2,3]])
Out[28]: 
(array([[-1.]]),
 array([3.74165739]),
 array([[-0.26726124, -0.53452248, -0.80178373],
        [-0.53452248,  0.77454192, -0.33818712],
        [-0.80178373, -0.33818712,  0.49271932]]))


a(3,1):

In [29]: np.linalg.svd([[1],[2],[3]])
Out[29]: 
(array([[ 0.26726124, -0.53452248, -0.80178373],
        [ 0.53452248,  0.77454192, -0.33818712],
        [ 0.80178373, -0.33818712,  0.49271932]]),
 array([3.74165739]),
 array([[1.]]))


如果你已经有一个一维数组,arr[:,None]arr.reshape(-1,1)将把它变成(n,1)形状。

相关问题