Source code for attitude.orientation.linear.regression

from __future__ import division
import numpy as N

import logging
log = logging.getLogger(__name__)

from ...coordinates import centered

[docs]def add_ones(a): """Adds a column of 1s at the end of the array""" arr = N.ones((a.shape[0],a.shape[1]+1)) arr[:,:-1] = a return arr
[docs]def matrix_squared(array): """Returns a pseudo-squared matrix by solving X^T.X""" return N.dot(array.transpose(),array)
[docs]class Regression(object): def __init__(self, coordinates): """ Solves plane equation Z = a(C[0])+b(C[1])+c by solving linear equation Cm=Z where m=[a,b,c] C and Z are the dependent and independent variables, respectively. """ coordinates = centered(N.array(coordinates)) if len(coordinates[0]) > 3: coordinates = N.swapaxes(coordinates, 0, 1) self.C = add_ones(coordinates[:,0:2]) self.Z = coordinates[:,-1] self.__coefficients__ = None self.__covariance__ = None self.nobs = self.Z.shape[0] # number of observations self.ncoef = self.C.shape[1] # number of coef. self.df_e = self.nobs - self.ncoef # degrees of freedom, error self.df_r = self.ncoef - 1 # degrees of freedom, regression self.n,self.k = self.C.shape @property def coefficients(self): if self.__coefficients__ is not None: return self.__coefficients__ self.xTx = N.linalg.inv(matrix_squared(self.C)) self.xy = N.dot(self.C.transpose(),self.Z) self.__coefficients__ = N.dot(self.xTx,self.xy) return self.__coefficients__ @property def predictions(self): return self.C[:,0], self.C[:,1], N.dot(self.C,self.coefficients) @property def residuals(self): return self.Z - self.predictions[2] @property def covariance_matrix(self): if self.__covariance__ is not None: return self.__covariance__ if self.n == self.k: # solution is fully defined (i.e. only three points) self.__covariance__ = N.zeros((self.n,self.k)) else: #rTr = matrix_squared(self.residuals()) e = self.residuals sse = N.dot(e,e) #/self.df_e #SSE self.__covariance__ = N.dot(sse,self.xTx) return self.__covariance__
[docs] def standard_errors(self): """Gets the standard errors of the coefficients""" return N.sqrt(N.diagonal(self.covariance_matrix))