<s> from pyvision . vector . VectorClassifier import VectorClassifier , TYPE_REGRESSION <EOL> from numpy import array , dot <EOL> from numpy . linalg import lstsq <EOL> class Polynomial2D ( VectorClassifier ) : <EOL> def __init__ ( self , order = <NUM_LIT:2> , ** kwargs ) : <EOL> '''<STR_LIT>''' <EOL> self . order = order <EOL> self . x = None <EOL> VectorClassifier . __init__ ( self , TYPE_REGRESSION , ** kwargs ) <EOL> def trainClassifer ( self , labels , vectors , ilog = None ) : <EOL> '''<STR_LIT>''' <EOL> matrix = [ ] <EOL> for each in vectors : <EOL> if len ( each ) != <NUM_LIT:2> : <EOL> raise ValueError ( "<STR_LIT>" % len ( each ) ) <EOL> x , y = each <EOL> matrix . append ( self . buildRow ( x , y ) ) <EOL> matrix = array ( matrix ) <EOL> labels = array ( labels ) <EOL> x , resids , rank , s = lstsq ( matrix , labels ) <EOL> self . x = x <EOL> self . resids = resids <EOL> self . rank = rank <EOL> self . s = s <EOL> if rank != matrix . shape [ <NUM_LIT:1> ] : <EOL> print "<STR_LIT>" <EOL> def buildRow ( self , x , y ) : <EOL> '''<STR_LIT>''' <EOL> row = [ <NUM_LIT:1.0> ] <EOL> for o in range ( <NUM_LIT:1> , self . order + <NUM_LIT:1> ) : <EOL> for i in range ( o + <NUM_LIT:1> ) : <EOL> row . append ( float ( x ) ** i * float ( y ) ** ( o - i ) ) <EOL> return row <EOL> def predictValue ( self , data , ilog = None ) : <EOL> '''<STR_LIT>''' <EOL> if len ( data ) != <NUM_LIT:2> : <EOL> raise ValueError ( "<STR_LIT>" ) <EOL> x , y = data <EOL> return dot ( self . x , self . buildRow ( x , y ) ) <EOL> import unittest <EOL> class _PolyTest ( unittest . TestCase ) : <EOL> def test_buildrow ( self ) : <EOL> poly = Polynomial2D ( order = <NUM_LIT:3> ) <EOL> row = array ( poly . buildRow ( <NUM_LIT:2> , <NUM_LIT:2> ) ) <EOL> error = row - array ( [ <NUM_LIT:1.0> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] ) <EOL> sse = ( error * error ) . sum ( ) <EOL> self . assert_ ( sse < <NUM_LIT> ) <EOL> row = array ( poly . buildRow ( <NUM_LIT:2> , <NUM_LIT:1> ) ) <EOL> error = row - array ( [ <NUM_LIT:1.0> , <NUM_LIT:1.0> , <NUM_LIT> , <NUM_LIT:1.0> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT:1.0> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] ) <EOL> sse = ( error * error ) . sum ( ) <EOL> self . assert_ ( sse < <NUM_LIT> ) <EOL> row = array ( poly . buildRow ( <NUM_LIT:1> , <NUM_LIT:2> ) ) <EOL> error = row - array ( [ <NUM_LIT:1.0> , <NUM_LIT> , <NUM_LIT:1.0> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT:1.0> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT:1.0> ] ) <EOL> sse = ( error * error ) . sum ( ) <EOL> self . assert_ ( sse < <NUM_LIT> ) <EOL> def test_train ( self ) : <EOL> poly = Polynomial2D ( order = <NUM_LIT:2> ) <EOL> for x in range ( - <NUM_LIT:8> , <NUM_LIT:9> ) : <EOL> for y in range ( - <NUM_LIT:8> , <NUM_LIT:9> ) : <EOL> val = - <NUM_LIT:5> + <NUM_LIT:3> * y + <NUM_LIT:2> * x - <NUM_LIT:4> * y * y + <NUM_LIT:2> * y * x + x * x <EOL> poly . addTraining ( val , [ x , y ] ) <EOL> poly . train ( ) <EOL> for x in range ( - <NUM_LIT:8> , <NUM_LIT:9> ) : <EOL> for y in range ( - <NUM_LIT:8> , <NUM_LIT:9> ) : <EOL> val = - <NUM_LIT:5> + <NUM_LIT:3> * y + <NUM_LIT:2> * x - <NUM_LIT:4> * y * y + <NUM_LIT:2> * y * x + x * x <EOL> pred = poly . predict ( [ x , y ] ) <EOL> self . assertAlmostEqual ( val , pred , delta = <NUM_LIT> ) </s>
