ch3 perceptron
This commit is contained in:
parent
a7248f8630
commit
bc8e4fc823
|
@ -60,3 +60,5 @@ target/
|
||||||
|
|
||||||
#Ipython Notebook
|
#Ipython Notebook
|
||||||
.ipynb_checkpoints
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
.*.swp
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import pcn_logic_eg as pcn
|
||||||
|
|
||||||
|
def main():
|
||||||
|
#or_training = np.array( [ [0,0,0], [1,0,1], [0,1,1], [1,1,1] ])
|
||||||
|
or_inputs = np.array( [[0,0], [0,1], [1,0], [1,1]])
|
||||||
|
or_targets = np.array([[0],[1],[1],[1]])
|
||||||
|
|
||||||
|
#p = pcn.pcn(a[:,0:2], a[:,2:])
|
||||||
|
p = pcn.pcn(or_inputs, or_targets)
|
||||||
|
#p.pcntrain(a[:,0:2], a[:, 2:], 0.25, 10)
|
||||||
|
p.pcntrain(or_inputs, or_targets, 0.25, 10)
|
||||||
|
print "confusion matrix"
|
||||||
|
p.confmat(or_inputs, or_targets)
|
||||||
|
|
||||||
|
print "doing"
|
||||||
|
print " for "
|
||||||
|
print or_inputs
|
||||||
|
inputs_bias = np.concatenate((or_inputs,-np.ones((np.shape(or_inputs)[0],1))), axis=1)
|
||||||
|
print " results"
|
||||||
|
print p.pcnfwd(inputs_bias)
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
|
@ -0,0 +1,85 @@
|
||||||
|
# Code from Chapter 3 of Machine Learning: An Algorithmic Perspective (2nd Edition)
|
||||||
|
# by Stephen Marsland (http://stephenmonika.net)
|
||||||
|
|
||||||
|
# You are free to use, change, or redistribute the code in any way you wish for
|
||||||
|
# non-commercial purposes, but please maintain the name of the original author.
|
||||||
|
# This code comes with no warranty of any kind.
|
||||||
|
|
||||||
|
# Stephen Marsland, 2008, 2014
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
class pcn:
|
||||||
|
""" A basic Perceptron"""
|
||||||
|
|
||||||
|
def __init__(self,inputs,targets):
|
||||||
|
""" Constructor """
|
||||||
|
# Set up network size
|
||||||
|
if np.ndim(inputs)>1:
|
||||||
|
self.nIn = np.shape(inputs)[1]
|
||||||
|
else:
|
||||||
|
self.nIn = 1
|
||||||
|
|
||||||
|
if np.ndim(targets)>1:
|
||||||
|
self.nOut = np.shape(targets)[1]
|
||||||
|
else:
|
||||||
|
self.nOut = 1
|
||||||
|
|
||||||
|
self.nData = np.shape(inputs)[0]
|
||||||
|
|
||||||
|
# Initialise network
|
||||||
|
self.weights = np.random.rand(self.nIn+1,self.nOut)*0.1-0.05
|
||||||
|
|
||||||
|
def pcntrain(self,inputs,targets,eta,nIterations):
|
||||||
|
""" Train the thing """
|
||||||
|
# Add the inputs that match the bias node
|
||||||
|
inputs = np.concatenate((inputs,-np.ones((self.nData,1))),axis=1)
|
||||||
|
# Training
|
||||||
|
change = range(self.nData)
|
||||||
|
|
||||||
|
for n in range(nIterations):
|
||||||
|
|
||||||
|
self.activations = self.pcnfwd(inputs);
|
||||||
|
self.weights -= eta*np.dot(np.transpose(inputs),self.activations-targets)
|
||||||
|
|
||||||
|
# Randomise order of inputs
|
||||||
|
#np.random.shuffle(change)
|
||||||
|
#inputs = inputs[change,:]
|
||||||
|
#targets = targets[change,:]
|
||||||
|
|
||||||
|
#return self.weights
|
||||||
|
|
||||||
|
def pcnfwd(self,inputs):
|
||||||
|
""" Run the network forward """
|
||||||
|
# Compute activations
|
||||||
|
activations = np.dot(inputs,self.weights)
|
||||||
|
|
||||||
|
# Threshold the activations
|
||||||
|
return np.where(activations>0,1,0)
|
||||||
|
|
||||||
|
|
||||||
|
def confmat(self,inputs,targets):
|
||||||
|
"""Confusion matrix"""
|
||||||
|
|
||||||
|
# Add the inputs that match the bias node
|
||||||
|
inputs = np.concatenate((inputs,-np.ones((self.nData,1))),axis=1)
|
||||||
|
|
||||||
|
outputs = np.dot(inputs,self.weights)
|
||||||
|
|
||||||
|
nClasses = np.shape(targets)[1]
|
||||||
|
|
||||||
|
if nClasses==1:
|
||||||
|
nClasses = 2
|
||||||
|
outputs = np.where(outputs>0,1,0)
|
||||||
|
else:
|
||||||
|
# 1-of-N encoding
|
||||||
|
outputs = np.argmax(outputs,1)
|
||||||
|
targets = np.argmax(targets,1)
|
||||||
|
|
||||||
|
cm = np.zeros((nClasses,nClasses))
|
||||||
|
for i in range(nClasses):
|
||||||
|
for j in range(nClasses):
|
||||||
|
cm[i,j] = np.sum(np.where(outputs==i,1,0)*np.where(targets==j,1,0))
|
||||||
|
|
||||||
|
print cm
|
||||||
|
print np.trace(cm)/np.sum(cm)
|
|
@ -0,0 +1,86 @@
|
||||||
|
# Code from Chapter 3 of Machine Learning: An Algorithmic Perspective (2nd Edition)
|
||||||
|
# by Stephen Marsland (http://stephenmonika.net)
|
||||||
|
|
||||||
|
# You are free to use, change, or redistribute the code in any way you wish for
|
||||||
|
# non-commercial purposes, but please maintain the name of the original author.
|
||||||
|
# This code comes with no warranty of any kind.
|
||||||
|
|
||||||
|
# Stephen Marsland, 2008, 2014
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
class pcn:
|
||||||
|
""" A basic Perceptron (the same pcn.py except with the weights printed
|
||||||
|
and it does not reorder the inputs)"""
|
||||||
|
|
||||||
|
def __init__(self,inputs,targets):
|
||||||
|
""" Constructor """
|
||||||
|
# Set up network size
|
||||||
|
if np.ndim(inputs)>1:
|
||||||
|
self.nIn = np.shape(inputs)[1]
|
||||||
|
else:
|
||||||
|
self.nIn = 1
|
||||||
|
|
||||||
|
if np.ndim(targets)>1:
|
||||||
|
self.nOut = np.shape(targets)[1]
|
||||||
|
else:
|
||||||
|
self.nOut = 1
|
||||||
|
|
||||||
|
self.nData = np.shape(inputs)[0]
|
||||||
|
|
||||||
|
# Initialise network
|
||||||
|
self.weights = np.random.rand(self.nIn+1,self.nOut)*0.1-0.05
|
||||||
|
|
||||||
|
def pcntrain(self,inputs,targets,eta,nIterations):
|
||||||
|
""" Train the thing """
|
||||||
|
# Add the inputs that match the bias node
|
||||||
|
inputs = np.concatenate((inputs,-np.ones((self.nData,1))),axis=1)
|
||||||
|
|
||||||
|
# Training
|
||||||
|
change = range(self.nData)
|
||||||
|
|
||||||
|
for n in range(nIterations):
|
||||||
|
|
||||||
|
self.activations = self.pcnfwd(inputs);
|
||||||
|
self.weights -= eta*np.dot(np.transpose(inputs),self.activations-targets)
|
||||||
|
print "Iteration: ", n
|
||||||
|
print self.weights
|
||||||
|
|
||||||
|
activations = self.pcnfwd(inputs)
|
||||||
|
print "Final outputs are:"
|
||||||
|
print activations
|
||||||
|
#return self.weights
|
||||||
|
|
||||||
|
def pcnfwd(self,inputs):
|
||||||
|
""" Run the network forward """
|
||||||
|
|
||||||
|
# Compute activations
|
||||||
|
activations = np.dot(inputs,self.weights)
|
||||||
|
|
||||||
|
# Threshold the activations
|
||||||
|
return np.where(activations>0,1,0)
|
||||||
|
|
||||||
|
def confmat(self,inputs,targets):
|
||||||
|
"""Confusion matrix"""
|
||||||
|
|
||||||
|
# Add the inputs that match the bias node
|
||||||
|
inputs = np.concatenate((inputs,-np.ones((self.nData,1))),axis=1)
|
||||||
|
outputs = np.dot(inputs,self.weights)
|
||||||
|
|
||||||
|
nClasses = np.shape(targets)[1]
|
||||||
|
|
||||||
|
if nClasses==1:
|
||||||
|
nClasses = 2
|
||||||
|
outputs = np.where(outputs>0,1,0)
|
||||||
|
else:
|
||||||
|
# 1-of-N encoding
|
||||||
|
outputs = np.argmax(outputs,1)
|
||||||
|
targets = np.argmax(targets,1)
|
||||||
|
|
||||||
|
cm = np.zeros((nClasses,nClasses))
|
||||||
|
for i in range(nClasses):
|
||||||
|
for j in range(nClasses):
|
||||||
|
cm[i,j] = np.sum(np.where(outputs==i,1,0)*np.where(targets==j,1,0))
|
||||||
|
|
||||||
|
print cm
|
||||||
|
print np.trace(cm)/np.sum(cm)
|
|
@ -0,0 +1,23 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import pcn_logic_eg as pcn
|
||||||
|
|
||||||
|
def main():
|
||||||
|
or_inputs = np.array( [[0,0], [0,1], [1,0], [1,1]])
|
||||||
|
or_targets = np.array([[0],[1],[1],[0]])
|
||||||
|
|
||||||
|
p = pcn.pcn(or_inputs, or_targets)
|
||||||
|
p.pcntrain(or_inputs, or_targets, 0.25, 10)
|
||||||
|
print "confusion matrix"
|
||||||
|
p.confmat(or_inputs, or_targets)
|
||||||
|
|
||||||
|
print "doing"
|
||||||
|
print " for "
|
||||||
|
print or_inputs
|
||||||
|
inputs_bias = np.concatenate((or_inputs,-np.ones((np.shape(or_inputs)[0],1))), axis=1)
|
||||||
|
print " results"
|
||||||
|
print p.pcnfwd(inputs_bias)
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
Loading…
Reference in New Issue