我有 100 万个 3d 点要传递给numpy.linalg.svd
但它很快就会耗尽内存。有没有办法将此操作分解为更小的块?
我不知道它在做什么,但我只应该传递代表 3x3、4x4 矩阵的数组吗?因为我在网上看到过它的使用,他们传递具有任意数量元素的数组。
如果你有一个 MxN 在你的例子中 1000000x3 矩阵numpy.linalg.svd
不需要 M==N。 事实上,这正是 SVD 可以用于计算秩和伪逆等内容的地方。 linalg.inv 等方法需要一个平方(和全秩)矩阵才能获得定义的结果。
@Saullo卡斯特罗是对的。 full_matrices=False 可以变得难以处理,因为 U 矩阵不是 1Mx1M 元素,而是 1Mx3,可以节省大量资金。 我不确定numpy使用哪种简化的SVD算法(我认为可能是紧凑型SVD,或薄):维基百科上简要描述了3种广泛使用的算法:http://en.wikipedia.org/wiki/Singular_value_decomposition 在减少的SVD部分中。 它们都围绕着将整个 U 矩阵的计算简化为简化形式,这对于一些甚至许多问题来说已经足够了。 当数字观察>>数字功能时,节省最多
关于你是否得到相同的结果。简短的回答可能是肯定的,具体取决于您将如何处理 SVD 结果。 例如,您将以与原始矩阵相同的简化形式返回相同的矩阵(到浮点容差级别),如下面的代码所示。 请注意,在顶部情况下,U 的大小是 numberObservation x numberObservations,而在 full_matrices=False 中,U 的大小是 numberObservation x numberFeatures
这段代码改编自numpy.linalg.svd文档,允许人们尝试任意行/列,选择奇异值。
人们总是可以将 U 矩阵的大小减小到 M x min(M,N)。 根据数据的结构和存在的噪声量,可能会进一步减少。 仅仅因为numpy.isclose是假的并不意味着计算的SV对所有上下文都是不利的。 您可以使用 mostSignificantSingularValues
变量进行试验,该变量从完整的 SVD 中获取顶部 SV。
numberObservations = 900
numberFeatures = 600
mostSignificantSingularValues = 600
a = np.random.randn( numberObservations, numberFeatures) + 1j*np.random.randn(numberObservations, numberFeatures)
#Reconstruction based on full SVD:
U, s, V = np.linalg.svd(a, full_matrices=True)
print(U.shape, V.shape, s.shape)
S = np.zeros((numberObservations, numberFeatures), dtype=complex)
S[:mostSignificantSingularValues, :mostSignificantSingularValues] = np.diag(s[:mostSignificantSingularValues])
print(np.allclose(a, np.dot(U, np.dot(S, V))))
d1 = a - np.dot(U, np.dot(S, V))#
#True
#Reconstruction based on reduced SVD:
U, s, V = np.linalg.svd(a, full_matrices=False)
print(U.shape, V.shape, s.shape)
S = np.diag(s)
print(np.allclose(a, np.dot(U, np.dot(S, V))))
d2 = a - np.dot(U, np.dot(S, V))#
尝试使用 scipy.linalg.svd
而不是 numpy 的函数。