Python 求解非负最小二乘p;r;o;b&x200C;l;e&x200C;m";xA=b";
我想找到“xA=b”的非负最小二乘解。我很高兴答案是Python、Matlab或RPython 求解非负最小二乘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
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的最小二乘意义上的解。”现在我需要“非负最小二乘”而不是“最小二乘”。这不可能吗?