2017-06-20 6 views
0

"xA = b"の非負最小二乗解を求めたい。私はPython、MatlabまたはRの答えがうれしいです非負最小二乗問題を解く "xA = b"

Aは6 * 10の行列で、bは8192 * 10の行列です。

Pythonではleast_squaresnnls、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.

+0

重複に見られるように:ドキュメントから

'X * A = B'が 'A^T * X^T = B^T' –

+1

@AnderBiguriと同じですMatlabでは式の変換を行わなくても簡単に行えることに注意してください。 Matlabはおそらくあなたのためにそのステップを世話してくれるでしょう... – Wolfie

+0

@Wolfieはいそれは役に立ちます、あなたの答えは良いです、あなたはそこに残すべきです。私は 'mldivide'を自分で使って以来ずっとずっと続けていましたが、ドキュメントによれば' x * A = b'は解決しています。私は常にそれを解決すると仮定しますが、出力の形を決して見ません(20x1の代わりに1x20を得て、気にしません!) –

答えて

1

これは、あなたがmrdivideを使用して、MATLABで1つの文字でそれを行うことができ、このような一般的な行列の問題です。

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

関連する問題