<p>正如@Foon指出的,标准的方法是减去一个列。在</p>
<p>然而,另一方面,由于您的问题被过度确定,您需要使用诸如最小二乘法之类的方法。根据定义,如果这是一个过度确定的问题,就没有“唯一、精确的解决方案”。(否则,它甚至会被确定-一个方阵。)</p>
<p>除此之外,以下是你应该怎么做的:</p>
<p>让我们来看看你的等式:</p>
<pre><code>|1 0 0 1 0| |n1| |B1|
|1 0 0 0 1| |n2| |B2|
|0 1 0 1 0| X |n3| = |B3|
|0 1 0 0 1| |t1| |B4|
|0 0 1 1 0| |t2| |B5|
|0 0 1 0 1| |B6|
</code></pre>
<p>正如你所指出的,这是一个过度的决定。如果我们知道我们的一个“模型”变量(在本例中是<code>n1</code>),它将更加确定。这不是一个问题,但这意味着我们需要使用最小二乘法,而且没有一个完全唯一的解决方案。在</p>
<p>所以,假设我们知道<code>n1</code>应该是什么。在</p>
<p>在这种情况下,我们将通过从观察向量中减去<code>n1</code>乘以解矩阵中的第一列来重新说明问题(这是@Foon建议的):</p>
^{pr2}$
<p>让我们用一个更具体的例子来形容。让我们来解方程<code>y = Ax^2 + Bx + C</code>。首先,让我们生成数据和“真实”模型参数:</p>
<pre><code>import numpy as np
# Randomly generate two of our model variables
a, c = np.random.rand(2)
b = 1
x = np.linspace(0, 2, 6)
y = a * x**2 + b * x + c
noise = np.random.normal(0, 0.1, y.size)
y += noise
</code></pre>
<p>首先,我们将在没有知识的情况下解决它。我们可以使用<code>np.polyfit</code>来实现这一点,但是为了进入下一个阶段,我们将使用一个较低级别的方法:</p>
<pre><code># I'm a geophysist, so I tend to use Gm=d instead of Ax=b
G = np.column_stack([x**2, x, np.ones_like(x)])
d = y
m, _, _, _ = np.linalg.lstsq(G, d)
print "Ideally, this would be 1: ", m[1]
</code></pre>
<p>正如你所看到的,我们会得到一些接近,但不完全是1。在本例中(我没有设置种子,因此这会有所不同),返回的模型参数为</p>
<pre><code>[ 0.13392633, 0.97217035, 0.33645734]
</code></pre>
<p>而真正的参数是:</p>
<pre><code>[ 0.14592752, 1. , 0.31349185]
</code></pre>
<p>现在让我们来考虑一下我们对<code>b</code>的了解。我们将用少一列生成一个新的<code>G</code>,并从观察值中减去该列乘以<code>b</code>(<code>d</code>/<code>y</code>):</p>
<pre><code>G = np.column_stack([x**2, np.ones_like(x)])
d = y - b * x
m, _, _, _ = np.linalg.lstsq(G, d)
</code></pre>
<p>现在<code>m</code>是{<cd13>},我们已经用<code>b</code>的知识来求解这两个变量。在</p>