Python SciPy:使用b向量数组的元素非负最小二乘法
我需要解决线性问题Python SciPy:使用b向量数组的元素非负最小二乘法,python,arrays,numpy,scipy,least-squares,Python,Arrays,Numpy,Scipy,Least Squares,我需要解决线性问题Ax=b,使用最小二乘法获得x。x的所有元素必须是非负的,因此我使用的是scipy.optimize.nnls(文档) 问题是,我需要用一个a矩阵和许多b向量多次解决这个问题。我有一个3dnumpy ndarray,其中沿轴0的向量是b向量,而其他两个轴对应于空间中的点。我希望将所有x向量输出到相应的数组中,以便保留每个答案的空间信息 问题的第一步如下所示: A = np.random.rand(5,3) b_array = B = np.random.rand(5,100,1
Ax=b
,使用最小二乘法获得x
。x
的所有元素必须是非负的,因此我使用的是scipy.optimize.nnls
(文档)
问题是,我需要用一个a
矩阵和许多b
向量多次解决这个问题。我有一个3dnumpy ndarray
,其中沿轴0
的向量是b
向量,而其他两个轴对应于空间中的点。我希望将所有x
向量输出到相应的数组中,以便保留每个答案的空间信息
问题的第一步如下所示:
A = np.random.rand(5,3)
b_array = B = np.random.rand(5,100,100)
x_array = np.zeros((3,100,100))
for i in range(100):
for j in range(100):
x_array[:,i,j] = sp.optimize.nnls(A, b_array[:,i,j])[0]
这段代码功能完善,但感觉完全不雅观。更重要的是,它的速度可能会非常慢(我的实际代码使用非常大的数据集,并通过随机参数更改循环数千次,因此效率非常重要)
不久前,我问了关于元素矩阵乘法的问题。我被介绍到
np.einsum
,它在许多情况下都非常有用。我曾希望最小二乘解也会有类似的函数,但一直找不到任何东西。如果有人知道一个可能工作的函数,或者一个有效/pythonical解决这个问题的替代方法,那将不胜感激 NNLS没有一个封闭形式的解决方案,除了为设计矩阵共享内存外,在一起处理问题时没有算法加速。尽管将多目标功能下推到C级别可能会导致一些加速,但scipy实现似乎一次只支持一个目标,因此循环看起来是这里的唯一选项。问题是令人尴尬的并行,因此您可以使用例如joblib
来并行化循环,如下所示
from joblib import Parallel, delayed
from itertools import product
from scipy.optimize import nnls
results = Parallel(n_jobs=10)(delayed(nnls)(A, b_array[:,i,j])[0]
for i, j in product(range(100), range(100)))
x_array = np.array(results).reshape(100, 100, -1).transpose(2, 0, 1)
但是,如果您使用岭回归或OLS(在您的情况下可能没有用处),那么解决方案是封闭形式的,可以通过矩阵乘法获得,所有事情都可以在一次重塑和矩阵乘法中完成,将问题的多目标方面推到C级处理。是的,我不期望算法加速,但是我希望有一种方法可以让C级的工作更高效——我对语言的这一方面不太了解,所以我总是希望有一些“小技巧”可以让它更快。我很欣赏并行化的建议——我无论如何都需要朝着这个方向前进,所以我会尝试一下。