【问题标题】:Solve non-negative least squares p‌r‌o‌b‌l‌e‌m "xA=b" [duplicate]求解非负最小二乘 p‌r‌o‌b‌l‌e‌m "xA=b" [重复]
【发布时间】:2017-11-22 14:49:40
【问题描述】:

我想找到“xA=b”的非负最小二乘解。我很高兴能在 Python、Matlab 或 R 中找到答案。

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

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

nnlslsqnonneg 仅用于Ax=b

我对@9​​87654329@ 的实现给了我一个错误:

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 行 execfile(文件名,命名空间)

文件“C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py”,第 89 行,在 execfile 中 exec(编译(f.read(),文件名,'exec'),命名空间)

文件“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 raise ValueError("x0 最多只能有 1 个维度。")

ValueError:x0 最多只能有 1 个维度。

【问题讨论】:

  • 在副本中看到:x*A=bA^T*x^T=b^T 相同
  • @AnderBiguri,需要注意的是,它可以在 Matlab 中非常容易地完成,而无需任何方程转换? Matlab 可能只是在内部为您处理这一步......
  • @Wolfie 是的,它很有用,你的答案很好,你应该把它留在那里。我自己使用mldivide 已经很久了,但根据文档,它确实解决了x*A=b。我认为它总能解决这个问题,但我们从不查看输出的形状(我们得到 1x20 而不是 20x1,我们根本不在乎!)
  • @Wolfie 这里不能预乘A,因为A是6*10矩阵,b是8192*10矩阵。所以我预乘b.T,。 > A=y.T > b=spec.T > new_A=b.T > new_b=new_Abnp.linalg.pinv(A)
  • @user24067,是的,我删除了该评论。对于方程变换,请参阅安德的评论和重复的问题。如需快速解决方案,请参阅我的答案。

标签: python r matlab math least-squares


【解决方案1】:

这是一个常见的矩阵问题,您可以使用 mrdivide 在 Matlab 中的一个字符中完成。

来自文档:

mrdivide, /:求解线性方程组xA = B for x

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

【讨论】:

  • 但解不是非负的
  • 那么您的输入不会产生非负解?如果不满足您的方程,您不能强制解为正数!给出一个较小的输入示例和您预期的输出,以及使用上述方法无法实现的原因。
  • 函数是超定的,“那么 X = A\B 是方程 AX = B 的欠定或超定系统的最小二乘解。”现在我需要“非负最小平方”而不是“最小二乘”。这不可能吗?
猜你喜欢
  • 2014-12-23
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多