from functools import reduce import numpy as np import random class ShenJing(object): def __init__(self): self.w = np.array([[random.random(), random.random(), random.random()], [random.random(), random.random(), random.random()], [random.random(), random.random(), random.random()], [random.random(), random.random(), random.random()]]) self.x = np.array([random.random(), random.random(), random.random()]) self.v = np.array([[random.random(), random.random(), random.random(), random.random()], [random.random(), random.random(), random.random(), random.random()]]) self.y = np.array([random.random(), random.random()]) self.nea = np.array([random.random(), random.random(), random.random(), random.random()]) self.ney = np.array([random.random(), random.random()]) self.ev = np.array([[random.random(), random.random(), random.random(), random.random()], [random.random(), random.random(), random.random(), random.random()]]) self.ew = np.array([[random.random(), random.random(), random.random()], [random.random(), random.random(), random.random()], [random.random(), random.random(), random.random()], [random.random(), random.random(), random.random()]]) self.a = np.array([random.random(), random.random(), random.random(), random.random()]) self.t = np.array([0.8, 0.8]) @staticmethod def dot(x, y): return reduce(lambda a, b: a + b , ShenJing.element_multiply(x, y), 0.0) @staticmethod def element_multiply(x, y): return list(map(lambda x_y: x_y[0] * x_y[1], zip(x, y))) def sum1(self, z): # self.nea[z] = `ShenJing.dot(self.x, self.w[z - 1]) self.nea[z]=self.dot(self.x,self.w[z-1]) return self.nea def f(x): return 1. / (1 + np.exp(-x)) s = ShenJing() print("原w",s.w) print("原v",s.v) print("原y",s.y) print("t",s.t) eps = 1e-4 for abc in range(0,20): for i in range(0, 2): for j in range(0, 4): for z in range(0, 1): s.ney[i] = s.dot(s.a, s.v[i]) s.y[i] = f(s.ney[i]) #print(s.y[i], s.ney[i]) s.ev[i, j] = 2 * (s.a[j]) * (f(s.ney[i]) * (1 - f(s.ney[i])) * s.y[i] - s.t[i]) s.v[i, j] = s.v[i, j] - 0.01 * s.ev[i, j] # print(s.ev, i, j, s.a,s.y,s.ney) # print(3333333333333333333333333333333333333333333333333333333333333333333333333333333333333) for z in range(0, 1): for i in range(0, 4): for j in range(0, 3): s.nea[i] = s.dot(s.x, s.w[i]) s.a[i] = f(s.nea[i]) #print(s.a[i], s.nea[i]) s.ew[i, j] = 2 * (s.y[1] - s.t[1]) * (f(s.ney[1]) * (1 - f(s.ney[1]))) * s.v[1, i] * (f(s.nea[i]) * (1 - f(s.nea[i]))) * s.x[j] + 2 * (s.y[0] - s.t[0]) * (f(s.ney[0]) * (1 - f(s.ney[0]))) *s.v[0, i] * (f(s.nea[i]) * (1 - f(s.nea[i]))) * s.x[j] s.w[i,j] = s.w[i, j] - 0.01 * s.ew[i,j] #print(s.ew, i, j,s.y[1],s.t[1],s.nea[i]) # print("a=",s.nea,s.a) w = s.w v = s.v if __name__ == '__main__': print("w",w) print("v",v) print("y",s.y)
运行结果
原w [[0.39792296 0.03755962 0.78967184]
[0.03167502 0.21148508 0.04436276]
[0.09929411 0.16647298 0.13450978]
[0.82836028 0.47726802 0.8672888 ]]
原v [[0.56515608 0.4931406 0.26113239 0.34398535]
[0.08638857 0.49891787 0.40757679 0.73608298]]
原y [0.07366719 0.11561101]
t [0.8 0.8]
w [[0.39811859 0.03758604 0.7898546 ]
[0.03196809 0.21152465 0.04463654]
[0.0994855 0.16649882 0.13468858]
[0.82857845 0.47729748 0.8674926 ]]
v [[0.74240857 0.63216193 0.40306433 0.54158012]
[0.26427446 0.63842448 0.55001745 0.9343937 ]]
y [0.81103116 0.8192161 ]