У меня есть набор трехмерных точек, и я использую метод наименьших квадратов, чтобы найти параметры A, B, C и D формулы Ax + By + Cz + D = 0, которая должна описывать самая подходящая плоскость для этих трехмерных точек.
Я использовал этот код на синтетическом c наборе данных с включенным в него синтетическим c шумом, поэтому точки не образуют идеальную плоскость. Этот шум был задан таким же отклонением, что и шум, который будет присутствовать в реальном наборе данных. Алгоритм прекрасно работает с каждой плоскостью.
Однако, когда я использую его на реальном наборе данных, который имеет почти такой же шум, но также и некоторые другие недостатки, он не работает немного. Для большинства самолетов он просто угадывает совершенно неправильно, для других - совершенно правильно, и я не знаю, что его вызывает.
Итак, вопрос в том, почему это не работает и как я могу это исправить? Существуют ли альтернативные методы поиска этой формулы, которые могут быть более надежными для моего случая?
Вот код, который я сейчас использую:
def calcBestNormal_v4(points, origin, p0=np.array([0.506645455682, -0.185724560275, -1.43998120646, 1.37626378129])):
p = np.subtract(points, origin)
def f_min(X, p):
plane_xyz = p[0:3]
distance = (plane_xyz * X.T).sum(axis=1) + p[3]
return distance / np.linalg.norm(plane_xyz)
def residuals(params, signal, X):
return f_min(X, params)
sol = leastsq(residuals, p0, args=(None, p.T))[0]
normal = np.divide(sol[0:3], np.linalg.norm(sol[0:3]))
return normal
leastsq является частью пакета scipy. оптимизируют