# [SciPy-User] Orthogonal distance regression in 3D

Robert Kern robert.kern@gmail....
Fri Mar 2 05:48:40 CST 2012

```On Fri, Mar 2, 2012 at 06:02, Владимир <draft2008@bk.ru> wrote:
> Hello!
> I'm working with orthogonal distance regression (scipy.odr).
> I try to fit the curve to a point cloud (3d), but it doesn work properly, it
> returns wrong results
>
> For example I want to fit the simple curve y = a*x + b*z + c to some point
> cloud (y_data, x_data, z_data)
>
>
>     def func(p, input):
>
>     x,z = input
>
>     x = np.array(x)
>
>     z = np.array(z)
>
>     return (p[0]*x + p[1]*z + p[2])
>
>
>     initialGuess = [1,1,1]
>
>     myModel = Model(func)
>
>     myData = Data([x_data, z_daya], y_data)
>
>     myOdr = ODR(myData, myModel, beta0 = initialGuess)
>
>     myOdr.set_job(fit_type=0)
>
>     out = myOdr.run()
>
>     print out.beta
>
> It works perfectly in 2d dimension (2 axes), but in 3d dimension the results
> are not even close to real, moreover it is very sensitive to initial Guess,
> so it returns different result even if i change InitiaGuess from [1,1,1]
> to [0.99,1,1]
>
> What do I do wrong?

Can you provide a complete runnable example including some data? Note
that if you do not specify any errors on your data, they are assumed
to correspond to a standard deviation of 1 for all dimensions. If that
is wildly different from the actual variance around the "true"
surface, then it might lead the optimizer astray.

--
Robert Kern
```