User:Elgreengeeto/Python Perceptron

From Noisebridge
< User:Elgreengeeto
Revision as of 16:46, 14 March 2009 by Elgreengeeto (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
#a dot product is the sum of the products of aligned-elements from two
#same-lengthed arrays
def dot_product(a, b):
   sum = 0
   i = 0
   while i < len(a):
       sum += a[i] * b[i]
       i += 1
   return sum

class Perceptron:

	#percieve method takes three boolean inputs
	def percieve(self, ip1, ip2, ip3):
		#get the dot product of those inputs and the associated input's weights
		sum = dot_product([ip1, ip2, ip3],[self.ip1_weight, self.ip2_weight, self.ip3_weight])
		#return the boolean evaulation of whether or not that sum is greater than
		#or equal to the perceptron's threshhold
		return ( sum >= self.threshhold )

	#learn method compares output of percieve() to the expected output
	def learn(self, ip1, ip2, ip3, expected):
		#if output is less than expected increment the weights of
		#_non-null_ inputs by 0.1 (the weights applied to null inputs do not affect
		#output so we can't know if those weights were right or wrong)
		if self.percieve(ip1, ip2, ip3) < expected:
			if ip1:
				self.ip1_weight += self.learn_rate
				print self.ip1_weight
			if ip2:
				self.ip2_weight += self.learn_rate
				print self.ip2_weight
			if ip3:
				self.ip3_weight += self.learn_rate
				print self.ip3_weight
		#if less than expected decrement by 0.1
		elif self.percieve(ip1, ip2, ip3) > expected:
			if ip1:
				self.ip1_weight -= self.learn_rate
				print self.ip1_weight
			if ip2:
				self.ip2_weight -= self.learn_rate
				print self.ip1_weight
			if ip3:
				self.ip3_weight -= self.learn_rate
				print self.ip1_weight

	#this defines how a Perceptron object represents itself in the interpreter
	def __str__(self):
		return "Weights: %s, %s, %s. Threshhold: %s. Learn rate: %s." % (self.ip1_weight, self.ip2_weight, self.ip3_weight, self.threshhold, self.learn_rate)
	#same as above
	__repr__ = __str__
	
	#defines initial values for a new Perceptron object
	def __init__(self):
		self.ip1_weight = 0.0
		self.ip2_weight = 0.0
		self.ip3_weight = 0.0
		self.threshhold = 0.5
		self.learn_rate = 0.1

#trains a perceptron according to data, where data is a list of lists in the
#form [[boolean_value_1,boolean_value_2,boolean_value_3,expected_boolean_output],...]
def train(data, perceptron):
	for case in data:
		perceptron.learn(case[0],case[1],case[2], case[3])

#define a dataset to try and train a perceptron into becoming a NAND gate
#(turns out this data set is too small, oh Josh is a tricky teacher!)
data = [[1,0,0,1],[1,0,1,1],[1,1,0,1],[1,1,1,0]]

#do the damned thing
if __name__ == '__main__':
	subject = Perceptron()
	for i in range(1000):
		train(data, subject)
Personal tools