2024-04-26 05:20:01 发布
网友
我有100万个3d点要传递给numpy.linalg.svd,但它很快就用完了内存。有没有办法把这个操作分解成更小的块?在
numpy.linalg.svd
我不知道它在做什么,但是我应该只传递代表3x3,4x4矩阵的数组吗?因为我在网上看到过它的用法,他们传递任意数量元素的数组。在
如果你的例子中有一个MxN,1000000x3矩阵numpy.linalg.svd不需要M==N。实际上,这正是SVD可以用来计算秩和伪逆的地方。方法如利纳格投资公司需要一个正方形(和满秩)矩阵才能有一个定义的结果。在
@Saullo Castro说得对。full_matrix=False会变得难以处理,因为U矩阵不是1Mx1M元素,而是1Mx3,这是一个巨大的节省。我不确定numpy使用的是哪种简化SVD算法(我认为它可能是Compact SVD,或thin):wikipedia上的reduced SVD部分中的http://en.wikipedia.org/wiki/Singular_value_decomposition对3种广泛使用的算法进行了简要描述。它们都围绕着将全U矩阵的计算简化为一种简化形式,这对于某些问题,甚至许多问题来说,已经足够了。当NumberServations>;>numberFeatures时,节省最多
关于你是否得到同样的结果。简短的回答可以是肯定的,这取决于您将如何处理SVD结果。例如,您将得到与原始矩阵相同的矩阵(回到浮点公差级别),如下面的代码所示。注意,在最上面的情况下,U的大小是numberObservations x numberObservations,而在full_matrix=False中,U的大小是numberrobservations x numberFeatures
此代码改编自numpy.linalg.svd公司doc允许用户试验任意行/列,选择单数值。在
我们总是可以将U矩阵的大小缩小到mx min(M,N)。根据数据的结构和存在的噪声量,可能会进一步减少。只是因为numpy.isclose公司is false并不意味着计算出的SV对所有上下文都是有害的。您可以使用mostSignificantSingularValues变量对此进行实验,该变量从完整的SVD中获取顶部SV。在
mostSignificantSingularValues
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的func。在
scipy.linalg.svd
如果你的例子中有一个MxN,1000000x3矩阵
numpy.linalg.svd
不需要M==N。实际上,这正是SVD可以用来计算秩和伪逆的地方。方法如利纳格投资公司需要一个正方形(和满秩)矩阵才能有一个定义的结果。在@Saullo Castro说得对。full_matrix=False会变得难以处理,因为U矩阵不是1Mx1M元素,而是1Mx3,这是一个巨大的节省。我不确定numpy使用的是哪种简化SVD算法(我认为它可能是Compact SVD,或thin):wikipedia上的reduced SVD部分中的http://en.wikipedia.org/wiki/Singular_value_decomposition对3种广泛使用的算法进行了简要描述。它们都围绕着将全U矩阵的计算简化为一种简化形式,这对于某些问题,甚至许多问题来说,已经足够了。当NumberServations>;>numberFeatures时,节省最多
关于你是否得到同样的结果。简短的回答可以是肯定的,这取决于您将如何处理SVD结果。例如,您将得到与原始矩阵相同的矩阵(回到浮点公差级别),如下面的代码所示。注意,在最上面的情况下,U的大小是numberObservations x numberObservations,而在full_matrix=False中,U的大小是numberrobservations x numberFeatures
此代码改编自numpy.linalg.svd公司doc允许用户试验任意行/列,选择单数值。在
我们总是可以将U矩阵的大小缩小到mx min(M,N)。根据数据的结构和存在的噪声量,可能会进一步减少。只是因为numpy.isclose公司is false并不意味着计算出的SV对所有上下文都是有害的。您可以使用
mostSignificantSingularValues
变量对此进行实验,该变量从完整的SVD中获取顶部SV。在尝试使用
scipy.linalg.svd
而不是numpy的func。在相关问题 更多 >
编程相关推荐