我想找到“xA = b”的非负最小二乘解。我很高兴在Python,Matlab或R中得到答案。求解非负最小二乘问题“xA = b”
A
是一个6 * 10矩阵,而b
是8192 * 10矩阵。
我发现了一些函数:Python中的least_squares
和nnls
以及Matlab中的lsqnonneg
。
nnls
和lsqnonneg
仅用于Ax=b
。
我的least_squares
执行给我一个错误:
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) Traceback (most recent call last):
File "", line 1, in runfile('C:/Users/wangm/Documents/lsq.py', wdir='C:/Users/Documents')
File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 714, in runfile execfile(filename, namespace)
File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 89, in execfile exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/Documents/lsq.py", line 30, in np.ones((8192,6))*np.inf]))
File "C:\Anaconda3\lib\site-packages\scipy\optimize_lsq\least_squares.py", line 742, in least_squares raise ValueError("x0 must have at most 1 dimension.")
ValueError:
x0
must have at most 1 dimension.
如在重复看出:'X * A = B'相同'甲^ T * X^T = B^T' –
@AnderBiguri ,注意到它可以很容易地在Matlab中完成而没有任何方程转换,这很有用吗? Matlab可能只是为你在内部照顾这一步... – Wolfie
@Wolfie是的,它是有用的,你的答案是好的,你应该离开它。自从我自己使用'mldivide'以来一直很久,但根据文档它确实解决了'x * A = b'。我认为它总是能解决这个问题,但我们从来没有看过输出的形状(我们得到的是1x20而不是20x1,我们不在乎!) –