import numpy as np
import nn
import math
number=100
number_eq=3
number_var=2
x=[]
for i in range(100):
r1=np.random.random()
r2=np.random.random()
x.append([r1,r2])
y=[]
for i in range(100):
r3=0
h=0
if 3*x[i][0]-2*x[i][1]>0.5:h=h+1
if h==1:r3=1
y.append(r3)
link=[[2,0,1],[3,0,1],[4,2,3],[5,2,3],[6,4,5]]
a=np.zeros([number_eq,number_var+1])
for eq1 in range(number_eq):
for u in range(number_var+1):
a[eq1][u]=np.random.random()
for tr in range(200):
for eq1 in range(number_eq):
sub=nn.nn()
sub.x=x
sub.y=y
sub.a=a
sub.link=link
sub.number=number
sub.number_eq=number_eq
sub.number_var=number_var
sub.makedata(eq1)
a=sub.a
es=np.zeros([5,number])
for i in range(number):
es[0][i]=x[i][0]
es[1][i]=x[i][1]
for n in range(number_eq):
for i in range(number):
f1=a[n][0]
for j in range(number_var):
n1=link[n][j+1]
f1=f1+a[n][j+1]*es[n1][i]
n1=link[n][0]
f2=0
if f1>0:f2=1
es[n1][i]=f2
c=0
for i in range(number):
if y[i]==es[4][i]:c=c+1
print(c)
print(a)
import numpy as np
import math
class nn:
def g(self):
g1=0
for i in range(self.number):
g1=g1+(self.y[i]-self.e[4][i])*(self.y[i]-self.e[4][i])
return g1
def f(self,ax):
for n in range(self.number_eq):
for i in range(self.number):
f1=ax[n][0]
for j in range(self.number_var):
n1=self.link[n][j+1]
f1=f1+ax[n][j+1]*self.e[n1][i]
n1=self.link[n][0]
self.e[n1][i]=1/(1+math.exp(-f1))
def makedata(self,eqs):
self.e=np.zeros([7,self.number])
ax=np.zeros([self.number_eq,self.number_var+1])
df=np.zeros([self.number_var+1])
for i in range(self.number):
self.e[0][i]=self.x[i][0]
self.e[1][i]=self.x[i][1]
for i in range(self.number_eq):
for j in range(self.number_var+1):
ax[i][j]=self.a[i][j]
self.f(ax)
g1=self.g()
for k in range(self.number_var+1):
for i in range(self.number_eq):
for j in range(self.number_var+1):
ax[i][j]=self.a[i][j]
ax[eqs][k]=ax[eqs][k]+0.01
self.f(ax)
g2=self.g()
df[k]=(g2-g1)/0.01
sig=0
for mx in range(self.number_var+1):
sig=sig+df[mx]*df[mx]
if sig>0.01:
for eq2 in range(self.number_eq):
for mx in range(self.number_var+1):
ax[eq2][mx]=self.a[eq2][mx]
if eq2==eqs:ax[eq2][mx]=self.a[eq2][mx]-0.05*g1*df[mx]/sig
self.f(ax)
g3=self.g()
print(g3)
if g3<g1:
for eq2 in range(self.number_eq):
for mx in range(self.number_var+1):
self.a[eq2][mx]=ax[eq2][mx]
最終更新:2018年03月05日 11:53