【问题标题】:Non-negative least squares for underdetermined system欠定系统的非负最小二乘法
【发布时间】:2014-03-25 03:15:49
【问题描述】:

考虑以下问题:

查找:x_1, x_2, x_3 > 0 这样

67.5 = 60*x_1 +  90*x_2 + 120*x_3  
60   = 30*x_1 + 120*x_2 +  90*x_3

有没有办法在 Python 中解决这个方程?也许是scipy.nnls()

【问题讨论】:

  • 我认为这是非负最小二乘问题。请给你有价值的cmets
  • 您有三个变量(x_1、x_2 和 x_3),但只有两个方程。就目前而言,它们的解集将等效于由两个方程的平面相交形成的“线”。换句话说,目前有无限多的解决方案。
  • @voithos 是的,它有无限多的解决方案。但我听说仍然发现我们可以使用最小二乘拟合在确定的系统下找到该解决方案。在我的情况下,我需要非负最小二乘解决方案。请参阅stackoverflow.com/questions/16365723/… 以获取参考。谢谢你的评论

标签: python numpy scipy linear-algebra


【解决方案1】:

使用 sympy 符号求解方程组

from sympy import * 

x_1, x_2, x_3 = symbols('x_1 x_2 x_3')

res = solve([Eq(60*x_1+90*x_2+120*x_3, 67.5),
             Eq(30*x_1+120*x_2+90*x_3, 60)],
             [x_1, x_2, x_3])
print res
#{x_1: -1.4*x_3 + 0.6, x_2: -0.4*x_3 + 0.35}

使用scipy.optimize.nnls

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import nnls 

A = np.array([[60, 90, 120], 
              [30, 120, 90]])

b = np.array([67.5, 60])

x, rnorm = nnls(A,b)

print x
#[ 0.          0.17857143  0.42857143]
print rnorm
#0.0

尽管这仅保证了参数为x>=0 的解决方案,因此您可以获得零,就像您在本示例中所做的那样。

【讨论】:

  • 感谢您的建议。但是在这里我必须分析输出以满足非负约束。但我需要这个的下一个高级版本,它会给我一个可能的答案。再次感谢您的帮助
  • 谁能举例说明如何在 python 中使用 scipy.nnls() 来处理任何欠定方程组
  • @nantitv 使用 scipy.nnls 更新了解决方案,但它可能对您不起作用,因为它可以给出 0 值。你想要>0。
  • 伟人。我欠你一个人情。我找不到关于 nnls 的好文档。你能推荐一个吗?什么是规范?在什么条件下解变为零?是否存在 a,b 应该遵循的属性?
  • 我不知道除了答案中链接的文档之外的任何其他文档。它说它是一些 fortran 求解器的包装器,所以你也许可以找到它的文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多