如何使用最小二乘法将球体拟合到一组 3d 点?

How can I fit a sphere to a set of 3d points with least squares method?

我正在尝试使用我在此处找到的方法将球体拟合到一组 3d 点:https://jekel.me/2015/Least-Squares-Sphere-Fit

我确实理解输入矩阵和向量的形成原因和方式,但我还没有完全理解最小二乘法本身。 (我希望跳过它,因为我只需要结果)。我已经走到这一步了:

        // simplified example: Expected result: R=1000.0, C=(0, 1000, 0)
        points = new Vector<double>[]
        {
            DenseVector.OfArray(new double[] {0.0, 0.0, 0.0, 1.0}),
            DenseVector.OfArray(new double[] {0.0, 1000.0, 1000.0, 1.0}),
            DenseVector.OfArray(new double[] {1000.0, 1000.0, 0.0, 1.0}),
            DenseVector.OfArray(new double[] {0.0, 1000.0, -1000.0, 1.0}),
        };

        Matrix<double> A = DenseMatrix.OfRowVectors(points);
        Vector<double> f = DenseVector.Create(A.RowCount, 0.0);
        foreach (var tuple in A.EnumerateRowsIndexed())
        {
            var index = tuple.Item1;
            var row = tuple.Item2;

            // Assemble the A matrix
            row[0] *= 2.0;
            row[1] *= 2.0;
            row[2] *= 2.0;
            row[3] = 1;
            A.SetRow(index, row);

            // Assemble the f matrix
            f[index] = row[0] * row[0] + row[1] * row[1] + row[2] * row[2];
        }

        var C = MultipleRegression.NormalEquations(A, f);

        // solve for the radius
        double t = (C[0] * C[0]) + (C[1] * C[1]) + (C[2] * C[2]) + C[3];
        double radius = System.Math.Sqrt(t);

        // Actual result: R=4000, C=(0, 4000, 0)

很遗憾,结果不正确。 我注意到 math.net 文档中的回归示例接缝仅处理曲线。是我弄错了还是图书馆不适合这类问题?

我 运行 python 脚本使用 C# 中的 numpy 库(参见问题中的 link)。它 returns 将正确的结果返回到我可以处理它的应用程序。