Python 求解非负最小二乘p‌;r‌;o‌;b&x200C;l‌;e&x200C;m";xA=b";

Python 求解非负最小二乘p‌;r‌;o‌;b&x200C;l‌;e&x200C;m";xA=b";,python,r,matlab,math,least-squares,Python,R,Matlab,Math,Least Squares,我想找到“xA=b”的非负最小二乘解。我很高兴答案是Python、Matlab或R A是6*10矩阵,b是8192*10矩阵 我在Python中找到了一些函数:least_squares和nnls,在Matlab中找到了lsqnonneg nnls和lsqnonneg仅用于Ax=b 我的最小二乘法实现给我一个错误: import numpy as np import pandas as pd from matplotlib import pyplot as plt from scipy.opt

我想找到“xA=b”的非负最小二乘解。我很高兴答案是Python、Matlab或R

A
是6*10矩阵,
b
是8192*10矩阵

我在Python中找到了一些函数:
least_squares
nnls
,在Matlab中找到了
lsqnonneg

nnls
lsqnonneg
仅用于
Ax=b

我的
最小二乘法实现给我一个错误:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

from scipy.optimize import least_squares

spec=pd.read_csv('spec.csv',sep=',',header=None)
y=pd.read_csv('y.csv',sep=',',header=None)

spec=np.array(spec).T
y=np.array(y)

spec=spec[(0,1,2,3,4,5,6,9),:]
y=y[(0,1,2,3,4,5,6,9),:]

print(spec.shape,y.shape)

def fun(a, x, y):
    return a*x-y

a0=np.ones((8192,6))
a=least_squares(fun, a0, args=(y.T[:,0], spec.T[:,0]),
                           bounds=([np.zeros((8192,6)),
                           np.ones((8192,6))*np.inf]))
runfile('C:/Users/Documents/lsq.py',wdir='C:/Users/Documents') (8, 8192) (8, 6) 回溯(最近一次呼叫最后一次):

文件“”,第1行,在 runfile('C:/Users/wangm/Documents/lsq.py',wdir='C:/Users/Documents')

文件“C:\Anaconda3\lib\site packages\spyderlib\widgets\externalshell\sitecustomize.py”,第714行,在runfile中 execfile(文件名、命名空间)

文件“C:\Anaconda3\lib\site packages\spyderlib\widgets\externalshell\sitecustomize.py”,第89行,在execfile中 exec(编译(f.read(),文件名,'exec'),命名空间)

文件“C:/Users/Documents/lsq.py”,第30行,在 np.ones((8192,6))*np.inf]))

文件“C:\Anaconda3\lib\site packages\scipy\optimize\u lsq\least\u squares.py”,第742行,最小二乘法 raise VALUE ERROR(“x0最多必须有一个维度”)

值错误:
x0
最多只能有一个维度。


这是一个非常常见的矩阵问题,您可以在Matlab中使用一个字符来完成

从文档中:

mrdivide
/
:求解
x的线性方程组
xA=B

%Option 1,速记:
x=B/A;
%备选案文2,直接:
x=mrdivide(B,A);

从副本中可以看出:
x*A=b
A^T*x^T=b^T
@AnderBiguri相同,但值得注意的是,在Matlab中,它可以很容易地完成,而无需任何方程变换?Matlab很可能只是在内部为您完成了这一步…@Wolfie是的,它很有用,您的答案很好,您应该把它放在那里。我很久没有自己使用过
mldivide
,但根据文档,它确实解决了
x*A=b
。我假设它总是能解决这个问题,但我们从不看输出的形状(我们得到的是1x20而不是20x1,我们只是不在乎!)@Wolfie这里不能预乘A,因为A是6*10矩阵,b是8192*10矩阵。所以我预乘b.T,。>A=y.T>b=spec.T>new_A=b.T>new_b=new_Abnp.linalg.pinv(A)@user24067,是的,我删除了那个评论。关于方程变换,请参见Ander的评论和重复问题。要快速解决问题,请参阅我的答案。但解决方案不是非负的。您的输入不会产生非负的解决方案吗?如果不满足你的方程,你不能强迫解为正!给出一个输入和预期输出的较小示例,以及为什么不能使用上述方法实现。函数是超定的,“那么X=a\B是欠定或超定方程组AX=B的最小二乘意义上的解。”现在我需要“非负最小二乘”而不是“最小二乘”。这不可能吗?