Se caíram aqui neste artigo é porque provavelmente estão no meio (ou estão prestes a iniciar) de um trabalho acadêmico sobre inteligência artificial, mais precisamente, a implementação do Neurônio de Rosenblatt em uma planilha eletrônica (caso tenha sido solicitado código computacional, recomendo fortemente que faça em planilha primeiramente). Antes de escrevê-lo, pesquisei na internet e vi vários artigos com explicações muito boas e vários deles usando o exemplo da porta AND (relaxem – não vou usar o exemplo da porta AND). Sendo assim senti que precisava contribuir de alguma forma e decidi escrever a minha versão sobre o tal problema.
Basicamente, Frank Rosenblatt (psicólogo estadunidense) ao tentar imitar o funcionamento do cérebro humano, acabou criando um neurônio artifical (o tipo mais simples), conhecido por Perceptron, na década de 1950.
Quero usar o Perceptron para uma coisa bem simples: exibir, com base em uma determinada temperatura inserida, se saio de camiseta ou de blusa. Apesar de parecer tosco, serve bem para ilustrar.
Simplesmente, o neurônio deve escrever “Camiseta” se a temperatura inserida for igual ou maior a 20 graus Celsius ou “Blusa” se menor que 20 graus Celsius.
Neste exemplo vou usar a planilha eletrônica Libre Office Calc 6.3.6.2. Acredito que para o pacote MS Office Excel, os comandos sejam exatamente os mesmos.
Primeiramente, com uma explicação genérica
Atentem-se em criar duas abas na planilha. Uma de nome “treinamento”, onde vai ocorrer o treinamento propriamente dito e outra de nome “perceptron”, que será utilizada para enfeitar.

Bias: espécie de ajuste fino.T.A.(taxa de aprendizagem): aqui é definida a velocidade de aprendizagem do neurônio.X1: entrada do dado um.X2: entrada do dado dois.S: saída desejada.W1: é o valor (peso) associado ao “X1”. Não há regra e pode ser escolhidos valores aleatórios próximos a “1”.W2: é o valor (peso) associado ao “X2”. Não há regra e pode ser escolhidos valores aleatórios próximos a “1”.d(saída intermediária): aqui é demonstrado o quanto de estímulo as entradas geraram.a(função de ativação): aqui é definido se o estímulo recebido de “d” é o suficiente ou não para executar a ativação.p(predição): deve bater com a saída (S) desejada. Ex.: se as saídas desejadas forem “0” ou “1”, não faz sentido que a função “p” escreva “2” ou “3”.e(erro): faz a quantificação do erro. Ou seja, subtrai-se a saída desejada (S) da predição (p).D1(Delta 1): o Delta 1 é gerado a partir da multiplicação entre a taxa de aprendizagem (T.A.), a entrada 1 (X1) e o erro (e). Aqui se inicia o processo de ajuste do peso (W) para a próxima rodada; ou melhor, próxima linha da planilha eletrônica. Como neste momento está sendo calculado o Delta 1, logo deve ser usado o X1.D2(Delta 2): o Delta 2 é gerado a partir da multiplicação entre a taxa de aprendizagem (T.A.), a entrada 2 (X2) e o erro (e). Aqui se inicia o processo de ajuste do peso (W) para a próxima rodada; ou melhor, próxima linha da planilha eletrônica. Como neste momento está sendo calculado o Delta 2, logo deve ser usado o X2.nW1(novo peso W1): Para gerar o novo peso basta somar o peso antigo (W1) com o delta (D1).nW2(novo peso W2): Para gerar o novo peso basta somar o peso antigo (W2) com o delta (D2).
Informação importante: se seu neurônio possuir quatro entradas (X1, X2, X3 e X4), deve respectivamente, possuir quatro pesos (W1, W2, W3 e W4), quatro deltas (D1, D2, D3 e D4) e quatro pesos novos (nW1, nW2, nW3 e nW4).
Entrando de cabeça (isso foi um trocadilho?)

Para o Bias, não existe regra. Decidi utilizar o valor “-1”. Quanto ao “T.A.”, reforço o que tinha escrito anteriormente: é a velocidade de aprendizagem do neurônio. Neste caso coloquei em 1% (0,01). É uma taxa muito boa. Taxas muito altas podem levar a um aprendizado não muito bom.
Observem que em “X1” eu coloquei “2” e em “X2” foi adicionado “0”. Ou seja, estes valores estão representando 20 graus Celsius (quero que o valor base seja 20). Em “S” adicionei o valor “1”. Em outras palavras quero que o neurônio entenda que estou “amarrando” uma saída “1” à temperatura 20. Para o peso “W1” escolhi o valor “0,2” e para peso “W2” escolhi o valor “0,4”. Nada impede vocês de escolherem outros valores para os pesos “W1” e “W2”.
Para a saída intermediária, ou melhor “d”, utiliza-se seguinte fórmula: =(A6*D6)+(B6*E6)+(B$2). Observem que utilizei o sinal “$” antes do “2”. Neste caso estou informando para a planilha que quero fixar a linha “2”. Ou seja, sempre será apontado para um único Bias. Aqui é demonstrado o quanto de estímulo as entradas geraram.
Para a função de ativação, ou melhor “a”, utiliza-se da seguinte fórmula: =SE(F6>=0;1;-1). Se a saída intermediária retornar um valor maior ou igual a “0”, escreva o valor “1”; caso contrário escreva “-1”. Estamos usando a função do tipo degrau; para false, falso ou desligado é utilizado “-1”; para true, verdadeiro ou ligado, é utilizado “+1”; aqui é definido se o estímulo recebido de “d” é o suficiente ou não para executar a ativação.
Para a função predição, ou melhor “p”, utiliza-se da seguinte fórmula: =SE(G6=1;1;0). Deve bater com a saída (S) desejada. Ex.: se as saídas desejadas forem “0” ou “1”, não faz sentido que a função p escreva “2” ou “3”. Ou seja, a função “p” (neste caso) deve escrever “0” ou “1” para bater com as saídas das temperaturas que são/serão “1” e “0”.
Para o erro, ou melhor “e”, utiliza-se da seguinte fórmula: =C6-H6. Aqui estamos fazendo a quantificação do erro. Ou seja, subtraímos a saída desejada “S” da predição “p”. Toda vez que houver um erro, o valor desta coluna deverá ser diferente de “0”. Se tiver um erro e for igual a “0”, volte e revise o passo anterior.
Para o delta 1, ou melhor “D1”, utiliza-se da seguinte fórmula: =B$3*A6*I6. O delta 1 é gerado a partir da multiplicação entre a taxa de aprendizagem (T.A.), a entrada 1 (X1) e o erro (e). Aqui se inicia o processo de ajuste do peso (W) para a próxima rodada; ou melhor, a próxima linha da planilha eletrônica. Como neste momento está sendo calculado o Delta 1, logo deve ser usado o “X1”.
Para o delta 2, ou melhor D2, utiliza-se da seguinte fórmula: =B$3*B6*I6. o Delta 2 é gerado a partir da multiplicação entre a taxa de aprendizagem (T.A), a entrada 2 (X2) e o erro (e). Aqui se inicia o processo de ajuste do peso (W) para a próxima rodada; ou melhor, próxima linha da planilha eletrônica. Como neste momento está sendo calculado o Delta 2, logo deve ser usado o “X2”. Observem que tanto para “D1”, quanto para “D2”, foi também fixada a linha “3” com o caractere “$”. Ou seja, sempre será utilizado a mesma taxa de aprendizagem para este exemplo.
Para o novo peso 1, ou melhor “nW1”, utiliza-se da seguinte fórmula: =D6+J6. Ou seja, é somado o “W1” com “D1”.
Para o novo peso 2, ou melhor “nW2”, utiliza-se da seguinte fórmula: =E6+K6. Ou seja, é somado o “W1” com “D1”.

A linha 6 foi construída apenas para montar o treinamento e demostrar as fórmulas. Se observarem verão que deixei ela na cor vermelha). O treinamento de fato vai começar a partir da linha 7. Vou usar duas temperaturas acima de 20 amarradas a uma saída “1” e três temperaturas menores que 20 amarradas a uma saída “0”. Notem que eu repeti a temperatura 20 (células A7 e B7) com a saída 1 (célula C7). Neste momento o peso “W1” da linha 7 (D7) aponta para o novo peso 1 da linha 6 (faz referência a célula L6).

Aqui também segue o mesmo raciocício: o peso “W2” da linha 7 aponta para o novo peso 2 da linha 6 (faz referência a célula M6).

O restante pode ser copiado. Selecione de F6 a M6. Copie e cole na célula F7.

Irão notar que a linha 7 ficou completa.

Na linha 8 estou amarrando para a temperatura 25, uma saída 1; na linha 9 também estou amarrando para a temperatura 30, uma saída 1; na linha 10 amarro para a temperatura 15, uma saída 0; na linha 11, amarro para a temperatura 10, uma saída 0; por fim, na linha 12 amarro para a temperatura 05, uma saída 0. Ou seja, eu tenho três temperaturas com saídas “1” e três temperaturas com saídas “0”. Acredito que é o suficiente para treinar o neurônio. Nada impede de usar duas temperaturas acima e duas abaixo ou dez acima e dez abaixo.

Selecione, da célula D7 até a M7 e copie (Ctrl + C). Agora selecione da célula D8 até a célula D12 e cole (Ctrl + V).

Se tudo deu certo, deve estar igual a imagem acima.
Agora é que acontece a mágica

Selecione da célula A7 até a M12 e copie. Neste passo observem que deixei os textos que estão sendo copiados na cor preta (apenas para destacar o que de fato será usado para o treinamento).

Clique na célula A13 e cole.

Selecione da célula A13 até a M18 e copie.

Clique na célula A19 e cole.

Selecione da célula A19 até a M24 e copie. Clique na célula A25 e cole.
.
.
.

Faça isso várias vezes (obviamente ascendendo as células) até notar o seguinte padrão: a linha “I” ou coluna “e” (erro) mostra somente 0 (não estão acontecendo erros). Observem que no treinamento do exemplo, decidi parar na linha 96. Se atentem as colunas D (W1) e E (W2) que obtive os pesos “0,5” e “0,05” respectivamente. Estes são os pesos que nós precisamos.

Volte para a parte de cima da planilha, selecione da célula A5 até a M6 e copie.

Clique na linha A98 e cole. Como estão aprendendo, tentem fazer exatamente igual a planilha do artigo.

Digite os pesos “W1” e “W2” obtidos no treinamento (0,5 e 0,05) nas células D99 e E99. Agora sim, o meu neurônio pronto e treinado está sendo representando apenas pelas linhas 98 e 99.

Deixe a aba “perceptron” exatamente como na imagem acima.

Volte para a aba “treinamento”, clique na célula A99 e digite um sinal de igual (=).

Volte para a aba “perceptron” e clique na célula A3 e dê enter. Ou seja, tudo o que for digitado na célula A3 da aba “perceptron” será automaticamente inserido na célula A99 da aba “treinamento”.

Volte para a aba “treinamento”, clique na célula B99 e digite um sinal de igual (=).

Volte para a aba “perceptron” e clique na célula B3 e dê enter. Ou seja, tudo o que for digitado na célula B3 da aba “perceptron” será automaticamente inserido na célula B99 da aba “treinamento”.

Na célula C3 da aba “perceptron” digite a seguinte fórmula: =SE($treinamento.I99=0;"Camiseta";"Blusa").
Explicação: as temperaturas iguais ou maiores que 20 foram amarradas a “1”; as temperaturas menores que 20 foram amarradas a “0”. A linha que estou usando para representar o neurônio treinado, tem “1” na saída (S). Ou seja, sempre que forem inseridas temperaturas iguais ou maiores que 20, a coluna erro permenecerá em “0” (não teve erro). Sempre que foram inseridas temperaturas menores que 20, a coluna erro mostra “1”. Logo a fórmula =SE($treinamento.I99=0;"Camiseta";"Blusa") escreve “Camiseta” se for “0” na célula I99 da aba treinamento ou escreve “Blusa” se for “1” na célula I99 da aba treinamento.

Para 20 graus, o neurônio me informa que devo usar camiseta.

Para 55 graus, o neurônio me informa que devo usar camiseta. (vamos lá gente, é só uma ilustração)

Para 99 graus, o neurônio me informa que devo usar camiseta.

Para 19 graus, o neurônio me informa que devo usar blusa.

Para 10 graus, o neurônio me informa que devo usar blusa.

Para 1 grau, o neurônio me informa que devo usar blusa.

Vejam por este ângulo (rsrs) o que acontece quando é inserida a temperatura 01 com a saída “S” 1; ocorre um erro (1), cujo é mostrado na célula I99.
Para ilustrar e tentar deixar mais completa a explicação, desenvolvi um código computacional na linguagem Java:
public class Principal {
public static void main(String[] args) {
double bias = -1;
double ta = 0.01;
byte x1 = 0;
byte x2 = 0;
int s = 0;
double w1 = 0;
double w2 = 0;
double d = 0;
byte a = 0;
int p = 0;
int e = 0;
double d1 = 0;
double d2 = 0;
double nw1 = 0;
double nw2 = 0;
boolean loop = true;
int vetor[] = new int[1000];
int cont = 0;
int padrao = 0;
// linha 1 (head)
x1 = 2;
int x1_origem = x1;
x2 = 0;
int x2_origem = x2;
s = 1;
int s_origem = s;
w1 = 0.2;
w2 = 0.4;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a == 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
while (loop) {
// linha 2 (body)
x1 = 2;
x2 = 0;
s = 1;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a == 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 3 (body)
x1 = 2;
x2 = 5;
s = 1;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a == 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 4 (body)
x1 = 3;
x2 = 0;
s = 1;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a == 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 5 (body)
x1 = 1;
x2 = 5;
s = 0;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a == 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 6 (body)
x1 = 1;
x2 = 0;
s = 0;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a == 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 7 (body)
x1 = 0;
x2 = 5;
s = 0;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a == 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
if (cont >= 500) {
for (int i = 0; i < 499; i++) {
if (vetor[i] == 0) {
padrao++;
} else {
padrao = 0;
}
if (padrao > 15) {
loop = false;
}
}
System.out.printf("Bias: %.0f\n", bias);
System.out.printf("Taxa de aprendizado: %.2f\n", ta);
System.out.println("X1: " + x1_origem);
System.out.println("X2: " + x2_origem);
System.out.println("S: " + s_origem);
System.out.printf("W1 encontrado: %.2f\n", w1);
System.out.printf("W2 encontrado: %.2f\n", w2);
}
}
}
}
Saída
Bias: -1 Taxa de aprendizado: 0,01 X1: 2 X2: 0 S: 1 W1 encontrado: 0,50 W2 encontrado: 0,05
Também observem o código computacional em Python:
bias = -1
ta = 0.01
x1 = 0
x2 = 0
s = 0
w1 = 0
w2 = 0
d = 0
a = 0
p = 0
e = 0
d1 = 0
d2 = 0
nw1 = 0
nw2 = 0
loop = True
vetor = []
cont = 0
padrao = 0
i = 0
# linha 1 (head)
x1 = 2
x1_origem = x1
x2 = 0
x2_origem = x2
s = 1
s_origem = s
w1 = 0.2
w2 = 0.4
d = (x1 * w1) + (x2 * w2) + bias
if d >= 0:
a = 1
else:
a = -1
if a == 1:
p = 1
else:
p = 0
e = s - p
vetor.insert(cont, e)
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
while loop:
# linha 2 (body)
x1 = 2
x2 = 0
s = 1
w1 = nw1
w2 = nw2
d = (x1 * w1) + (x2 * w2) + bias
if d >= 0:
a = 1
else:
a = -1
if a == 1:
p = 1
else:
p = 0
e = s - p
vetor.insert(cont, e)
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
# linha 3 (body)
x1 = 2
x2 = 5
s = 1
w1 = nw1
w2 = nw2
d = (x1 * w1) + (x2 * w2) + bias
if d >= 0:
a = 1
else:
a = -1
if a == 1:
p = 1
else:
p = 0
e = s - p
vetor.insert(cont, e)
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
# linha 4 (body)
x1 = 3
x2 = 0
s = 1
w1 = nw1
w2 = nw2
d = (x1 * w1) + (x2 * w2) + bias
if d >= 0:
a = 1
else:
a = -1
if a == 1:
p = 1
else:
p = 0
e = s - p
vetor.insert(cont, e)
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
# linha 5 (body)
x1 = 1
x2 = 5
s = 0
w1 = nw1
w2 = nw2
d = (x1 * w1) + (x2 * w2) + bias
if d >= 0:
a = 1
else:
a = -1
if a == 1:
p = 1
else:
p = 0
e = s - p
vetor.insert(cont, e)
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
# linha 6 (body)
x1 = 1
x2 = 0
s = 0
w1 = nw1
w2 = nw2
d = (x1 * w1) + (x2 * w2) + bias
if d >= 0:
a = 1
else:
a = -1
if a == 1:
p = 1
else:
p = 0
e = s - p
vetor.insert(cont, e)
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
# linha 7 (body)
x1 = 0
x2 = 5
s = 0
w1 = nw1
w2 = nw2
d = (x1 * w1) + (x2 * w2) + bias
if d >= 0:
a = 1
else:
a = -1
if a == 1:
p = 1
else:
p = 0
e = s - p
vetor.insert(cont, e)
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
if cont >= 500:
while i < 499:
if vetor[i] == 0:
padrao = padrao + 1
else:
padrao = 0
if padrao > 15:
loop = False
i = i + 1
print('Bias:',bias)
print('Taxa de aprendizado:',ta)
print('X1:',x1_origem)
print('X2:',x2_origem)
print('S:',s_origem)
print("W1 Encontrado: {0:.2f}".format(w1))
print("W1 Encontrado: {0:.2f}".format(w2))
Saída
Bias: -1 Taxa de aprendizado: 0.01 X1: 2 X2: 0 S: 1 W1 Encontrado: 0.50 W1 Encontrado: 0.05
Também observem o código computacional em C:
#include <iostream>
int main(){
double bias = -1;
double ta = 0.01;
int x1 = 0;
int x2 = 0;
int s = 0;
double w1 = 0;
double w2 = 0;
double d = 0;
int a = 0;
int p = 0;
int e = 0;
double d1 = 0;
double d2 = 0;
double nw1 = 0;
double nw2 = 0;
bool loop = true;
int vetor[1000] = {};
int cont = 0;
int padrao = 0;
// linha 1 (head)
x1 = 2;
int x1_origem = x1;
x2 = 0;
int x2_origem = x2;
s = 1;
int s_origem = s;
w1 = 0.2;
w2 = 0.4;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
}else {
a = -1;
}
if (a == 1) {
p = 1;
}else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
while (loop) {
// linha 2 (body)
x1 = 2;
x2 = 0;
s = 1;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
}else {
a = -1;
}
if (a == 1) {
p = 1;
}else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 3 (body)
x1 = 2;
x2 = 5;
s = 1;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
}else {
a = -1;
}
if (a == 1) {
p = 1;
}else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 4 (body)
x1 = 3;
x2 = 0;
s = 1;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
}else {
a = -1;
}
if (a == 1) {
p = 1;
}else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 5 (body)
x1 = 1;
x2 = 5;
s = 0;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
}else {
a = -1;
}
if (a == 1) {
p = 1;
}else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 6 (body)
x1 = 1;
x2 = 0;
s = 0;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
}else {
a = -1;
}
if (a == 1) {
p = 1;
}else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 7 (body)
x1 = 0;
x2 = 5;
s = 0;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
}else {
a = -1;
}
if (a == 1) {
p = 1;
}else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
if (cont >= 500) {
for (int i = 0; i < 499; i++) {
if (vetor[i] == 0) {
padrao++;
}else {
padrao = 0;
}
if (padrao > 15) {
loop = false;
}
}
printf("Bias: %.0f\n", bias);
printf("Taxa de aprendizado: %.2f\n", ta);
printf("X1: %d\n",x1_origem);
printf("X2: %d\n",x2_origem);
printf("S: %d\n",s_origem);
printf("W1 encontrado: %.2f\n", w1);
printf("W2 encontrado: %.2f\n", w2);
}
}
system("pause");
return 0;
}
Saída
Bias: -1 Taxa de aprendizado: 0.01 X1: 2 X2: 0 S: 1 W1 encontrado: 0.50 W2 encontrado: 0.05 Pressione qualquer tecla para continuar. . .
Também observem o código computacional em VB.NET:
Imports System
Module Program
Sub Main(args As String())
Dim bias As Double = -1
Dim ta As Double = 0.01
Dim x1 As Integer = 0
Dim x2 As Integer = 0
Dim s As Integer = 0
Dim w1 As Double = 0
Dim w2 As Double = 0
Dim d As Double = 0
Dim a As Integer = 0
Dim p As Integer = 0
Dim e As Integer = 0
Dim d1 As Double = 0
Dim d2 As Double = 0
Dim nw1 As Double = 0
Dim nw2 As Double = 0
Dim ciclo As Boolean = True
Dim Vetor(1000) As Integer
Dim cont As Integer = 0
Dim padrao As Integer = 0
'linha 1 (head)'
x1 = 2
Dim x1_origem As Integer = x1
x2 = 0
Dim x2_origem As Integer = x2
s = 1
Dim s_origem As Integer = s
w1 = 0.2
w2 = 0.4
d = ((x1 * w1) + (x2 * w2) + bias)
If d >= 0 Then
a = 1
Else
a = -1
End If
If a = 1 Then
p = 1
Else
p = 0
End If
e = s - p
Vetor(cont) = e
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
While ciclo
'linha 2 (body)'
x1 = 2
x2 = 0
s = 1
w1 = nw1
w2 = nw2
d = ((x1 * w1) + (x2 * w2) + bias)
If d >= 0 Then
a = 1
Else
a = -1
End If
If a = 1 Then
p = 1
Else
p = 0
End If
e = s - p
Vetor(cont) = e
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
'linha 3 (body)'
x1 = 2
x2 = 5
s = 1
w1 = nw1
w2 = nw2
d = ((x1 * w1) + (x2 * w2) + bias)
If d >= 0 Then
a = 1
Else
a = -1
End If
If a = 1 Then
p = 1
Else
p = 0
End If
e = s - p
Vetor(cont) = e
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
'linha 4 (body)'
x1 = 3
x2 = 0
s = 1
w1 = nw1
w2 = nw2
d = ((x1 * w1) + (x2 * w2) + bias)
If d >= 0 Then
a = 1
Else
a = -1
End If
If a = 1 Then
p = 1
Else
p = 0
End If
e = s - p
Vetor(cont) = e
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
'linha 5 (body)'
x1 = 1
x2 = 5
s = 0
w1 = nw1
w2 = nw2
d = ((x1 * w1) + (x2 * w2) + bias)
If d >= 0 Then
a = 1
Else
a = -1
End If
If a = 1 Then
p = 1
Else
p = 0
End If
e = s - p
Vetor(cont) = e
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
'linha 6 (body)'
x1 = 1
x2 = 0
s = 0
w1 = nw1
w2 = nw2
d = ((x1 * w1) + (x2 * w2) + bias)
If d >= 0 Then
a = 1
Else
a = -1
End If
If a = 1 Then
p = 1
Else
p = 0
End If
e = s - p
Vetor(cont) = e
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
'linha 7 (body)'
x1 = 0
x2 = 5
s = 0
w1 = nw1
w2 = nw2
d = ((x1 * w1) + (x2 * w2) + bias)
If d >= 0 Then
a = 1
Else
a = -1
End If
If a = 1 Then
p = 1
Else
p = 0
End If
e = s - p
Vetor(cont) = e
cont = cont + 1
d1 = ta * x1 * e
d2 = ta * x2 * e
nw1 = w1 + d1
nw2 = w2 + d2
If cont >= 500 Then
For i As Integer = 0 To 499
If Vetor(i) = 0 Then
padrao = padrao + 1
Else
padrao = 0
End If
If padrao > 15 Then
ciclo = False
End If
Next
Console.WriteLine("Bias: {0}", bias)
Console.WriteLine("Taxa de aprendizado: {0:0.00}", ta)
Console.WriteLine("X1: {0}", x1_origem)
Console.WriteLine("X2: {0}", x2_origem)
Console.WriteLine("S: {0}", s_origem)
Console.WriteLine("W1 encontrado: {0:0.00}", w1)
Console.WriteLine("W2 encontrado: {0:0.00}", w2)
End If
End While
End Sub
End Module
Saída
Bias: -1 Taxa de aprendizado: 0,01 X1: 2 X2: 0 S: 1 W1 encontrado: 0,50 W2 encontrado: 0,05
Também observem o código computacional em C#:
namespace Projeto{
class Program{
static void Main(string[] args){
double bias = -1;
double ta = 0.01;
int x1 = 0;
int x2 = 0;
int s = 0;
double w1 = 0;
double w2 = 0;
double d = 0;
int a = 0;
int p = 0;
int e = 0;
double d1 = 0;
double d2 = 0;
double nw1 = 0;
double nw2 = 0;
bool loop = true;
int[] vetor = new int[1000];
int cont = 0;
int padrao = 0;
// linha 1 (head)
x1 = 2;
int x1_origem = x1;
x2 = 0;
int x2_origem = x2;
s = 1;
int s_origem = s;
w1 = 0.2;
w2 = 0.4;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0){
a = 1;
}else{
a = -1;
}
if (a == 1){
p = 1;
}else{
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
while (loop){
// linha 2 (body)
x1 = 2;
x2 = 0;
s = 1;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0){
a = 1;
}else
{
a = -1;
}
if (a == 1){
p = 1;
}else{
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 3 (body)
x1 = 2;
x2 = 5;
s = 1;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0){
a = 1;
}else{
a = -1;
}
if (a == 1){
p = 1;
}else{
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 4 (body)
x1 = 3;
x2 = 0;
s = 1;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0){
a = 1;
}else{
a = -1;
}
if (a == 1){
p = 1;
}else{
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 5 (body)
x1 = 1;
x2 = 5;
s = 0;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0){
a = 1;
}else{
a = -1;
}
if (a == 1){
p = 1;
}else{
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 6 (body)
x1 = 1;
x2 = 0;
s = 0;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0){
a = 1;
}else{
a = -1;
}
if (a == 1){
p = 1;
}else{
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 7 (body)
x1 = 0;
x2 = 5;
s = 0;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0){
a = 1;
}else{
a = -1;
}
if (a == 1){
p = 1;
}else{
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
if (cont >= 500){
for (int i = 0; i < 499; i++){
if (vetor[i] == 0){
padrao++;
}else{
padrao = 0;
}
if (padrao > 15){
loop = false;
}
}
Console.WriteLine("Bias: {0}", bias);
Console.WriteLine("Taxa de aprendizado: {0}", ta);
Console.WriteLine("X1: {0}", x1_origem);
Console.WriteLine("X2: {0}", x2_origem);
Console.WriteLine("S: {0}", s_origem);
Console.WriteLine("W1 encontrado: {0:0.00}", w1);
Console.WriteLine("W2 encontrado: {0:0.00}", w2);
}
}
}
}
}
Saída
Bias: -1 Taxa de aprendizado: 0,01 X1: 2 X2: 0 S: 1 W1 encontrado: 0,50 W2 encontrado: 0,05
Também observem o código computacional em Javascript:
function neuronio(){
let bias = -1;
let ta = 0.01;
let x1 = 0;
let x2 = 0;
let s = 0;
let w1 = 0;
let w2 = 0;
let d = 0;
let a = 0;
let p = 0;
let e = 0;
let d1 = 0;
let d2 = 0;
let nw1 = 0;
let nw2 = 0;
let loop = true;
let vetor = [];
let cont = 0;
let padrao = 0;
// linha 1 (head)
x1 = 2;
let x1_origem = x1;
x2 = 0;
let x2_origem = x2;
s = 1;
let s_origem = s;
w1 = 0.2;
w2 = 0.4;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a === 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
while (loop) {
// linha 2 (body)
x1 = 2;
x2 = 0;
s = 1;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a === 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 3 (body)
x1 = 2;
x2 = 5;
s = 1;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a === 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 4 (body)
x1 = 3;
x2 = 0;
s = 1;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a === 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 5 (body)
x1 = 1;
x2 = 5;
s = 0;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a === 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 6 (body)
x1 = 1;
x2 = 0;
s = 0;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a === 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
// linha 7 (body)
x1 = 0;
x2 = 5;
s = 0;
w1 = nw1;
w2 = nw2;
d = ((x1 * w1) + (x2 * w2) + bias);
if (d >= 0) {
a = 1;
} else {
a = -1;
}
if (a === 1) {
p = 1;
} else {
p = 0;
}
e = s - p;
vetor[cont] = e;
cont++;
d1 = ta * x1 * e;
d2 = ta * x2 * e;
nw1 = w1 + d1;
nw2 = w2 + d2;
if (cont >= 500) {
for (let i = 0; i < 499; i++) {
if (vetor[i] === 0) {
padrao++;
} else {
padrao = 0;
}
if (padrao > 15) {
loop = false;
}
}
document.write('Bias: ', bias + '<br/>');
document.write('Taxa de aprendizado: ', ta + '<br/>');
document.write('X1: ' + x1_origem + '<br/>');
document.write('X2: ' + x2_origem + '<br/>');
document.write('S: ' + s_origem + '<br/>');
document.write('W1 encontrado: ' + w1.toFixed(2) + '<br/>');
document.write('W2 encontrado: ' + w2.toFixed(2));
}
}
}
Saída
Bias: -1 Taxa de aprendizado: 0.01 X1: 2 X2: 0 S: 1 W1 encontrado: 0.50 W2 encontrado: 0.05
Caso queiram executar o código acima (Javascript) em html, basta deixar sua tag body conforme abaixo. Lembrem-se: a function neuronio() deve estar dentro de uma tag script, que por sua vez deve estar dentro de head
<body onload="neuronio()">
Este é um tema bastante utilizado em trabalhos acadêmicos para as áreas de tecnologia em que envolvem programação. Espero que tenha contribuído de alguma forma para o parendizado de alguém. Acredito que a partir deste exemplo, possam implementar tal neurônio com facilidade em outros tipos de problemas.
Custos com hospedagem, SSL e registro de domínio
Se o artigo ajudou de alguma forma e gostaria de contribuir com o projeto Fedablio, faça uma doação de qualquer valor.
Chave PIX: 21d97524-aa38-4438-b857-062a61e28327
