class LogisticNeuron():
    def __init__(self):
        self.w=None
        self.b=None

    def forpass(self,x):
        z=np.sum(x*self.w)+self.b
        return z
   
    def backprop(self,x,err):
        w_grad=x*err
        b_grad=1*err
        return w_grad,b_grad
   
    def activation(self,z):
        a=1/(1+np.exp(-z))
        return a
   
    def fit(self,x,y,epochs=100):
        self.w=np.ones(x.shape[1])
        self.b=0

        for i in range(epochs):
            for x_i,y_i in zip(x,y):
                z=self.forpass(x_i)
                a=self.activation(z)
                err=-(y_i-a)
                w_grad,b_grad=self.backprop(x_i,err)
                self.w-=w_grad
                self.b-=b_grad

    def predict(self,x):
        z=[self.forpass(x_i) for x_i in x]
        a=self.activation(np.array(z))
        return a>0.5
   
class TanhNeuron():
    def __init__(self):
        self.w=None
        self.b=None

    def forpass(self,x):
        z=np.sum(x*self.w)+self.b
        return z
   
    def backprop(self,x,err):
        w_grad=x*err
        b_grad=1*err
        return w_grad,b_grad
   
    def activation(self,z):
        a=(np.tanh(z)+1)/2
        return a
   
    def fit(self,x,y,epochs=100):
        self.w=np.ones(x.shape[1])
        self.b=0
        for i in range(epochs):
            for x_i,y_i in zip(x,y):
                z=self.forpass(x_i)
                a=self.activation(z)
                err=-(y_i/a+(y_i-1)/(1-a))*(1-(np.tanh(z))**2)
                w_grad,b_grad=self.backprop(x_i,err)
                self.w-=w_grad
                self.b-=b_grad
   
    def predict(self,x):
        z=[self.forpass(x_i) for x_i in x]
        a=self.activation(np.array(z))
        return a>0.5
cancer=load_breast_cancer()

x=cancer.data
y=cancer.target

x_train,x_test,y_train,y_test=train_test_split(x,y,stratify=y,test_size=0.2,random_state=42)

neuron=LogisticNeuron()
neuron.fit(x_train,y_train)
print(np.mean(neuron.predict(x_test)==y_test))

tanhneuron=TanhNeuron()
tanhneuron.fit(x_train,y_train)
print(np.mean(tanhneuron.predict(x_test)==y_test))

이렇게 class 만들어 훈련시켰는데 tanh 뉴런의 정확도가 너무 떨어져서 tanhneuron.fit 안에 있는 z를 출력하니까 계속 nan이 나와요 왜 그런건가요??