解决非负最小二乘问题“xA = b”

时间:2017-06-20 07:32:20

标签: python r matlab math least-squares

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

A是一个6 * 10矩阵,b是8192 * 10矩阵。

我发现了一些函数:Python中的least_squaresnnls以及Matlab中的lsqnonneg

nnlslsqnonneg仅用于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)   回溯(最近一次调用最后一次):

     

文件“”,第1行,in       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(compile(f.read(),filename,'e​​xec'),namespace)

     

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

     

文件“C:\ Anaconda3 \ lib \ site-packages \ scipy \ optimize_lsq \ least_squares.py”,第742行,至少_squares      提高ValueError(“x0必须最多有1个维度。”)

     

ValueError:x0最多必须包含1个维度。

1 个答案:

答案 0 :(得分:1)

这是一个常见的矩阵问题,您可以使用mrdivide在Matlab中的一个字符中执行此操作。

来自文档:

  

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

% Option 1, shorthand:
x = B/A;
% Option 2, longhand:
x = mrdivide(B,A);