def entrena(conjunto, resultados, clases, n_epochs, rate_inicial, pesos_iniciales, rate_decay, summary=None): pesos = None rate = rate_inicial if pesos_iniciales == None: pesos = clasificador.genera_pesos(len(conjunto[0])) else: pesos = pesos_iniciales epoch = 0 n_errors = 1 while epoch < n_epochs and n_errors != 0: n_errors = 0 for index in range(0, len(conjunto)): prediccion = clasificador.calcular_prediccion(conjunto[index], pesos, clases, is_sigma=False) if prediccion != resultados[index]: n_errors += 1 pesos = ajusta_pesos( conjunto[index], pesos, clasificador.busca_resultado(resultados[index], clases), rate) if rate_decay: rate = clasificador.decaer_ratio(rate_inicial, epoch) if summary != None: summary.add_epoch(n_errors / len(conjunto)) epoch += 1 return pesos
def generar_conjunto_aleatorio(rango, dim, tam, separable=True, clases=None, pesos=None): hiperplano = None if pesos is None: hiperplano = Clasificador.genera_pesos(dim) else: hiperplano = pesos conjunto = [] soluciones = [] for i in range(0, tam): atributos = [] for j in range(0, dim): atributos.append(random.randint(-rango, rango)) prediccion = Clasificador.calcular_prediccion(atributos, hiperplano, None, is_sigma=False) conjunto.append(atributos) if clases != None: soluciones.append(clases[prediccion]) else: soluciones.append(prediccion) if not separable: soluciones = altera_soluciones(soluciones, rango) return (hiperplano, conjunto, soluciones)
def clasifica(self, ej): conjunto = ej if self.normaliza: conjunto = clasificador.normalizar_elemento( ej, self.media, self.desviacion) return clasificador.calcular_prediccion(conjunto, self.pesos, self.clases, is_sigma=False)