Skip to content

Instantly share code, notes, and snippets.

@yusugomori
Last active March 30, 2021 00:03
Show Gist options
  • Save yusugomori/4462221 to your computer and use it in GitHub Desktop.
Save yusugomori/4462221 to your computer and use it in GitHub Desktop.
multiclass Logistic Regression
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Logistic Regression
References :
- Jason Rennie: Logistic Regression,
http://qwone.com/~jason/writing/lr.pdf
- DeepLearningTutorials
https://github.com/lisa-lab/DeepLearningTutorials
'''
import sys
import numpy
numpy.seterr(all='ignore')
def sigmoid(x):
return 1. / (1 + numpy.exp(-x))
def softmax(x):
e = numpy.exp(x - numpy.max(x)) # prevent overflow
if e.ndim == 1:
return e / numpy.sum(e, axis=0)
else:
return e / numpy.array([numpy.sum(e, axis=1)]).T # ndim = 2
class LogisticRegression(object):
def __init__(self, input, label, n_in, n_out):
self.x = input
self.y = label
self.W = numpy.zeros((n_in, n_out)) # initialize W 0
self.b = numpy.zeros(n_out) # initialize bias 0
# self.params = [self.W, self.b]
def train(self, lr=0.1, input=None, L2_reg=0.00):
if input is not None:
self.x = input
# p_y_given_x = sigmoid(numpy.dot(self.x, self.W) + self.b)
p_y_given_x = softmax(numpy.dot(self.x, self.W) + self.b)
d_y = self.y - p_y_given_x
self.W += lr * numpy.dot(self.x.T, d_y) - lr * L2_reg * self.W
self.b += lr * numpy.mean(d_y, axis=0)
# cost = self.negative_log_likelihood()
# return cost
def negative_log_likelihood(self):
# sigmoid_activation = sigmoid(numpy.dot(self.x, self.W) + self.b)
sigmoid_activation = softmax(numpy.dot(self.x, self.W) + self.b)
cross_entropy = - numpy.mean(
numpy.sum(self.y * numpy.log(sigmoid_activation) +
(1 - self.y) * numpy.log(1 - sigmoid_activation),
axis=1))
return cross_entropy
def predict(self, x):
# return sigmoid(numpy.dot(x, self.W) + self.b)
return softmax(numpy.dot(x, self.W) + self.b)
def test_lr(learning_rate=0.01, n_epochs=200):
# training data
x = numpy.array([[1,1,1,0,0,0],
[1,0,1,0,0,0],
[1,1,1,0,0,0],
[0,0,1,1,1,0],
[0,0,1,1,0,0],
[0,0,1,1,1,0]])
y = numpy.array([[1, 0],
[1, 0],
[1, 0],
[0, 1],
[0, 1],
[0, 1]])
# construct LogisticRegression
classifier = LogisticRegression(input=x, label=y, n_in=6, n_out=2)
# train
for epoch in xrange(n_epochs):
classifier.train(lr=learning_rate)
cost = classifier.negative_log_likelihood()
print >> sys.stderr, 'Training epoch %d, cost is ' % epoch, cost
learning_rate *= 0.95
# test
x = numpy.array([1, 1, 0, 0, 0, 0])
print >> sys.stderr, classifier.predict(x)
if __name__ == "__main__":
test_lr()
@cclough
Copy link

cclough commented Apr 4, 2018

Thanks for sharing this. Does it work?

@SedighehRahimi
Copy link

Thanks a lot.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment