Pessoal, fiz um código para simular redes perceptron para tabelas verdades, uso metade de uma matriz(no caso 2 linhas) para treino da rede e o restante(2 linhas) para previsao, a mesma coisa acontece para o target. O algoritmo até funciona, me dá resultado correto porém ele me mostra o resultado como se tivesse passado a matriz inteira(com 4 linhas) e me retorna a previsao para essas 4 linhas porém ele deveria me passar a previsao somente para 2 linhas. Não consigo encontra o erro!
import pandas as arquivo
import numpy as np
class Trainer:
def _init_(self):
pass
def train(self,X,y,l=1):
erros = 1
y = np.asarray(y)
X = np.asarray(X) # transforma vetor em array
(n,m) = np.shape(X) # diz a dimensao da matriz
w = np.zeros(m+1) #dimensao de w eh m numero de colunas (n,2)
w[0] = -1
bias = np.ones((n,1))
#print(X.shape)
#print(bias.shape)
X = np.concatenate((bias,X),axis=1)
while erros>0:
erros = 0
for i,linha in enumerate(X): # ou y,x in zip(y,x)
ychapeu = np.sign(np.dot(w,linha))
if ychapeu != y[i]:
w = w + l*y[i]*linha
erros+=1
#print("w: ",w)
#print("Total de erros: : ",erros)
return Predictor(w)
#print("os pesos finas são: ",w)
class Predictor:
def __init__(self, w):
self.w = w
def predict (self, X):
X = np.asarray(X)
(n,m) = np.shape(X)
bias = np.ones((n,1))
X = np.concatenate((bias,X),axis=1)
print("X:",X)
for i,linha in enumerate(X): # ou y,x in zip(y,x)
y[i] = np.dot(self.w,linha)
return y
y = [-1,-1,-1,1] #target para AND
X = [[0,0],
[0,1],
[1,0],
[1,1]]
treino = X[:2]
valorTreino = y[:2]
tr = Trainer()
previsor = tr.train(treino,valorTreino)
previsor.predict(X[2:])