Skip to content

Commit 2c9dac6

Browse files
authored
Add files via upload
1 parent 283e2d5 commit 2c9dac6

File tree

3 files changed

+201
-0
lines changed

3 files changed

+201
-0
lines changed

RNA/index.js

+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
//Funções de ativações.
2+
const ArcTan = valor => Math.atan(valor)
3+
const BentIdentity = valor => ((Math.sqrt((valor ** 2) + 1) - 1) / 2) + valor
4+
const BinaryStep = valor => ((valor < 0) ? 0 : 1)
5+
const Gaussian = valor => Math.exp(-(valor ** 2))
6+
const Identity = valor => valor
7+
const LeakyReLU = valor => PReLU(valor, 0.01)
8+
const ReLU = valor => ((valor < 0) ? 0 : valor)
9+
const SELU = valor => 1.0507 * ELU(valor, 1.67326)
10+
const Sigmoid = valor => 1.0 / (1.0 + Math.exp(-valor))
11+
const SigmoidRcional = valor => valor / (1.0 + Math.sqrt(1.0 + valor * valor))
12+
const SiLU = valor => valor * Sigmoid(valor)
13+
const Sinc = valor => (valor = 0) ? 1 : (Math.sin(valor) / valor)
14+
const Sinusoid = valor => Math.sin(valor)
15+
const SoftSign = valor => valor / (1 + Math.abs(valor))
16+
const SoftPlus = valor => Math.log(1 + Math.exp(valor))
17+
const TanH = valor => (Math.exp(valor) - Math.exp(-valor)) + (Math.exp(valor) + Math.exp(-valor))
18+
const PReLU = (valor, arg) => ((valor < 0) ? (arg * valor) : valor)
19+
const ELU = (valor, arg) => PReLU(arg, Math.expm1(valor))
20+
const Pipe = (valor, ...fns) => fns.reduce((acc, current) => acc = current(valor))
21+
/*
22+
Gaussian_Derivative: valor => -2.0 * valor * Gaussian(valor),
23+
Sigmoid_Derivative: valor => Sigmoid(valor) * (1 - Sigmoid(valor)),
24+
SigmoidRcional_Derivative: valor => 1.0 / (Math.sqrt(1.0 + valor * valor) * (1 + Math.sqrt(1.0 + valor * valor)))
25+
*/
26+
27+
//Função interna
28+
const calcular = (pesos, entradas, vies = 0) => {
29+
const result = pesos.map((peso, i) => peso * entradas[i])
30+
return result.reduce((acc, current) => acc + current) + vies
31+
}
32+
33+
//Função interna
34+
const randpesos = (...entradas) => {
35+
const min = Math.ceil(-1000)
36+
const max = Math.floor(1000)
37+
return entradas[0].map(entrada => entrada = Math.floor(Math.random() * (max - min + 1)) + min)
38+
}
39+
40+
const Softmax = genoma => {
41+
const gens = genoma.map(x => Math.exp(x - Math.max(...genoma)))
42+
return gens.map(y => y / gens.reduce((acc, current) => acc + current))
43+
}
44+
45+
const entradas = entradas => {
46+
let pesos = randpesos(entradas) || [0]
47+
let vies = 0
48+
return {
49+
vies: {
50+
get: () => vies,
51+
set: (valor) => vies = valor || 0
52+
},
53+
pesos: {
54+
get: () => pesos,
55+
set: (valores) => pesos = valores || [0]
56+
},
57+
saida: callback => {
58+
if (!callback) return calcular(pesos, entradas, vies)
59+
if (typeof callback === 'function') return callback(calcular(pesos, entradas, vies))
60+
}
61+
}
62+
}
63+
64+
//console.log(mutar([1,2,3,4,5,6,7,8,9], 1))
65+
const mutar = (genoma, vezes = 1) => {
66+
if (vezes <= 0) vezes = 1
67+
68+
const indexList = Array(vezes).fill(0).map(vez => Math.floor(Math.random()*genoma.length))
69+
const filho = genoma.map((gen, index) => indexList.includes(index) ? randpesos([0])[0] : gen)
70+
return filho
71+
}
72+
73+
//console.log(crossover([1,2,8,9,10], [6,7,3,4,5], 2))
74+
const crossover = (genoma1, genoma2, index) => [
75+
genoma1.slice(0, index).concat(genoma2.slice(index)),
76+
genoma2.slice(0, index).concat(genoma1.slice(index))
77+
]
78+
79+
const neuronios = (entrada, contia) => Array(contia).fill(0).map(_ => entradas(entrada))
80+
const saidas = (neuronios, fn, contia) => {
81+
return Array(contia).fill(0).map(_ => entradas(neuronios.map(entrada => entrada.saida(fn))))
82+
}
83+
84+
const setPesos = (neuronio, pesos) => neuronio.map((neuro, index) => neuro.pesos.set(pesos[index]))
85+
86+
//console.log(genConcat(neuronio, oculta))
87+
const genConcat = (...neuronios) => {
88+
return neuronios.map(gen => gen.map(g => g.pesos.get()))
89+
.reduce((acc, current) => acc.concat(current))
90+
.reduce((acc, current) => acc.concat(current))
91+
}
92+
93+
module.exports = {
94+
entradas,
95+
mutar,
96+
crossover,
97+
Softmax,
98+
calcular,
99+
neuronios,
100+
saidas,
101+
setPesos,
102+
genConcat,
103+
104+
fn: {
105+
ArcTan,
106+
BentIdentity,
107+
BinaryStep,
108+
Gaussian,
109+
Identity,
110+
LeakyReLU,
111+
ReLU,
112+
SELU,
113+
Sigmoid,
114+
SigmoidRcional,
115+
SiLU,
116+
Sinc,
117+
Sinusoid,
118+
SoftSign,
119+
SoftPlus,
120+
TanH,
121+
PReLU,
122+
ELU,
123+
Pipe
124+
}
125+
}

exemplo-1.js

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
const RNA = require('./RNA')
2+
3+
const entrada = [200, 15, 8]
4+
5+
const neuronio = [
6+
RNA.entradas(entrada),
7+
RNA.entradas(entrada)
8+
]
9+
10+
//neuronio[0].vies.set(3)
11+
neuronio[0].pesos.set([100, 1, 5])
12+
neuronio[1].pesos.set([-200, 5, 10])
13+
14+
const oculta = [
15+
RNA.entradas([
16+
neuronio[0].saida(RNA.fn.ReLU),
17+
neuronio[1].saida(RNA.fn.ReLU)
18+
]),
19+
RNA.entradas([
20+
neuronio[0].saida(RNA.fn.ReLU),
21+
neuronio[1].saida(RNA.fn.ReLU)
22+
])
23+
]
24+
25+
oculta[0].pesos.set([1, 500])
26+
oculta[1].pesos.set([0, -500])
27+
28+
console.log('Entradas:', entrada)
29+
console.log('Pesos:', {
30+
'Neuronio 1': neuronio[0].pesos.get(),
31+
'Neuronio 2': neuronio[1].pesos.get(),
32+
'Oculta 1': oculta[0].pesos.get(),
33+
'Oculta 2': oculta[1].pesos.get(),
34+
})
35+
console.log('Saida 1:', oculta[0].saida())
36+
console.log('Saida 2:', oculta[1].saida())
37+
38+
const genoma = RNA.genConcat(neuronio, oculta)
39+
40+
/*
41+
const genoma = [
42+
neuronio[0].pesos.get(),
43+
neuronio[1].pesos.get(),
44+
oculta[0].pesos.get(),
45+
oculta[1].pesos.get()
46+
].reduce((a, b) => a.concat(b))
47+
*/
48+
49+
console.log('Genoma:', genoma)
50+
51+
const genoma2 = RNA.mutar(genoma, 2)
52+
console.log('Mutação:', genoma2)
53+
54+
console.log('Cross Over:', RNA.crossover(genoma, genoma2, 3))

exemplo-2.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const RNA = require('./RNA')
2+
3+
const entrada = [200, 15, 8]
4+
5+
const neuronio = RNA.neuronios(entrada, 2)
6+
RNA.setPesos(neuronio, [[100, 1, 5], [-200, 5, 10]])
7+
8+
const oculta = RNA.saidas(neuronio, RNA.fn.ReLU, 2)
9+
RNA.setPesos(oculta, [[1, 500], [0, -500]])
10+
11+
console.log('Entradas:', entrada)
12+
console.log('Pesos:', {
13+
'Neuronio 1': neuronio[0].pesos.get(),
14+
'Neuronio 2': neuronio[1].pesos.get(),
15+
'Oculta 1': oculta[0].pesos.get(),
16+
'Oculta 2': oculta[1].pesos.get(),
17+
})
18+
console.log('Saida 1:', oculta[0].saida())
19+
console.log('Saida 2:', oculta[1].saida())
20+
21+
const genoma = RNA.genConcat(neuronio, oculta)
22+
console.log('Genoma:', genoma)

0 commit comments

Comments
 (0)