#and
#print ("and")
#t_s = [((1, 0, 0), 0), ((1, 0, 1), 0), ((1, 1, 0), 0), ((1, 1, 1), 1)]
#or
#print ("or")
#t_s = [((1, 0, 0), 0), ((1, 0, 1), 1), ((1, 1, 0), 1), ((1, 1, 1), 1)]
#nand
#print ("nand")
#t_s = [((1, 0, 0), 1), ((1, 0, 1), 1), ((1, 1, 0), 1), ((1, 1, 1), 0)]
#xor
print ("xor")
t_s = [((1, 1, 1), 0), ((1, 0, 1), 1), ((1, 1, 0), 1), ((1, 1, 1), 0)]
threshold = 0.5
learning_rate = 0.1
w = [0, 0, 0]
def dot_product(values, weights):
return sum(value * weight for value, weight in zip(values, weights))
def train_perceptron(threshold, learning_rate, weights, training_set):
while True:
#print('-' * 60)
error_count = 0
for input_vector, desired_output in training_set:
#print(weights)
result = dot_product(input_vector, weights) > threshold
error = desired_output - result
if error != 0:
error_count += 1
for index, value in enumerate(input_vector):
weights[index] += learning_rate * error * value
if error_count == 0: #iterate till there's no error
break
return training_set
t_s = train_perceptron(threshold, learning_rate, w, t_s)
t_s = [(a[1:], b) for a, b in t_s]
for a, b in t_s:
print "input: " + str(a) + ", output: " + str(b)
CgojYW5kIAojcHJpbnQgKCJhbmQiKQojdF9zICAgICAgICAgICA9IFsoKDEsIDAsIDApLCAwKSwgKCgxLCAwLCAxKSwgMCksICgoMSwgMSwgMCksIDApLCAoKDEsIDEsIDEpLCAxKV0KCiNvcgojcHJpbnQgKCJvciIpCiN0X3MgICAgICAgICAgID0gWygoMSwgMCwgMCksIDApLCAoKDEsIDAsIDEpLCAxKSwgKCgxLCAxLCAwKSwgMSksICgoMSwgMSwgMSksIDEpXQoKI25hbmQKI3ByaW50ICgibmFuZCIpCiN0X3MgICAgICAgICAgID0gWygoMSwgMCwgMCksIDEpLCAoKDEsIDAsIDEpLCAxKSwgKCgxLCAxLCAwKSwgMSksICgoMSwgMSwgMSksIDApXQoKI3hvcgpwcmludCAoInhvciIpCnRfcyAgICAgICAgICAgPSBbKCgxLCAxLCAxKSwgMCksICgoMSwgMCwgMSksIDEpLCAoKDEsIDEsIDApLCAxKSwgKCgxLCAxLCAxKSwgMCldIAoKCnRocmVzaG9sZCAgICAgPSAwLjUKbGVhcm5pbmdfcmF0ZSA9IDAuMQp3ICAgICAgICAgICAgID0gWzAsIDAsIDBdCgpkZWYgZG90X3Byb2R1Y3QodmFsdWVzLCB3ZWlnaHRzKToKCXJldHVybiBzdW0odmFsdWUgKiB3ZWlnaHQgZm9yIHZhbHVlLCB3ZWlnaHQgaW4gemlwKHZhbHVlcywgd2VpZ2h0cykpCiAKZGVmIHRyYWluX3BlcmNlcHRyb24odGhyZXNob2xkLCBsZWFybmluZ19yYXRlLCB3ZWlnaHRzLAl0cmFpbmluZ19zZXQpOgoJd2hpbGUgVHJ1ZToKCSAgICAjcHJpbnQoJy0nICogNjApCgkgICAgZXJyb3JfY291bnQgPSAwCgoJICAgIGZvciBpbnB1dF92ZWN0b3IsIGRlc2lyZWRfb3V0cHV0IGluIHRyYWluaW5nX3NldDoKCSAgICAgICAgI3ByaW50KHdlaWdodHMpCgkgICAgICAgIHJlc3VsdCA9IGRvdF9wcm9kdWN0KGlucHV0X3ZlY3Rvciwgd2VpZ2h0cykgPiB0aHJlc2hvbGQKCSAgICAgICAgZXJyb3IgID0gZGVzaXJlZF9vdXRwdXQgLSByZXN1bHQKCSAgICAgICAgCgkgICAgICAgIGlmIGVycm9yICE9IDA6CgkgICAgICAgICAgICBlcnJvcl9jb3VudCArPSAxCgkgICAgICAgICAgICBmb3IgaW5kZXgsIHZhbHVlIGluIGVudW1lcmF0ZShpbnB1dF92ZWN0b3IpOgoJICAgICAgICAgICAgICAgIHdlaWdodHNbaW5kZXhdICs9IGxlYXJuaW5nX3JhdGUgKiBlcnJvciAqIHZhbHVlCgoJICAgIGlmIGVycm9yX2NvdW50ID09IDA6ICNpdGVyYXRlIHRpbGwgdGhlcmUncyBubyBlcnJvciAKCSAgICAgICAgYnJlYWsKCXJldHVybiB0cmFpbmluZ19zZXQKCnRfcyA9IHRyYWluX3BlcmNlcHRyb24odGhyZXNob2xkLCBsZWFybmluZ19yYXRlLCB3LCB0X3MpCgp0X3MgPSBbKGFbMTpdLCBiKSBmb3IgYSwgYiBpbiB0X3NdCgpmb3IgYSwgYiBpbiB0X3M6CglwcmludCAiaW5wdXQ6ICIgKyBzdHIoYSkgKyAiLCBvdXRwdXQ6ICIgKyBzdHIoYikKCg==