这个问题在这里已有答案:
我想找到“xA = b”的非负最小二乘解 . 我很高兴获得Python,Matlab或R的答案 .
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(最近一次调用最后一次):文件“”,行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(filename,namespace)文件”C:\ Anaconda3 \ lib \ site-packages \ spyderlib \ widgets \ externalshell \ sitecustomize.py“,第89行,在execfile exec中(编译(f) .read(),filename,'exec'),namespace)文件“C:/Users/Documents/lsq.py”,第30行,在np.ones((8192,6))* np.inf]))文件“C:\ Anaconda3 \ lib \ site-packages \ scipy \ optimize_lsq \ least_squares.py”,第742行,in least_squares引发ValueError(“x0必须最多有1个维度 . ”)ValueError:x0必须至多有1个维度 .
1 回答
这是一个常见的矩阵问题,您可以使用mrdivide在Matlab中的一个字符中执行此操作 .
来自文档: