如何使用最小二乘法将球体拟合到一组 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 将正确的结果返回到我可以处理它的应用程序。
我正在尝试使用我在此处找到的方法将球体拟合到一组 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 将正确的结果返回到我可以处理它的应用程序。