Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SciPy:使用b向量数组的元素非负最小二乘法_Python_Arrays_Numpy_Scipy_Least Squares - Fatal编程技术网

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
向量多次解决这个问题。我有一个3d
numpy 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级的工作更高效——我对语言的这一方面不太了解,所以我总是希望有一些“小技巧”可以让它更快。我很欣赏并行化的建议——我无论如何都需要朝着这个方向前进,所以我会尝试一下。