Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
RiptideBo committed Oct 11, 2017
2 parents e4d537a + f9156cf commit 7c9a07c
Show file tree
Hide file tree
Showing 11 changed files with 214 additions and 162 deletions.
14 changes: 0 additions & 14 deletions .travis.yml

This file was deleted.

6 changes: 3 additions & 3 deletions data_structures/Binary Tree/binary_seach_tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class Node:
def __init__(self, label):
self.label = label
self.left = None
self.rigt = None
self.right = None

def getLabel(self):
return self.label
Expand All @@ -23,10 +23,10 @@ def setLeft(self, left):
self.left = left

def getRight(self):
return self.rigt
return self.right

def setRight(self, right):
self.rigt = right
self.right = right


class BinarySearchTree:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
class GRAPH:
"""docstring for GRAPH"""
def __init__(self, nodes):
self.nodes=nodes
self.graph=[[0]*nodes for i in range (nodes)]
self.visited=[0]*nodes
self.nodes = nodes
self.graph = [[0]*nodes for i in range (nodes)]
self.visited = [0]*nodes


def show(self):
Expand All @@ -23,7 +23,7 @@ def bfs(self,v):
v = queue[0]
for u in range(self.vertex):
if self.graph[v][u] == 1:
if visited[u]== False:
if visited[u] is False:
visited[u] = True
queue.append(u)
print('%d visited' % (u +1))
Expand All @@ -41,30 +41,32 @@ def bfs(self,v):
g.add_edge(5,9)
g.add_edge(6,10)
g.bfs(4)
=======
print self.graph

print(self.graph)

def add_edge(self, i, j):
self.graph[i][j]=1
self.graph[j][i]=1

def bfs(self,s):
queue=[s]
self.visited[s]=1
while len(queue)!=0:
x=queue.pop(0)
def bfs(self, s):
queue = [s]
self.visited[s] = 1
while len(queue)!= 0:
x = queue.pop(0)
print(x)
for i in range(0,self.nodes):
if self.graph[x][i]==1 and self.visited[i]==0:
for i in range(0, self.nodes):
if self.graph[x][i] == 1 and self.visited[i] == 0:
queue.append(i)
self.visited[i]=1
self.visited[i] = 1

n=int(input("Enter the number of Nodes : "))
g=GRAPH(n)
e=int(input("Enter the no of edges : "))
n = int(input("Enter the number of Nodes : "))
g = GRAPH(n)
e = int(input("Enter the no of edges : "))
print("Enter the edges (u v)")
for i in range(0,e):
u,v=map(int, raw_input().split())
g.add_edge(u,v)
s=int(input("Enter the source node :"))

for i in range(0, e):
u ,v = map(int, raw_input().split())
g.add_edge(u, v)

s = int(input("Enter the source node :"))
g.bfs(s)
File renamed without changes.
File renamed without changes.
File renamed without changes.
61 changes: 0 additions & 61 deletions data_structures/Graph/P01_BreadthFirstSearch.py

This file was deleted.

61 changes: 0 additions & 61 deletions data_structures/Graph/P02_DepthFirstSearch.py

This file was deleted.

139 changes: 139 additions & 0 deletions machine_learning/decision_tree.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
"""
Implementation of a basic regression decision tree.
Input data set: The input data set must be 1-dimensional with continuous labels.
Output: The decision tree maps a real number input to a real number output.
"""

import numpy as np

class Decision_Tree:
def __init__(self, depth = 5, min_leaf_size = 5):
self.depth = depth
self.decision_boundary = 0
self.left = None
self.right = None
self.min_leaf_size = min_leaf_size
self.prediction = None

def mean_squared_error(self, labels, prediction):
"""
mean_squared_error:
@param labels: a one dimensional numpy array
@param prediction: a floating point value
return value: mean_squared_error calculates the error if prediction is used to estimate the labels
"""
if labels.ndim != 1:
print("Error: Input labels must be one dimensional")

return np.mean((labels - prediction) ** 2)

def train(self, X, y):
"""
train:
@param X: a one dimensional numpy array
@param y: a one dimensional numpy array.
The contents of y are the labels for the corresponding X values
train does not have a return value
"""

"""
this section is to check that the inputs conform to our dimensionality constraints
"""
if X.ndim != 1:
print("Error: Input data set must be one dimensional")
return
if len(X) != len(y):
print("Error: X and y have different lengths")
return
if y.ndim != 1:
print("Error: Data set labels must be one dimensional")
return

if len(X) < 2 * self.min_leaf_size:
self.prediction = np.mean(y)
return

if self.depth == 1:
self.prediction = np.mean(y)
return

best_split = 0
min_error = self.mean_squared_error(X,np.mean(y)) * 2


"""
loop over all possible splits for the decision tree. find the best split.
if no split exists that is less than 2 * error for the entire array
then the data set is not split and the average for the entire array is used as the predictor
"""
for i in range(len(X)):
if len(X[:i]) < self.min_leaf_size:
continue
elif len(X[i:]) < self.min_leaf_size:
continue
else:
error_left = self.mean_squared_error(X[:i], np.mean(y[:i]))
error_right = self.mean_squared_error(X[i:], np.mean(y[i:]))
error = error_left + error_right
if error < min_error:
best_split = i
min_error = error

if best_split != 0:
left_X = X[:best_split]
left_y = y[:best_split]
right_X = X[best_split:]
right_y = y[best_split:]

self.decision_boundary = X[best_split]
self.left = Decision_Tree(depth = self.depth - 1, min_leaf_size = self.min_leaf_size)
self.right = Decision_Tree(depth = self.depth - 1, min_leaf_size = self.min_leaf_size)
self.left.train(left_X, left_y)
self.right.train(right_X, right_y)
else:
self.prediction = np.mean(y)

return

def predict(self, x):
"""
predict:
@param x: a floating point value to predict the label of
the prediction function works by recursively calling the predict function
of the appropriate subtrees based on the tree's decision boundary
"""
if self.prediction is not None:
return self.prediction
elif self.left or self.right is not None:
if x >= self.decision_boundary:
return self.right.predict(x)
else:
return self.left.predict(x)
else:
print("Error: Decision tree not yet trained")
return None

def main():
"""
In this demonstration we're generating a sample data set from the sin function in numpy.
We then train a decision tree on the data set and use the decision tree to predict the
label of 10 different test values. Then the mean squared error over this test is displayed.
"""
X = np.arange(-1., 1., 0.005)
y = np.sin(X)

tree = Decision_Tree(depth = 10, min_leaf_size = 10)
tree.train(X,y)

test_cases = (np.random.rand(10) * 2) - 1
predictions = np.array([tree.predict(x) for x in test_cases])
avg_error = np.mean((predictions - test_cases) ** 2)

print("Test values: " + str(test_cases))
print("Predictions: " + str(predictions))
print("Average error: " + str(avg_error))


if __name__ == '__main__':
main()
4 changes: 2 additions & 2 deletions searches/binary_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,9 @@ def binary_search_by_recursion(sorted_collection, item, left, right):
if sorted_collection[midpoint] == item:
return midpoint
elif sorted_collection[midpoint] > item:
return binary_search_by_recursion(sorted_collection, item, left, right-1)
return binary_search_by_recursion(sorted_collection, item, left, midpoint-1)
else:
return binary_search_by_recursion(sorted_collection, item, left+1, right)
return binary_search_by_recursion(sorted_collection, item, midpoint+1, right)

def __assert_sorted(collection):
"""Check if collection is sorted, if not - raises :py:class:`ValueError`
Expand Down
Loading

0 comments on commit 7c9a07c

Please sign in to comment.