Introdução

No presente texto, busca-se demonstrar o teorema de convergência do perceptron. Em primeiro, fazendo um rápido passeio aleatório pelo arcabouço conceitual das Redes Neurais Artificiais (RNA’s) de camada única até a exposição do teorema de convergência; em seguida, aplicando RNA’s na famigerada base de dados Iris com o package Neuralnet e, por fim, aplicando o perceptron de camada única manualmente encontrando a convergência.

Preâmbulo: Redes Neurais Artificiais de única camada

A pedra angular das RNA’s é a otimização de pesos. Os pesos representam o ponto axial nas respostas geradas por um algoritmo de RNA – seja em problemas de classificação ou em problemas de predição. Fazendo um paralelismo com a neurociência, os pesos funcionam como as sinapses da estrutura cerebral – óbvio, como um modelo lúdico que busca simplificar a estrura neural de forma algébrica. Normalmente, pode-se atribuir um peso por variável de entrada, isto é, para cada \(x_{i}\) um \(w_{i}\). No qual busca-se sucessivamente pesos que atualizam em cada estágio de iteração a minimização dos erros de saída. De grosso modo, inicia-se com os pesos \(w(t)\), atualizando sucessivamente \(\Delta w\) encontrando nos estágios posteriores \(w(t+1) = w(t)+\Delta w\) um melhor ajustamento que os pesos iniciais \(w(t)\), assim, minimizando os erros de saída. Como sintetiza Braga, Carvalho & Ludermir (2000, p. 36): […] os algoritmos de aprendizado em RNAs visam ao desenvolvimento de técnicas para a obtenção do valor de \(\Delta w\) mais apropriado para a obtenção da solução do problema em questão.

O perceptron de única camada – sinônimo para Rede Neural Artifical de uma ou única camada – é estritamente um classificador linear; reservado para resolver apenas problemas linearmente separáveis. Com esse background, portanto, dado um problema de classificação binária, na qual a saída retorna 1 ou 0, pode-se iniciar a formalização do perceptron simples definindo a função de ativação:

\[ f_{\Phi}(x) = \begin{cases} 1 \space \space \space \space se & \ b + x_{i}w_{i} > 0 \\ 0 & \space Caso \space \space Contrário \\ \end{cases} \]

Passando a notação para uma formalização mais apropriada:

\[ f_{\Phi} = b+ \sum_{i=1}^n x_{i}w_{i} \]

Observe que, como mencionado anteriormente, as entradas passam conectadas na multiplicação com seus respectivos pesos. Por usa vez, \(b\) representa o viés. A qual como bem define Pallavi Bharadwaj, 2020: […] the bias ‘b’ is like the intercept in the linear equation. It’s a constant that helps the model adjust in a way that best fits the data. The bias term assumes an imaginary input feature coefficient \(x_{0}=1\).

Por outro lado, a função de ativação representa o bloco do algoritmo após a aplicação da somatória das entradas com seus respectivos pesos – a qual é utilizada para ativação do nodo ou, em outros termos, para classificação binária. A função de ativação nesse caso do perceptron simples, pode ser definida pela Step Function binária ou, para os íntimos, “tudo ou nada”. É a formulação mais simples e justamente por isso pouco aplicada em RNA’s multicamadas com topologias mais complexas. A step function no caso 0 e 1, após passada o resultado das conexões somadas, classifica como 1 caso for maior que zero; caso contrário, classifica como zero. Ou seja, uma função de ativação “tudo ou nada”.Para funções de ativação mais complexas e mais utilizadas, recomendo forte o texto de Aditya Sharma, 2017. Dito isso, a seguir pode-se visualizar a arquitetura básica do perceptron:

Rede de Perceptron de uma camada PROCHA, 2017

Observe que, como mencionado exaustivamente anteriormente, as entradas passam multiplicando com os pesos até a soma, posteriormente, passando para a função de ativação até a saída. Com essa estrutura simples, com multiplicações e adições, Rosemblatt (1958) inundou os centros de pesquisa em Inteligência Artificial (IA) com emplogação. Bem, apenas até os trabalhos de Minsky & Papert (1969): a linearidade, isto é, necessidade da separação de duas regiões num plano bidimensional por uma reta ou num hiperplano para casos n-dimensionais era e permanece sendo uma grande fraqueza do perceptron de uma camada. Assim, jogando a IA no seu primeiro inverno. Restanto os discidentes, como Sejnowski (2019) gosta de salientar.

Nem mesmo posteriormente ao trabalho de Rosemblatt (1960) mostrando a convergência do perceptron – o algoritmo atualiza os pesos nos casos de problemas linearmente separáveis atá a exaustão, isto é, até convergir com os erros para zero – não tirou as redes neurais do “período de inverno”. Bem os erros de forma simplificada podem ser formulados como a diferença das saídas desejadas \(d\) menos as saídas calculadas \(y\). Assim, os erros podem ser definidos como segue:

\[ e(t)=d(t)-y(t) \] No caso de atualização, os pesos com as entradas para o neurônio \(i\) no tempo \(t+1\) é atualizado da seguinte forma:

\[ w(t+1) = w(t)+ \lambda ex(t) \] Aqui entra outro bloco do algoritmo, taxa de aprendizagem representada por \(\lambda\). A qual de grosso modo é uma medida de velocidade com que o vetor de pesos é atualizado. Foge do escopo do presente trabalho os promenores da taxa de aprendizagem, principalmente, dado o foco no perceptron com única camada. Pois bem, então, a atualização dos pesos ocorre dado os pesos no instante \(t\) mais a taxa de aprendizagem (número que varia de 0 a 1) multiplicado pelos erros e pelas entradas. Na próxima secção explora-se de forma mais detalhada os erros com o teorema da convergência.

Teorema da convergência do perceptron

Como mencionado anteriormente, Rosemblatt (1960) demonstrou que há convergência no algoritmo perceptron quando o problema é linearmente separável. Busca-se a seguir fazer uma exposição do teorema e posteriomente, nas próximas secções, verificar como os erros se comportam em problemas dessa natureza. Diga-se de passagem, a presente demontração segue a demonstração de Braga, Carvalho & Ludermir (2000, p. 38-41). Apenas com algumas modificações na notação quando oportuno e com comentários adicionais, portanto, cabendo o crédito aos outores referenciados. A prova para tal teorema pode ser encontrado também em Novikoff (1960).

Dado um conjunto de treinamento para um neurônio qualquer da camada de reposta com duas classes linearmente separáveis \(C_{1}\) e \(C_{2}\), digamos, para classificação, o conjunto de treinamento com \(n\) elementos \(\Gamma = {[(x^i, y^i_d)]^n_{i=1}}\) pode ser dividido em dois subconjuntos:

\[ \Gamma_{1} = {[(x^i, 1)]^n_{i=1}} \in C_{1} \] \[ \Gamma_{2} = {[(x^i,0)]^n_{i=1}} \in C_{2} \] Observe que aqui temos um problema binário. Como mencionado, digamos, de classificação. As respostas nesse caso, com as entradas \(x_{i}\) podem ser 0 ou 1 na saída. Uma clássica e básica classificação binária. Tal que \(\Gamma\) = \(\Gamma_{1}\) \(\cup\) \(\Gamma_{2}\) e \(n_{1} + n_{2} = n\). Assim, admite-se então que existe solução \(w_{0}\) tal que:

\[ W_{0}^T x^i \ge 0 \space \space \space \space \forall x_{i} \in C_{1} \] \[ W_{0}^T x^i < 0 \space \space \space \space \forall x_{i} \in C_{2} \]

Portanto, o problema do treinamento se resume então a achar \(w_0\) que seja solução para a separação das duas classes \(C_1\) e \(C_2\) (Braga, Carvalho & Ludermir, 2000, p. 39). Na notação anterior, simplesmente foi exposto essa condição de “separabilidade”: se for maior ou igual a zero, pertence a \(C_1\), caso for menor que zero, pertence a \(C_2\). Ah! Sim, para todo \(x_{i}\) conectado aos seus respectivos pesos \(w_0^T\).

Caso não ocorra a classificação com 100% de acurácia com a primeira rodada de pesos, durante o treinamento pode-se aplicar atualização dos pesos para minimizar os erros e encontrar a convergência. Os pesos serão atualizados da seguinte forma seguindo as condições:

\[ w(t+1) = w(t)+ \lambda x(t) \space \space \space \space \space se \space \space \space \space w^T(t)x(t)< 0 \space \space \space \space \space e \space \space \space \space \space x(t) \in C_1 \]

\[ w(t+1) = w(t) - \lambda x(t) \space \space \space \space \space se \space \space \space \space w^T(t)x(t) \ge 0 \space \space \space \space \space e \space \space \space \space \space x(t) \in C_2 \]

Ou seja, o processo de atualização \(w(t+1) = w(t)+ \lambda x(t)\) ocorre, no primeiro caso, quando o retorno da multiplicação das entradas com seus respectivos pesos for menor que 0; e, no segundo caso, atualiza caso a mutiplicação retornar maior ou igual a 0 (em ambos os casos representando erro de classificação). Lembrando que a taxa de aprendizagem \((\lambda)\) tem influência apenas no tempo de convergência. Até aqui imagino que já tenha ficado claro o processo de atualização. Agora caso classifique incorretamente, digamos, \(t_{1}\) vetores da classe \(C_{1}\) e \(t_{2}\) vetores para \(C_{2}\) na qual \(t =t_{1} + t_{2}\) representa as classificações incorretas no instante \(t\), como atualizar os pesos? Bem, com classes linearmente separáveis pode-se afirmar que existe uma solução \(w_{0}\). Considerando as duas equações anteriores e \(\lambda = 1\) podemos chegar na equação seguinte com \(w_{0}\):

\[ w_{0}^T w(t+1) = w_{0}^T \sum_{i=1}^{t_1}x(t_{1}^i) - w_{0}^T \sum_{j=1}^{t_2}x(t_{2}^i) \] \[ w_{0}^T w(t+1) = w_{0}^T \sum_{i=1}^{t}x(t) \]

Note os sinais de adição e subtração na primeira e segunda equação anterior. Assim, facilmente chega-se na última formulação. Para uma solução fixa de \(w_{0}\) podemos buscar uma minimização:

\[ \alpha = min [w_{0}^Tx(t)] \]

Com a inequação de Cauchy-Schwarz pode-se concluir para os vetores \(w_{0}\) e \(w(t+1)\) que a inequação a seguir é válida:

\[ \parallel w_{0}\parallel^2 \space \|w(t+1)\|^2 \ge (w_{0}^T w(t+1))^2 \] Nos levando:

\[ \|w_{0}\|^2 \|w(t+1)\|^2 \ge t^2 \alpha^2 \] \[ \|w(t+1)\|^2 \ge \frac{t^2\alpha^2}{\|w_{0}\|} \] Caso desconheça a inequação de Cauchy recomendo, ver Desigualdade de Cauchy-Schwarz. Assim, para ocorrer convergência é necessário que a norma \(w(t+1)\) seja limitada. Esse é o próximo bloco da demonstração. Com \(\lambda = 1\) pode-se escrever aquela equação de atualização dos pesos anterior como segue:

\[ w(t+1) = w(t) + ex(t) \] Obtendo a norma dos dois lados e elevando ambos os lados ao quadrado:

\[ \|w(t+1)\|^2 = \|w(t) + ex(t)\|^2 \] Expandido:

\[ \|w(t+1)||^2 = [w_{1}(t)^2+w_{2}(t)^2 +....+w_n(t)^2]+e[x_{1}(t)^2+x(t)^2+....+x_n(t)^2]+2e[w_{1}(t)x_{1}(t)+w_{2}(t)x_{2}(t)+...+w_n(t)x_n(t)] \] \[ \|w(t+1)\|^2 = \|w(t)\|^2 + e\|x(t)\|^2 + 2ew^{T}(t)x(t) \]

Com essa últiam formulação, obtendo erro igual a 1, isto é, \(e = 1\) dado \(d = 1\) e \(y= 0\), lembre-se de \(e(t)=d(t)-y(t)\), tem-se que:

\[ w^T(t)x(t)<0 \] O que implica: \[ \|w(t)\|^2 + \|x\|^2 \ge \|w(t)||^2 + e\|x(t)\|^2 + 2ew^T(t)x(t) \] O que é verdade para \(e=-1\) também. Portanto: \[ \|w(t+1)||^2 \le \|w(t)\|^2 + \|x(t)\|^2 \] \[ \|w(t+1)\|^2 - \|w(t)\|^2 \le \|x(t)\|^2 \] Somando os \(t\) primeiros termos da equação anterior:

\[ \|w(t+1)\|^2 \le \sum_{i=1}^t \|x(i)\|^2 \] Definindo \(\beta = \begin{matrix} max \\i=1,2...,t\\\end{matrix}\) \(\|x(i)\|^2\), pode-se escrever outra condição de limite para o vetor \(\|w(t+1)\|\):

\[ \|w(t+1)\|^2 \le \beta t \] Portanto, tanto a formulação anterior quando \(\|w(t+1)\|^2 \ge \frac{t^2\alpha^2}{\|w_{0}\|}\) implicam na existência de um limite \(t\) para as operações de ajuste, ja que:

\[ 0 \le t \le \frac{\beta \|w_{o}\|^2}{\alpha^2} \] Assim, \(t = \frac{\beta \|w_{0}\|^2}{\alpha^2}\), limita o número de interações. Implicando sempre na convergência em tempo finito.

Aplicando um rede neural de um camada manualmente

Parte I - Packages e base de dados

Apesar de buscar um aplicação “manual” do perceptron, utilizou-se de alguns pacotes/bibliotecas para facilitar na codificação. Os packages utilizados podem ser visualizados a seguir. Por sua vez, a base de dados utilizada é a famigerada Iris – disponível na base do R. Tratando-se de uma RNA’s com uma camada utilizou-se apenas duas entradas, isto é, duas variáveis independentes da base de dados e duas espécies de flores (saídas). As quais foram Sepal.Width e Petal.Width, na entrada; e, por sua vez, setosa e versicolor como saída. Há uma explicação teórica-estatística do porquê a escolha de apenas de duas saídas (no caso, setosa e versicolor). Antes de entrada nesses detalhes vamos visualizar os dados

rm(list=ls()) # Limpando

# Packages 

library(tidyverse)
library(GGally)
library(cluster)
library(factoextra)
library(caret)
library(caTools)
library(knitr)
library(rmarkdown)
library(neuralnet)
library(NeuralNetTools)
# Database 
data_base <- iris # Dataset Iris 

## Filtrando e selecionando as variáveis  

data_base <- data_base %>% filter(Species %in% c("setosa", "versicolor")) %>% 
  select(Sepal.Width,Petal.Width, Species)

data_base %>% 
  head() %>% 
  DT::datatable() # Plotando a base em uma table

Parte II - Análise Exploratória

O porquê da seleção das variáveis da base de dados é explicada justamente pelo ponto fraco do perceptron de uma camada: o problema precisa ser linearmente separável. A exemplificação e aplicação aqui parte de um problema de classificação supervisionada, ou seja, na qual sabe-se das classificações de saída, porém, no caso da RNA de uma camada, necessariamente, precisa-se de classificações linearmente separáveis para a encontrar convergência. Diga-se de passagem, Pallavi Bharadwaj, 2020 fez uma aplicação semelhante, porém em linguagem Python. Dito isso, vamos visualizar esses dados de forma mais minuciosa. Inicia-se observando a relação em um gráfico de dispersão com ajustamento local e, posteriomente, com uma correlação de Pearson entre as entradas:

## Visualizando a variável de entrada 

ggplot(data_base, aes(y = Petal.Width, 
  x = Sepal.Width, colour = Species))+
  geom_point(pch=19, size= 4)+
  geom_smooth(method = "loess", fill="black", col="red")+
  theme_bw()+
  theme(legend.position = "bottom")+
  ggtitle("Sepal.Width vs Petal.Width", 
  subtitle = "Elaboração de Luiz Paulo T. Gonçalves") # Gráfico de Dispersão

ggpairs(data_base[, 1:2], lower = list(continuos="smooth"))+
  ggtitle("Correlação de Pearson entre Sepal.Width & Petal.Width", 
      subtitle = "Elaboração de Luiz Paulo T. Gonçalves")+
  theme_bw() # Correlação de Pearson

É visível que escolhendo Sepal.Width e Petal.Width encontra-se uma problema que é linearmente separável. Assim, abrindo espaço para testar a convergência posteriormente. Pois bem, não satisfeito, vamos visualizar mais de perto essas duas nuvens de dados formadas na dispersão – as quais podem ser separadas facilmente. Aplicando uma simples clusterização – em primeiro com distância Euclidiana e depois com Manhattan – dado o número de espécies na saída (\(k=2\)), temos:

# Clustering CLARA 

cluster_euclidean <- clara(x = data_base[, 1:2], k=2, 
      metric = "euclidean", stand = T, pamLike = T) # Com Distância Euclidiana 

fviz_cluster(object = cluster_euclidean,
                ellipse.type = "t", geom = "point", pointsize = 4.0)+
  ggtitle("Clustering CLARA - Distância Euclidiana", 
          subtitle = "Elaboração de Luiz Paulo T. Gonçalves")+
  theme_bw()+
  theme(legend.position = "bottom")

cluster_manhattan <- clara(x = data_base[, 1:2], k=2, 
  metric = "manhattan", stand = T, pamLike = T) # Com Distância de Manhattan

fviz_cluster(object = cluster_euclidean,
      ellipse.type = "t", geom = "point", pointsize = 4.0)+
  ggtitle("Clustering CLARA - Distância de Manhattan", 
          subtitle = "Elaboração de Luiz Paulo T. Gonçalves")+
  theme_bw()+
  theme(legend.position = "bottom")

Parte III - Organizando e pré processando a base de dados

Com a linearidade separável explicítada, passo agora ao pré processamento e organização dos dados para finalmente aplicar a rede neural de uma camada. Primeiro, vou passar as saídas (setoda e versicolor) para binárias – na qual setosa vai ser 1 e versicolor 2 (portanto, a função de ativação nesse caso vai centrar em 1 e 2). Em segundo, vou padronizar as duas entradas. E, em terceiro e último, apenas por questão de protocolo, vou subdividir a base de dados em treino e teste. Feito isso, vamos visualizar novamente a base de dados completa (sem a separação treino e teste):

# Organizando e pre-processando a base de dados 

data_base$Species = as.numeric(data_base[, 3]) # Passando para numérico a variável de saída: 1 para setosa; 2 para versicolor
data_base[, 1:2] <- scale(data_base[, 1:2])
## Dividindo a base em treino e teste 

set.seed(123) # Semente geradora 

division <- sample.split(data_base$Sepal.Width, SplitRatio = 0.85)
base_treino = subset(data_base, division == T)
base_teste = subset(data_base, division == F )

data_base %>% 
  head() %>% 
  DT::datatable() # Plotando a base em uma table

Parte IV - Pequena pausa: visualizando a estrura da RNA com o pacote Neuralnet

Antes de prosseguir para a aplicação manual do perceptron, vou fazer uma pequena pausa para visualizar a estrutura da rede neural usando o pacote Neuralnet (package popular na comunidade R, principalmente, dado suas funcionalidade para visualizações). O objetivo com Neuralnet aqui é apenas de visualização mesmo. Diga-se de passagem, nesse caso vou configurar a RNA com a função de ativação logística. Dito isso, vamos as visualizações:

classificador_neural <- neuralnet(Species~ Sepal.Width + Petal.Width, 
                                  data = base_treino, hidden = 1, 
                                  act.fct = "logistic")


plot(classificador_neural)


plotnet(classificador_neural, pos_col = "red", neg_col = "blue", 
        alpha_val = 0.5)

Rede de Perceptron de uma camada Rede de Perceptron de uma camada Como meu objetivo era visual, não alterei em muito as configurações de processamento da RNA. Conservei a função de ativação como logística (a qual é mais refinada estatisticamente do que a step function binária) e configurei hidden = 1.

Parte V - Mão na massa: montando o perceptron manualmente

Finalmente vou iniciar a codificação do perceptron manualmente. Vou fazer passo a passo por bloco – o código poderia ser facilmente resumido em menos linhas de forma mais limpa.

# Usar apenas a base de treino - Subdividir em entrada e saida para facilitar no manuseio posterior

entrada <- select(base_treino, Sepal.Width, Petal.Width)
saida <- select(base_treino, Species)

# Passando para o formato matriz 
entradas <- as.matrix(entrada)
saidas <- as.matrix(saida)

## Montando o Perceptron 

pesos = matrix(c(0.0, 0.0)) # Pesos iniciais 
learning_r = 0.1 # Taxa de Aprendizagem

# Step Function 

stepFunction = function(soma) {
  if (soma >= 2) {
    return (2)
  }
  return (1)
}

# Saída 

calculaSaida = function(registro) {
  soma = registro %*% pesos
  return (stepFunction(soma))}

Observe que configurei os pesos iniciais iguais a zero, isto é, as duas entradas vão iniciar com pesos zeros (retornando zero nas primeiras multiplicações). Em segundo de forma arbitrária ou por princípio de prudência, configurei a taxa de apredinzagem para \(0.1\). Posteriormente programei a saída e uma simples step function: caso for maior ou igual a 2, retorna 2; caso contrário, retorna classificado como 1 (como setosa). Passo agora ao último passo. Jogar tudo dentro de while e for numa estrutura de repetição para a atualização dos pesos até convergir como demonstrado na parte teórica anteriormente. Ou seja, aplicar uma estrutura de repetição! Daqui pra frente não tenho muito o que dizer, ou melhor, segue o código:

total_error = 1

processo_aprendizado <- while(total_error != 0){
  total_error = 0 
  for(i in 1:length(saidas)){
    saidas_computadas = calculaSaida(c(entradas[i,]))
    erro = abs(saidas[i] - saidas_computadas)
    total_error = total_error + erro
    for(j in 1:length(pesos)){
      pesos[j] = pesos[j] + (learning_r * entradas[i,j] * erro)
      print(paste("Atualizando os pesos:", pesos[j]))
    }
  }
  print(paste("Erro Total:", total_error))
}
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0"
## [1] "Atualizando os pesos: 0.0210970960518793"
## [1] "Atualizando os pesos: 0.108643134901172"
## [1] "Atualizando os pesos: 0.0421941921037586"
## [1] "Atualizando os pesos: 0.234980591447485"
## [1] "Atualizando os pesos: 0.0424030742428861"
## [1] "Atualizando os pesos: 0.361318047993799"
## [1] "Atualizando os pesos: -0.124493754920001"
## [1] "Atualizando os pesos: 0.452266861249829"
## [1] "Atualizando os pesos: -0.186949514519129"
## [1] "Atualizando os pesos: 0.578604317796142"
## [1] "Atualizando os pesos: -0.249405274118256"
## [1] "Atualizando os pesos: 0.669553131052172"
## [1] "Atualizando os pesos: -0.207419964153625"
## [1] "Atualizando os pesos: 0.813584909243628"
## [1] "Atualizando os pesos: -0.35342857940376"
## [1] "Atualizando os pesos: 0.851450757564232"
## [1] "Atualizando os pesos: -0.394996125090136"
## [1] "Atualizando os pesos: 0.942399570820261"
## [1] "Atualizando os pesos: -0.478340098602016"
## [1] "Atualizando os pesos: 1.05104270572143"
## [1] "Atualizando os pesos: -0.707901569503158"
## [1] "Atualizando os pesos: 1.08890855404204"
## [1] "Atualizando os pesos: -0.728580901276782"
## [1] "Atualizando os pesos: 1.21524601058835"
## [1] "Atualizando os pesos: -0.91636594435242"
## [1] "Atualizando os pesos: 1.25311185890895"
## [1] "Atualizando os pesos: -0.957933490038797"
## [1] "Atualizando os pesos: 1.34406067216498"
## [1] "Atualizando os pesos: -0.957724607899669"
## [1] "Atualizando os pesos: 1.45270380706616"
## [1] "Atualizando os pesos: -0.957724607899669"
## [1] "Atualizando os pesos: 1.45270380706616"
## [1] "Atualizando os pesos: -0.957724607899669"
## [1] "Atualizando os pesos: 1.45270380706616"
## [1] "Atualizando os pesos: -0.957724607899669"
## [1] "Atualizando os pesos: 1.45270380706616"
## [1] "Atualizando os pesos: -0.957724607899669"
## [1] "Atualizando os pesos: 1.45270380706616"
## [1] "Atualizando os pesos: -1.0201803674988"
## [1] "Atualizando os pesos: 1.54365262032219"
## [1] "Atualizando os pesos: -1.0201803674988"
## [1] "Atualizando os pesos: 1.54365262032219"
## [1] "Atualizando os pesos: -1.08263612709793"
## [1] "Atualizando os pesos: 1.61690711193307"
## [1] "Atualizando os pesos: -1.1242036727843"
## [1] "Atualizando os pesos: 1.7078559251891"
## [1] "Atualizando os pesos: -1.1242036727843"
## [1] "Atualizando os pesos: 1.7078559251891"
## [1] "Atualizando os pesos: -1.1242036727843"
## [1] "Atualizando os pesos: 1.7078559251891"
## [1] "Atualizando os pesos: -1.1242036727843"
## [1] "Atualizando os pesos: 1.7078559251891"
## [1] "Atualizando os pesos: -1.1242036727843"
## [1] "Atualizando os pesos: 1.7078559251891"
## [1] "Atualizando os pesos: -1.22843586020893"
## [1] "Atualizando os pesos: 1.74572177350971"
## [1] "Atualizando os pesos: -1.22843586020893"
## [1] "Atualizando os pesos: 1.74572177350971"
## [1] "Atualizando os pesos: -1.22843586020893"
## [1] "Atualizando os pesos: 1.74572177350971"
## [1] "Atualizando os pesos: -1.22843586020893"
## [1] "Atualizando os pesos: 1.74572177350971"
## [1] "Atualizando os pesos: -1.22843586020893"
## [1] "Atualizando os pesos: 1.74572177350971"
## [1] "Atualizando os pesos: -1.22843586020893"
## [1] "Atualizando os pesos: 1.74572177350971"
## [1] "Atualizando os pesos: -1.22843586020893"
## [1] "Atualizando os pesos: 1.74572177350971"
## [1] "Atualizando os pesos: -1.22843586020893"
## [1] "Atualizando os pesos: 1.74572177350971"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Erro Total: 20"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.24911519198256"
## [1] "Atualizando os pesos: 1.83667058676574"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Erro Total: 1"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.22801809593068"
## [1] "Atualizando os pesos: 1.94531372166691"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Erro Total: 1"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.2069209998788"
## [1] "Atualizando os pesos: 2.05395685656808"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Erro Total: 1"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Atualizando os pesos: -1.18582390382692"
## [1] "Atualizando os pesos: 2.16259999146925"
## [1] "Erro Total: 0"

Como pode ser visualizado, a estrutura de repetição rodou com a atualização de pesos até convergir

REFERÊNCIA BIBLIOGRÁFICA

Minsky and S. Papert. Perceptrons: an introduction to computational geometry. MIT Press, Massachusetts. 1969.
Novikoff, A.B.J.On convergence proofs for perceptrons in proceeding of the symposium on the matematical theory of automata, pp. 615 – 622, Brooklyn, NY :Polytechnic institute of Brooklyn, 1962.
Rosembatt, F.The Perceptron: A probabilistic model for information storage and organization in the brain. psychological Review, Vol 65, pp 386 – 408, 1958.
Rosemblatt, F.On the convergence of reinforcement procedures in simples perceptrons. cornell Aeronautical laboratory Report,Buffalo, NY, 1960.
Sejnowski, T. J. A Revolução do Aprendizado Profundo. Rio de Janeiro: Alta Books, 2019.