Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added some machine learning scripts #197

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

n_classes = 10
batch_size = 128

x = tf.placeholder("float", [None, 784])
y = tf.placeholder("float")

keep_rate = 0.8
keep_prob = tf.placeholder(tf.float32)


def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding="SAME")


def maxpool2d(x):
# size of window movement of window
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")


def convolutional_neural_network(x):
weights = {
"W_conv1": tf.Variable(tf.random_normal([5, 5, 1, 32])),
"W_conv2": tf.Variable(tf.random_normal([5, 5, 32, 64])),
"W_fc": tf.Variable(tf.random_normal([7 * 7 * 64, 1024])),
"out": tf.Variable(tf.random_normal([1024, n_classes])),
}

biases = {
"b_conv1": tf.Variable(tf.random_normal([32])),
"b_conv2": tf.Variable(tf.random_normal([64])),
"b_fc": tf.Variable(tf.random_normal([1024])),
"out": tf.Variable(tf.random_normal([n_classes])),
}

x = tf.reshape(x, shape=[-1, 28, 28, 1])

conv1 = tf.nn.relu(conv2d(x, weights["W_conv1"]) + biases["b_conv1"])
conv1 = maxpool2d(conv1)

conv2 = tf.nn.relu(conv2d(conv1, weights["W_conv2"]) + biases["b_conv2"])
conv2 = maxpool2d(conv2)

fc = tf.reshape(conv2, [-1, 7 * 7 * 64])
fc = tf.nn.relu(tf.matmul(fc, weights["W_fc"]) + biases["b_fc"])
fc = tf.nn.dropout(fc, keep_rate)

output = tf.matmul(fc, weights["out"]) + biases["out"]

return output


def train_neural_network(x):
prediction = convolutional_neural_network(x)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(prediction, y))
optimizer = tf.train.AdamOptimizer().minimize(cost)

hm_epochs = 10
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())

for epoch in range(hm_epochs):
epoch_loss = 0
for _ in range(int(mnist.train.num_examples / batch_size)):
epoch_x, epoch_y = mnist.train.next_batch(batch_size)
_, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y})
epoch_loss += c

print("Epoch", epoch, "completed out of", hm_epochs, "loss:", epoch_loss)

correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))

accuracy = tf.reduce_mean(tf.cast(correct, "float"))
print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels}))


train_neural_network(x)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
165 changes: 165 additions & 0 deletions Machine_Learning/src/Support Vector Machine using Python/svm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np

style.use("ggplot")


class Support_Vector_Machine:
def __init__(self, visualization=True):
self.visualization = visualization
self.colors = {1: "r", -1: "b"}
if self.visualization:
self.fig = plt.figure()
self.ax = self.fig.add_subplot(1, 1, 1)

# train
def fit(self, data):
self.data = data
# { ||w||: [w,b] }
opt_dict = {}

transforms = [[1, 1], [-1, 1], [-1, -1], [1, -1]]

all_data = []
for yi in self.data:
for featureset in self.data[yi]:
for feature in featureset:
all_data.append(feature)

self.max_feature_value = max(all_data)
self.min_feature_value = min(all_data)
all_data = None

# support vectors yi(xi.w+b) = 1

step_sizes = [
self.max_feature_value * 0.1,
self.max_feature_value * 0.01,
# point of expense:
self.max_feature_value * 0.001,
]

# extremely expensive
b_range_multiple = 2
# we dont need to take as small of steps
# with b as we do w
b_multiple = 5
latest_optimum = self.max_feature_value * 10

for step in step_sizes:
w = np.array([latest_optimum, latest_optimum])
# we can do this because convex
optimized = False
while not optimized:
for b in np.arange(
-1 * (self.max_feature_value * b_range_multiple),
self.max_feature_value * b_range_multiple,
step * b_multiple,
):
for transformation in transforms:
w_t = w * transformation
found_option = True
# weakest link in the SVM fundamentally
# SMO attempts to fix this a bit
# yi(xi.w+b) >= 1
#
# #### add a break here later..
for i in self.data:
for xi in self.data[i]:
yi = i
if not yi * (np.dot(w_t, xi) + b) >= 1:
found_option = False
# print(xi,':',yi*(np.dot(w_t,xi)+b))

if found_option:
opt_dict[np.linalg.norm(w_t)] = [w_t, b]

if w[0] < 0:
optimized = True
print("Optimized a step.")
else:
w = w - step

norms = sorted([n for n in opt_dict])
# ||w|| : [w,b]
opt_choice = opt_dict[norms[0]]
self.w = opt_choice[0]
self.b = opt_choice[1]
latest_optimum = opt_choice[0][0] + step * 2

for i in self.data:
for xi in self.data[i]:
yi = i
print(xi, ":", yi * (np.dot(self.w, xi) + self.b))

def predict(self, features):
# sign( x.w+b )
classification = np.sign(np.dot(np.array(features), self.w) + self.b)
if classification != 0 and self.visualization:
self.ax.scatter(
features[0],
features[1],
s=200,
marker="*",
c=self.colors[classification],
)
return classification

def visualize(self):
[
[
self.ax.scatter(x[0], x[1], s=100, color=self.colors[i])
for x in data_dict[i]
]
for i in data_dict
]

# hyperplane = x.w+b
# v = x.w+b
# psv = 1
# nsv = -1
# dec = 0
def hyperplane(x, w, b, v):
return (-w[0] * x - b + v) / w[1]

datarange = (self.min_feature_value * 0.9, self.max_feature_value * 1.1)
hyp_x_min = datarange[0]
hyp_x_max = datarange[1]

# (w.x+b) = 1
# positive support vector hyperplane
psv1 = hyperplane(hyp_x_min, self.w, self.b, 1)
psv2 = hyperplane(hyp_x_max, self.w, self.b, 1)
self.ax.plot([hyp_x_min, hyp_x_max], [psv1, psv2], "k")

# (w.x+b) = -1
# negative support vector hyperplane
nsv1 = hyperplane(hyp_x_min, self.w, self.b, -1)
nsv2 = hyperplane(hyp_x_max, self.w, self.b, -1)
self.ax.plot([hyp_x_min, hyp_x_max], [nsv1, nsv2], "k")

# (w.x+b) = 0
# positive support vector hyperplane
db1 = hyperplane(hyp_x_min, self.w, self.b, 0)
db2 = hyperplane(hyp_x_max, self.w, self.b, 0)
self.ax.plot([hyp_x_min, hyp_x_max], [db1, db2], "y--")

plt.show()


data_dict = {
-1: np.array([[1, 7], [2, 8], [3, 8]]),
1: np.array([[5, 1], [6, -1], [7, 3]]),
}

svm = Support_Vector_Machine()
svm.fit(data=data_dict)

predict_us = [[0, 10], [1, 3], [3, 4], [3, 5], [5, 5], [5, 6], [6, -5], [5, 8]]

for p in predict_us:
svm.predict(p)

svm.visualize()
# result of this code is attached in file
Loading