Skip to content

Instantly share code, notes, and snippets.

@prajwalsingh
Last active October 12, 2019 10:05
Show Gist options
  • Save prajwalsingh/6a84cce16d33f91bd42d178e744e6a2a to your computer and use it in GitHub Desktop.
Save prajwalsingh/6a84cce16d33f91bd42d178e744e6a2a to your computer and use it in GitHub Desktop.
Logistic Regression From Scratch
sepal_length sepal_width petal_length petal_width species
5.1 3.5 1.4 0.2 0
4.9 3 1.4 0.2 0
4.7 3.2 1.3 0.2 0
4.6 3.1 1.5 0.2 0
5 3.6 1.4 0.2 0
5.4 3.9 1.7 0.4 0
4.6 3.4 1.4 0.3 0
5 3.4 1.5 0.2 0
4.4 2.9 1.4 0.2 0
4.9 3.1 1.5 0.1 0
5.4 3.7 1.5 0.2 0
4.8 3.4 1.6 0.2 0
4.8 3 1.4 0.1 0
4.3 3 1.1 0.1 0
5.8 4 1.2 0.2 0
5.7 4.4 1.5 0.4 0
5.4 3.9 1.3 0.4 0
5.1 3.5 1.4 0.3 0
5.7 3.8 1.7 0.3 0
5.1 3.8 1.5 0.3 0
5.4 3.4 1.7 0.2 0
5.1 3.7 1.5 0.4 0
4.6 3.6 1 0.2 0
5.1 3.3 1.7 0.5 0
4.8 3.4 1.9 0.2 0
5 3 1.6 0.2 0
5 3.4 1.6 0.4 0
5.2 3.5 1.5 0.2 0
5.2 3.4 1.4 0.2 0
4.7 3.2 1.6 0.2 0
4.8 3.1 1.6 0.2 0
5.4 3.4 1.5 0.4 0
5.2 4.1 1.5 0.1 0
5.5 4.2 1.4 0.2 0
4.9 3.1 1.5 0.1 0
5 3.2 1.2 0.2 0
5.5 3.5 1.3 0.2 0
4.9 3.1 1.5 0.1 0
4.4 3 1.3 0.2 0
5.1 3.4 1.5 0.2 0
5 3.5 1.3 0.3 0
4.5 2.3 1.3 0.3 0
4.4 3.2 1.3 0.2 0
5 3.5 1.6 0.6 0
5.1 3.8 1.9 0.4 0
4.8 3 1.4 0.3 0
5.1 3.8 1.6 0.2 0
4.6 3.2 1.4 0.2 0
5.3 3.7 1.5 0.2 0
5 3.3 1.4 0.2 0
7 3.2 4.7 1.4 1
6.4 3.2 4.5 1.5 1
6.9 3.1 4.9 1.5 1
5.5 2.3 4 1.3 1
6.5 2.8 4.6 1.5 1
5.7 2.8 4.5 1.3 1
6.3 3.3 4.7 1.6 1
4.9 2.4 3.3 1 1
6.6 2.9 4.6 1.3 1
5.2 2.7 3.9 1.4 1
5 2 3.5 1 1
5.9 3 4.2 1.5 1
6 2.2 4 1 1
6.1 2.9 4.7 1.4 1
5.6 2.9 3.6 1.3 1
6.7 3.1 4.4 1.4 1
5.6 3 4.5 1.5 1
5.8 2.7 4.1 1 1
6.2 2.2 4.5 1.5 1
5.6 2.5 3.9 1.1 1
5.9 3.2 4.8 1.8 1
6.1 2.8 4 1.3 1
6.3 2.5 4.9 1.5 1
6.1 2.8 4.7 1.2 1
6.4 2.9 4.3 1.3 1
6.6 3 4.4 1.4 1
6.8 2.8 4.8 1.4 1
6.7 3 5 1.7 1
6 2.9 4.5 1.5 1
5.7 2.6 3.5 1 1
5.5 2.4 3.8 1.1 1
5.5 2.4 3.7 1 1
5.8 2.7 3.9 1.2 1
6 2.7 5.1 1.6 1
5.4 3 4.5 1.5 1
6 3.4 4.5 1.6 1
6.7 3.1 4.7 1.5 1
6.3 2.3 4.4 1.3 1
5.6 3 4.1 1.3 1
5.5 2.5 4 1.3 1
5.5 2.6 4.4 1.2 1
6.1 3 4.6 1.4 1
5.8 2.6 4 1.2 1
5 2.3 3.3 1 1
5.6 2.7 4.2 1.3 1
5.7 3 4.2 1.2 1
5.7 2.9 4.2 1.3 1
6.2 2.9 4.3 1.3 1
5.1 2.5 3 1.1 1
5.7 2.8 4.1 1.3 1
6.3 3.3 6 2.5 2
5.8 2.7 5.1 1.9 2
7.1 3 5.9 2.1 2
6.3 2.9 5.6 1.8 2
6.5 3 5.8 2.2 2
7.6 3 6.6 2.1 2
4.9 2.5 4.5 1.7 2
7.3 2.9 6.3 1.8 2
6.7 2.5 5.8 1.8 2
7.2 3.6 6.1 2.5 2
6.5 3.2 5.1 2 2
6.4 2.7 5.3 1.9 2
6.8 3 5.5 2.1 2
5.7 2.5 5 2 2
5.8 2.8 5.1 2.4 2
6.4 3.2 5.3 2.3 2
6.5 3 5.5 1.8 2
7.7 3.8 6.7 2.2 2
7.7 2.6 6.9 2.3 2
6 2.2 5 1.5 2
6.9 3.2 5.7 2.3 2
5.6 2.8 4.9 2 2
7.7 2.8 6.7 2 2
6.3 2.7 4.9 1.8 2
6.7 3.3 5.7 2.1 2
7.2 3.2 6 1.8 2
6.2 2.8 4.8 1.8 2
6.1 3 4.9 1.8 2
6.4 2.8 5.6 2.1 2
7.2 3 5.8 1.6 2
7.4 2.8 6.1 1.9 2
7.9 3.8 6.4 2 2
6.4 2.8 5.6 2.2 2
6.3 2.8 5.1 1.5 2
6.1 2.6 5.6 1.4 2
7.7 3 6.1 2.3 2
6.3 3.4 5.6 2.4 2
6.4 3.1 5.5 1.8 2
6 3 4.8 1.8 2
6.9 3.1 5.4 2.1 2
6.7 3.1 5.6 2.4 2
6.9 3.1 5.1 2.3 2
5.8 2.7 5.1 1.9 2
6.8 3.2 5.9 2.3 2
6.7 3.3 5.7 2.5 2
6.7 3 5.2 2.3 2
6.3 2.5 5 1.9 2
6.5 3 5.2 2 2
6.2 3.4 5.4 2.3 2
5.9 3 5.1 1.8 2
import numpy as np
import matplotlib.style as style
from matplotlib import pyplot as plt
import pandas as pd
def cost_function(trainingData, thetai, m):
cost = 0.0
for data in trainingData:
X = np.array([[1], [data[0]], [data[1]]],dtype='float32')
H = thetai.dot(X)[0]
Z = 1/(1+np.exp(-H))
cost += ( - data[2] * np.log(Z) - (1-data[2]) * np.log(1-Z) )
return float(cost)/float(m)
def logistic_reg(trainingData, m, testingData):
learning_rate = 0.1
thetai = np.random.random((1,3))
# print(thetai)
global_error = cost_function(trainingData, thetai, m)
# print(global_error)
prev_error = 0.0
try:
while prev_error != global_error and global_error >= 0.13:
prev_error = global_error
dthetai = np.zeros((1,3),dtype='float32')
for data in trainingData:
X = np.array([[1], [data[0]], [data[1]]],dtype='float32')
H = thetai.dot(X)[0]
Z = 1/(1+np.exp(-H))
dthetai[0,0] += ( Z - data[2] ) * X[0]
dthetai[0,1] += ( Z - data[2] ) * X[1]
dthetai[0,2] += ( Z - data[2] ) * X[2]
dthetai[0,0] /= float(m)
dthetai[0,1] /= float(m)
dthetai[0,2] /= float(m)
thetai = thetai - (learning_rate * dthetai)
global_error = cost_function(trainingData, thetai, m)
print(global_error)
except:
pass
pred = 0
for data in testingData:
X = np.array([[1], [data[0]], [data[1]]],dtype='float32')
H = thetai.dot(X)[0]
Z = 1/(1+np.exp(-H))
if Z>=0.5:
Z = 1
else:
Z = 0
print('Target : {0} \t Predict : {1}'.format(data[2],Z))
if data[2]==Z:
pred+=1
print('Accuracy : {0}%'.format((float(pred)/len(testingData))*100))
# style.use('seaborn')
# plt.scatter(trainingData[trainingData[:,2]==1,0],trainingData[trainingData[:,2]==1,1],color='r')
# plt.scatter(trainingData[trainingData[:,2]==0,0],trainingData[trainingData[:,2]==0,1],color='b')
# x = np.linspace(np.min(trainingData[:,1]),np.max(trainingData[:,1]),100)
# y = thetai[0,0]+thetai[0,1]*x + thetai[0,2]*x
# plt.plot(x,y, color='g')
# # plt.scatter(data[data[:,2]==2,0],data[data[:,2]==2,1],color='g')
# plt.xlabel('petal_length')
# plt.ylabel('petal_width')
# plt.show()
if __name__ == '__main__':
# Data : sepal_length , sepal_width, petal_length, petal_width, species
# setosa = 0
# versicolor = 1
# virginica = 2 -> 0
df = pd.read_csv('iris.csv')
# print(df['petal_length'])
data = np.array(list(zip(df['petal_length'],df['petal_width'],df['species'])))
temp = data[data[:,2]==1]
trainingData = temp[:30,:]
testingData = temp[30:,:]
temp = data[data[:,2]==2]
temp[:,2] = 0
trainingData = np.append(trainingData, temp[:30,:], axis=0)
testingData = np.append(testingData, temp[30:,:], axis=0)
# print(trainingData)
# print(len(trainingData))
# print(len(testingData))
# print(data[data[:,2]==0,0])
# print(len(data[data[:,2]==1,1]))
# print(len(data[data[:,2]==2,1]))
# style.use('seaborn')
# plt.scatter(trainingData[trainingData[:,2]==1,0],trainingData[trainingData[:,2]==1,1],color='r')
# plt.scatter(trainingData[trainingData[:,2]==2,0],trainingData[trainingData[:,2]==2,1],color='b')
# # plt.scatter(data[data[:,2]==2,0],data[data[:,2]==2,1],color='g')
# plt.xlabel('petal_length')
# plt.ylabel('petal_width')
# plt.show()
logistic_reg(trainingData, len(trainingData), testingData)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment