Linear regression in 3 dimensions
Robert Kern
robert.kern at gmail.com
Sat Sep 2 03:27:29 EDT 2006
wirecom at wirelessmeasurement.com wrote:
> Hi all,
>
> I am seeking a module that will do the equivalent of linear regression in
> 3D to yield a best fit a plane through a set of points (X1, Y1, Z1), (X1,
> Y1, Z1),... (Xn, Yn, Zn).
>
> The resulting equation to be of the form:
>
> Z = aX + bY + c
>
> The function I need would take the set of points and return a,c & c Any
> pointers to existing code / modules would be very helpful.
Well, that's a very unspecified problem. You haven't defined "best."
But if we make the assumption that you want to minimize the squared error in Z,
that is minimize
Sum((Z[i] - (a*X[i] + b*Y[i] + c)) ** 2)
then this is a standard linear algebra problem.
In [1]: import numpy as np
In [2]: a = 1.0
In [3]: b = 2.0
In [4]: c = 3.0
In [5]: rs = np.random.RandomState(1234567890) # Specify a seed for repeatability
In [6]: x = rs.uniform(size=100)
In [7]: y = rs.uniform(size=100)
In [8]: e = rs.standard_normal(size=100)
In [9]: z = a*x + b*y + c + e
In [10]: A = np.column_stack([x, y, np.ones_like(x)])
In [11]: np.linalg.lstsq?
Type: function
Base Class: <type 'function'>
String Form: <function lstsq at 0x6df070>
Namespace: Interactive
File:
/Library/Frameworks/Python.framework/Versions/2.4/lib/python2.4/site-packages/numpy-1.0b2.dev3002-py2.4-macosx-10.4-ppc.egg/numpy/linalg/linalg.py
Definition: np.linalg.lstsq(a, b, rcond=1e-10)
Docstring:
returns x,resids,rank,s
where x minimizes 2-norm(|b - Ax|)
resids is the sum square residuals
rank is the rank of A
s is the rank of the singular values of A in descending order
If b is a matrix then x is also a matrix with corresponding columns.
If the rank of A is less than the number of columns of A or greater than
the number of rows, then residuals will be returned as an empty array
otherwise resids = sum((b-dot(A,x)**2).
Singular values less than s[0]*rcond are treated as zero.
In [12]: abc, residuals, rank, s = np.linalg.lstsq(A, z)
In [13]: abc
Out[13]: array([ 0.93104714, 1.96780364, 3.15185125])
--
Robert Kern
"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco
More information about the Python-list
mailing list