Warning: Declaration of action_plugin_tablewidth::register(&$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /s/bach/b/class/cs545/public_html/fall16/lib/plugins/tablewidth/action.php on line 93
=== Machine learning with theano === [[http://deeplearning.net/software/theano/ | Theano]] represents a very different approach to machine learning programming. Here's the code that I showed in the class: """ Basic usage of theano constructs. """ import numpy import theano from theano import tensor from theano import function # let's defines two symbols (or variables): x = tensor.dscalar('x') y = tensor.dscalar('y') # a dscalar is a 0 dimensional tensor # the argument to dscalar is the name of the variable, # which you can leave out. # there are several types of scalars: # dscalar float64 # fscalar float32 # iscalar int32 # the above is a shortcut fore: x = tensor.scalar('x', dtype = 'float64') # to see what type of object we created: type(x) x.type z = x + y from theano import pp pp(z) # let's create a function f = function([x, y], z) # this compiles the expression into someting # that can be executed: f(2, 3) # we like dot products: x = tensor.dvector('x') y = tensor.dvector('y') dot_symbolic = tensor.dot(x, y) dot = function([x,y], dot_symbolic) dot([1,1,-1], [1,1,1]) # the discriminant function for classifier: # shared variables are useful for storing the weights of a neural network # theano will automatically try to put such variables on a GPU if one is available. w = theano.shared(value=numpy.array([1.0, 1.0]), name='w') b = theano.shared(value=2.0, name='b') x = tensor.dvector('x') discriminant_symbolic = tensor.dot(w, x) + b discriminant = function([x], discriminant_symbolic) discriminant([1, 1]) Logistic regression in theano: import numpy import theano import theano.tensor as T class LogisticRegression(object): def __init__(self, learning_rate = 0.1, regularizer = 0.1, epochs = 500): self.learning_rate = learning_rate self.regularizer = regularizer self.epochs = epochs def fit(self, X, labels) : num_features = len(X[0]) # initialize the weights w = theano.shared( value=numpy.random.randn(num_features), name='w' ) # initialize the bias b = theano.shared(0.0, name="b") x = T.dmatrix("x") y = T.dvector("y") # Probability that target = 1 p_1 = 1 / (1 + T.exp(-T.dot(x, w) - b)) # The predictions thresholded prediction = p_1 > 0.5 # The cross-entropy loss function cross_ent = -y * T.log(p_1) - (1-y) * T.log(1-p_1) # The cost function to minimize cost = cross_ent.mean() + self.regularizer * (w ** 2).sum() # Compute the gradient of the cost gw = T.grad(cost, wrt=w) gb = T.grad(cost, wrt=b) #gw, gb = T.grad(cost, [w, b]) train = theano.function( inputs=[x,y], outputs=[prediction, cost], updates=((w, w - self.learning_rate * gw), (b, b - self.learning_rate * gb))) self._predict = theano.function(inputs=[x], outputs=prediction) # train the model: for i in range(self.epochs) : pred, c = train(X, labels) print ("In sample error: ", c) self.w = w self.b = b def predict(self, X) : return self._predict(X) if __name__=='__main__' : import numpy as np from sklearn import cross_validation from sklearn import metrics # read in the heart dataset data=np.genfromtxt("../../data/heart_scale.data", delimiter=",") X=data[:,1:] y=data[:,0] y = (y + 1) / 2 X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.4, random_state=0) classifier=LogisticRegression() classifier.fit(X_train, y_train) y_pred = classifier.predict(X_test) print("test set accuracy: ", metrics.accuracy_score(y_test, y_pred) )