2017-06-20 148 views
0

我想找到「xA = b」的非負最小二乘解。我很高興在Python,Matlab或R中得到答案。求解非負最小二乘問題「xA = b」

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) 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.

+0

如在重複看出:'X * A = B'相同'甲^ T * X^T = B^T' –

+1

@AnderBiguri ,注意到它可以很容易地在Matlab中完成而沒有任何方程轉換,這很有用嗎? Matlab可能只是爲你在內部照顧這一步... – Wolfie

+0

@Wolfie是的,它是有用的,你的答案是好的,你應該離開它。自從我自己使用'mldivide'以來一直很久,但根據文檔它確實解決了'x * A = b'。我認爲它總是能解決這個問題,但我們從來沒有看過輸出的形狀(我們得到的是1x20而不是20x1,我們不在乎!) –

回答

1

這是這樣一個共同的矩陣問題,你可以使用mrdivide做在一個字符在Matlab。

從文檔:

mrdivide , / : Solve systems of linear equations xA = B for x

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

但解決方案並非非負面 – user24067

+0

那麼您的輸入不會產生非負面解決方案?如果不能滿足您的等式,您不能強制解決方案是正面的!給出一個較小的輸入例子,你期望的結果,以及爲什麼沒有使用上述方法來實現。 – Wolfie

+0

函數超定「,那麼X = A \ B是方程AX = B的欠方程或超定方程最小二乘方解。」現在我需要「非負最小二乘」而不是「最小二乘「這是不可能的? – user24067