擅长:python、mysql、java
<p>我想用另一种方法来完成答案,以便找到适合R^3中一组点的最佳平面。
实际上,<code>lstsq</code>方法工作得很好,除非在特定情况下(例如)所有点的x坐标为0(或相同)。在这种情况下,<code>lstsq</code>中使用的矩阵的列不是线性独立的。例如:</p>
<pre><code>A = [[ 0 y_0 1]
[ 0 y_1 1]
...
[ 0 y_k 1]
...
[ 0 y_N 1]]
</code></pre>
<p>为了避免这个问题,可以直接在点集的中心坐标上使用<code>svd</code>。实际上,<code>svd</code>在<code>lstsq</code>中使用,但不在同一个矩阵中使用。</p>
<p>这是一个python示例,给出了<code>coords</code>数组中各点的坐标:</p>
<pre><code># barycenter of the points
# compute centered coordinates
G = coords.sum(axis=0) / coords.shape[0]
# run SVD
u, s, vh = np.linalg.svd(coords - G)
# unitary normal vector
u_norm = vh[2, :]
</code></pre>
<p>使用这种方法,<code>vh</code>矩阵是一个<code>3x3</code>矩阵,其行中包含正交向量。前两个向量在平面上构成正交基,第三个向量是垂直于平面的单位向量。</p>
<p>如果你真的需要<code>a, b, c</code>参数,你可以从法向量得到它们,因为法向量的坐标是<code>(a, b, c)</code>,假设平面的方程是<code>ax + by + cz + d = 0</code>。</p>