grydra 0.1.4 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/gr/core.rb +102 -89
- data/lib/gr/version.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 38aaecb86df2c74c04d634e4591f60332b56cf66054cc5b2a3fd9061c9d50908
|
|
4
|
+
data.tar.gz: 2616015ee7528c6d3b19af4f01bcc101134aa741ea4599b22df2dbe83308c8f1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a169a960e53bc33a2686ca1657b65c30a1b19a273d190c5e9100dce109f9ddba50a2c6d35c0883a026bb476e4c91768002b7b53f44f33b5a27cfe01850b5e925
|
|
7
|
+
data.tar.gz: 27668728857d9ad96f7d375b022c0f39f51fcf0cbb4e7daf145036029d34d052fbe51b669264a332caaac692ac134310193b44c2ea199c533321139156fabd50
|
data/lib/gr/core.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module
|
|
1
|
+
module GRYDRA
|
|
2
2
|
require 'set'
|
|
3
3
|
|
|
4
4
|
### FUNCIONES DE ACTIVACIÓN ###
|
|
@@ -91,8 +91,8 @@ module GR
|
|
|
91
91
|
|
|
92
92
|
def initialize(entradas, activacion=:tanh)
|
|
93
93
|
raise ArgumentError, "El número de entradas debe ser un entero positivo" unless entradas.is_a?(Integer) && entradas > 0
|
|
94
|
-
@pesos = Array.new(entradas) {
|
|
95
|
-
@sesgo =
|
|
94
|
+
@pesos = Array.new(entradas) { GRYDRA.xavier_init(entradas) }
|
|
95
|
+
@sesgo = GRYDRA.xavier_init(entradas)
|
|
96
96
|
@salida = 0
|
|
97
97
|
@delta = 0
|
|
98
98
|
@activacion = activacion
|
|
@@ -106,9 +106,9 @@ module GR
|
|
|
106
106
|
end
|
|
107
107
|
@suma = @pesos.zip(entradas).map { |peso, entrada| peso * entrada }.sum + @sesgo
|
|
108
108
|
@salida = case @activacion
|
|
109
|
-
when :tanh then
|
|
110
|
-
when :relu then
|
|
111
|
-
when :sigmoid then
|
|
109
|
+
when :tanh then GRYDRA.tanh(@suma)
|
|
110
|
+
when :relu then GRYDRA.relu(@suma)
|
|
111
|
+
when :sigmoid then GRYDRA.sigmoid(@suma)
|
|
112
112
|
else @suma
|
|
113
113
|
end
|
|
114
114
|
@salida
|
|
@@ -116,9 +116,9 @@ module GR
|
|
|
116
116
|
|
|
117
117
|
def derivada_activacion
|
|
118
118
|
case @activacion
|
|
119
|
-
when :tanh then
|
|
120
|
-
when :relu then
|
|
121
|
-
when :sigmoid then
|
|
119
|
+
when :tanh then GRYDRA.derivada_tanh(@salida)
|
|
120
|
+
when :relu then GRYDRA.derivada_relu(@salida)
|
|
121
|
+
when :sigmoid then GRYDRA.derivada_sigmoid(@suma)
|
|
122
122
|
else 1
|
|
123
123
|
end
|
|
124
124
|
end
|
|
@@ -291,31 +291,44 @@ module GR
|
|
|
291
291
|
end
|
|
292
292
|
|
|
293
293
|
### GUARDAR Y CARGAR MODELO Y VOCABULARIO ###
|
|
294
|
-
def self.guardar_modelo(modelo, nombre, path =
|
|
295
|
-
File.
|
|
296
|
-
|
|
294
|
+
def self.guardar_modelo(modelo, nombre, path = Dir.pwd, vocabulario = nil)
|
|
295
|
+
ruta_archivo = File.join(path, "#{nombre}.red")
|
|
296
|
+
|
|
297
|
+
# Abre el archivo en modo escritura binaria y guarda el objeto serializado
|
|
298
|
+
File.open(ruta_archivo, "wb") { |f| Marshal.dump(modelo, f) }
|
|
299
|
+
|
|
300
|
+
puts "\e[33mModelo guardado en '#{ruta_archivo}'\e[0m"
|
|
301
|
+
|
|
302
|
+
# Si se pasa vocabulario, se delega guardarlo en otra función
|
|
297
303
|
if vocabulario
|
|
298
304
|
guardar_vocabulario(vocabulario, nombre, path)
|
|
299
305
|
end
|
|
300
306
|
end
|
|
301
307
|
|
|
302
|
-
|
|
308
|
+
|
|
309
|
+
def self.cargar_modelo(nombre, path = Dir.pwd)
|
|
303
310
|
modelo = nil
|
|
304
|
-
File.
|
|
311
|
+
ruta_archivo = File.join(path, "#{nombre}.red")
|
|
312
|
+
File.open(ruta_archivo, "rb") { |f| modelo = Marshal.load(f) }
|
|
305
313
|
modelo
|
|
306
314
|
end
|
|
307
315
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
316
|
+
|
|
317
|
+
def self.guardar_vocabulario(vocabulario, nombre, path = Dir.pwd)
|
|
318
|
+
ruta_archivo = File.join(path, "#{nombre}_vocab.bin")
|
|
319
|
+
File.open(ruta_archivo, "wb") { |f| Marshal.dump(vocabulario, f) }
|
|
320
|
+
puts "\e[33mVocabulario guardado en '#{ruta_archivo}'\e[0m"
|
|
311
321
|
end
|
|
312
322
|
|
|
313
|
-
|
|
323
|
+
|
|
324
|
+
def self.cargar_vocabulario(nombre, path = Dir.pwd)
|
|
314
325
|
vocabulario = nil
|
|
315
|
-
File.
|
|
326
|
+
ruta_archivo = File.join(path, "#{nombre}_vocab.bin")
|
|
327
|
+
File.open(ruta_archivo, "rb") { |f| vocabulario = Marshal.load(f) }
|
|
316
328
|
vocabulario
|
|
317
329
|
end
|
|
318
330
|
|
|
331
|
+
|
|
319
332
|
### PREPROCESAMIENTO ACTUALIZADO ###
|
|
320
333
|
def self.normalizar_varios(datos, maximos, metodo=:max)
|
|
321
334
|
case metodo
|
|
@@ -387,7 +400,7 @@ module GR
|
|
|
387
400
|
attr_accessor :red, :vocabulario, :max_valores, :max_valores_salida
|
|
388
401
|
|
|
389
402
|
def initialize(imprimir_epocas = false)
|
|
390
|
-
@red =
|
|
403
|
+
@red = GRYDRA::RedPrincipal.new(imprimir_epocas)
|
|
391
404
|
@vocabulario = nil
|
|
392
405
|
@max_valores = {}
|
|
393
406
|
@max_valores_salida = {}
|
|
@@ -404,14 +417,14 @@ module GR
|
|
|
404
417
|
end
|
|
405
418
|
end
|
|
406
419
|
|
|
407
|
-
@max_valores =
|
|
420
|
+
@max_valores = GRYDRA.calcular_maximos(entradas, normalizacion)
|
|
408
421
|
|
|
409
|
-
datos_normalizados =
|
|
422
|
+
datos_normalizados = GRYDRA.normalizar_varios(entradas, @max_valores, normalizacion)
|
|
410
423
|
|
|
411
424
|
etiquetas = datos_hash.map { |item| [item[clave_etiqueta].to_f] }
|
|
412
425
|
|
|
413
|
-
@max_valores_salida =
|
|
414
|
-
etiquetas_no =
|
|
426
|
+
@max_valores_salida = GRYDRA.calcular_maximos(etiquetas, normalizacion)
|
|
427
|
+
etiquetas_no = GRYDRA.normalizar_varios(etiquetas, @max_valores_salida, normalizacion)
|
|
415
428
|
|
|
416
429
|
estructuras.each do |estructura|
|
|
417
430
|
@red.agregar_subred([claves_entrada.size, *estructura])
|
|
@@ -432,7 +445,7 @@ module GR
|
|
|
432
445
|
end
|
|
433
446
|
end
|
|
434
447
|
|
|
435
|
-
datos_normalizados =
|
|
448
|
+
datos_normalizados = GRYDRA.normalizar_varios(entradas, @max_valores, normalizacion)
|
|
436
449
|
|
|
437
450
|
datos_normalizados.map do |entrada|
|
|
438
451
|
pred_norm = @red.combinar_resultados(entrada)
|
|
@@ -451,11 +464,11 @@ module GR
|
|
|
451
464
|
def entrenar_numericos(datos_entrada, datos_salida, estructuras, tasa, epocas, normalizacion=:max)
|
|
452
465
|
@red.subredes.clear # limpiar subredes previas
|
|
453
466
|
|
|
454
|
-
@max_valores =
|
|
455
|
-
@max_valores_salida =
|
|
467
|
+
@max_valores = GRYDRA.calcular_maximos(datos_entrada, normalizacion)
|
|
468
|
+
@max_valores_salida = GRYDRA.calcular_maximos(datos_salida, normalizacion)
|
|
456
469
|
|
|
457
|
-
datos_entrada_no =
|
|
458
|
-
datos_salida_no =
|
|
470
|
+
datos_entrada_no = GRYDRA.normalizar_varios(datos_entrada, @max_valores, normalizacion)
|
|
471
|
+
datos_salida_no = GRYDRA.normalizar_varios(datos_salida, @max_valores_salida, normalizacion)
|
|
459
472
|
|
|
460
473
|
estructuras.each do |estructura|
|
|
461
474
|
@red.agregar_subred([datos_entrada.first.size, *estructura])
|
|
@@ -469,7 +482,7 @@ module GR
|
|
|
469
482
|
end
|
|
470
483
|
|
|
471
484
|
def predecir_numericos(nuevos_datos, normalizacion=:max)
|
|
472
|
-
datos_normalizados =
|
|
485
|
+
datos_normalizados = GRYDRA.normalizar_varios(nuevos_datos, @max_valores, normalizacion)
|
|
473
486
|
datos_normalizados.map do |entrada|
|
|
474
487
|
pred_norm = @red.combinar_resultados(entrada)
|
|
475
488
|
if normalizacion == :zscore && @max_valores_salida.is_a?(Hash)
|
|
@@ -486,14 +499,14 @@ module GR
|
|
|
486
499
|
def entrenar_texto(textos, etiquetas, estructuras, tasa, epocas, normalizacion=:max)
|
|
487
500
|
@red.subredes.clear # limpiar subredes previas
|
|
488
501
|
|
|
489
|
-
@vocabulario =
|
|
490
|
-
entradas = textos.map { |texto|
|
|
502
|
+
@vocabulario = GRYDRA.crear_vocabulario(textos)
|
|
503
|
+
entradas = textos.map { |texto| GRYDRA.vectorizar_texto(texto, @vocabulario) }
|
|
491
504
|
@max_valores = { 0 => @vocabulario.size } # Solo tamaño vocabulario para texto
|
|
492
505
|
|
|
493
|
-
datos_normalizados =
|
|
506
|
+
datos_normalizados = GRYDRA.normalizar_varios(entradas, @max_valores, normalizacion)
|
|
494
507
|
|
|
495
|
-
@max_valores_salida =
|
|
496
|
-
etiquetas_no =
|
|
508
|
+
@max_valores_salida = GRYDRA.calcular_maximos(etiquetas, normalizacion)
|
|
509
|
+
etiquetas_no = GRYDRA.normalizar_varios(etiquetas, @max_valores_salida, normalizacion)
|
|
497
510
|
|
|
498
511
|
estructuras.each do |estructura|
|
|
499
512
|
@red.agregar_subred([@vocabulario.size, *estructura])
|
|
@@ -507,8 +520,8 @@ module GR
|
|
|
507
520
|
end
|
|
508
521
|
|
|
509
522
|
def predecir_texto(nuevos_textos, normalizacion=:max)
|
|
510
|
-
entradas = nuevos_textos.map { |texto|
|
|
511
|
-
datos_normalizados =
|
|
523
|
+
entradas = nuevos_textos.map { |texto| GRYDRA.vectorizar_texto(texto, @vocabulario) }
|
|
524
|
+
datos_normalizados = GRYDRA.normalizar_varios(entradas, @max_valores, normalizacion)
|
|
512
525
|
|
|
513
526
|
datos_normalizados.map do |entrada|
|
|
514
527
|
pred_norm = @red.combinar_resultados(entrada)
|
|
@@ -527,7 +540,7 @@ module GR
|
|
|
527
540
|
'RedPrincipal.agregar_subred' => {
|
|
528
541
|
descripcion: "Agrega una subred a la red principal con la estructura dada. La estructura define el número de neuronas por capa (incluyendo entradas).",
|
|
529
542
|
ejemplo: <<~EX
|
|
530
|
-
red =
|
|
543
|
+
red = GRYDRA::RedPrincipal.new
|
|
531
544
|
red.agregar_subred([2, 4, 1]) # 2 entradas, 4 neuronas capa oculta, 1 salida
|
|
532
545
|
EX
|
|
533
546
|
}, #34,36
|
|
@@ -538,7 +551,7 @@ module GR
|
|
|
538
551
|
{entrada: [[0.1, 0.2]], salida: [[0.3]]},
|
|
539
552
|
{entrada: [[0.5, 0.6]], salida: [[0.7]]}
|
|
540
553
|
]
|
|
541
|
-
red =
|
|
554
|
+
red = GRYDRA::RedPrincipal.new(true) <-- (true) es para que imprima el umbral de error
|
|
542
555
|
red.agregar_subred([2, 3, 1])
|
|
543
556
|
red.agregar_subred([2, 2, 1])
|
|
544
557
|
red.entrenar_subredes(datos, 0.01, 1000, paciencia: 5)
|
|
@@ -558,7 +571,7 @@ module GR
|
|
|
558
571
|
datos_entrada = [[170, 25], [160, 30], [180, 22]]
|
|
559
572
|
datos_salida = [[65], [60], [75]]
|
|
560
573
|
estructuras = [[4, 1], [3, 1]]
|
|
561
|
-
red =
|
|
574
|
+
red = GRYDRA::FacilRed.new(true)
|
|
562
575
|
red.entrenar_numericos(datos_entrada, datos_salida, estructuras, 0.05, 15000, :max)
|
|
563
576
|
EX
|
|
564
577
|
},
|
|
@@ -576,7 +589,7 @@ module GR
|
|
|
576
589
|
{altura: 170, edad: 25, peso: 65},
|
|
577
590
|
{altura: 160, edad: 30, peso: 60}
|
|
578
591
|
]
|
|
579
|
-
red =
|
|
592
|
+
red = GRYDRA::FacilRed.new(true) <-- (true) es para que imprima el umbral de error
|
|
580
593
|
red.entrenar_hashes(datos_hash, [:altura, :edad], :peso, [[4, 1]], 0.05, 15000, :max)
|
|
581
594
|
EX
|
|
582
595
|
},
|
|
@@ -593,7 +606,7 @@ module GR
|
|
|
593
606
|
textos = ["hola mundo", "buen día"]
|
|
594
607
|
etiquetas = [[1], [0]]
|
|
595
608
|
estructuras = [[5, 1]]
|
|
596
|
-
red =
|
|
609
|
+
red = GRYDRA::FacilRed.new(true)
|
|
597
610
|
red.entrenar_texto(textos, etiquetas, estructuras, 0.01, 5000)
|
|
598
611
|
EX
|
|
599
612
|
},
|
|
@@ -606,71 +619,71 @@ module GR
|
|
|
606
619
|
},
|
|
607
620
|
|
|
608
621
|
# Guardar y cargar modelos y vocabularios
|
|
609
|
-
'
|
|
622
|
+
'GRYDRA.guardar_modelo' => {
|
|
610
623
|
descripcion: 'Guarda el modelo entrenado en un archivo binario para poder cargarlo después. Opcionalmente guarda también el vocabulario.',
|
|
611
624
|
ejemplo: <<~EX
|
|
612
|
-
|
|
625
|
+
GRYDRA.guardar_modelo(modelo, "mi_modelo", "./modelos", vocabulario) El path por defecto es la carpeta donde se este ejecutando
|
|
613
626
|
EX
|
|
614
627
|
},
|
|
615
|
-
'
|
|
628
|
+
'GRYDRA.cargar_modelo' => {
|
|
616
629
|
descripcion: 'Carga un modelo guardado desde un archivo binario para usarlo sin entrenar de nuevo.',
|
|
617
630
|
ejemplo: <<~EX
|
|
618
|
-
modelo =
|
|
631
|
+
modelo = GRYDRA.cargar_modelo("mi_modelo", "./modelos") El path por defecto es la carpeta donde se este ejecutando
|
|
619
632
|
EX
|
|
620
633
|
},
|
|
621
|
-
'
|
|
634
|
+
'GRYDRA.guardar_vocabulario' => {
|
|
622
635
|
descripcion: 'Guarda el vocabulario en un archivo binario para su posterior carga.',
|
|
623
636
|
ejemplo: <<~EX
|
|
624
|
-
|
|
637
|
+
GRYDRA.guardar_vocabulario(vocabulario, "mi_modelo", "./modelos") El path por defecto es la carpeta donde se este ejecutando
|
|
625
638
|
EX
|
|
626
639
|
},
|
|
627
|
-
'
|
|
640
|
+
'GRYDRA.cargar_vocabulario' => {
|
|
628
641
|
descripcion: 'Carga el vocabulario desde un archivo binario guardado.',
|
|
629
642
|
ejemplo: <<~EX
|
|
630
|
-
vocabulario =
|
|
643
|
+
vocabulario = GRYDRA.cargar_vocabulario("mi_modelo", "./modelos") El path por defecto es la carpeta donde se este ejecutando
|
|
631
644
|
EX
|
|
632
645
|
},
|
|
633
646
|
|
|
634
647
|
# Normalización y preprocesamiento
|
|
635
|
-
'
|
|
648
|
+
'GRYDRA.normalizar_varios' => {
|
|
636
649
|
descripcion: 'Normaliza un conjunto de datos según el método especificado (:max o :zscore).',
|
|
637
650
|
ejemplo: <<~EX
|
|
638
|
-
maximos =
|
|
639
|
-
datos_norm =
|
|
651
|
+
maximos = GRYDRA.calcular_maximos(datos, :max)
|
|
652
|
+
datos_norm = GRYDRA.normalizar_varios(datos, maximos, :max)
|
|
640
653
|
EX
|
|
641
654
|
},
|
|
642
|
-
'
|
|
655
|
+
'GRYDRA.calcular_maximos' => {
|
|
643
656
|
descripcion: 'Calcula valores máximos o medias y desviaciones según el método para normalizar datos.',
|
|
644
657
|
ejemplo: <<~EX
|
|
645
|
-
maximos =
|
|
646
|
-
estadisticas =
|
|
658
|
+
maximos = GRYDRA.calcular_maximos(datos, :max)
|
|
659
|
+
estadisticas = GRYDRA.calcular_maximos(datos, :zscore)
|
|
647
660
|
EX
|
|
648
661
|
},
|
|
649
662
|
|
|
650
663
|
# Funciones de texto
|
|
651
|
-
'
|
|
664
|
+
'GRYDRA.crear_vocabulario' => {
|
|
652
665
|
descripcion: 'Crea un vocabulario único a partir de una lista de textos, separando palabras.',
|
|
653
666
|
ejemplo: <<~EX
|
|
654
667
|
textos = ["hola mundo", "buen día"]
|
|
655
|
-
vocabulario =
|
|
668
|
+
vocabulario = GRYDRA.crear_vocabulario(textos)
|
|
656
669
|
EX
|
|
657
670
|
},
|
|
658
|
-
'
|
|
671
|
+
'GRYDRA.vectorizar_texto' => {
|
|
659
672
|
descripcion: 'Convierte un texto en un vector binario basado en la presencia de palabras en el vocabulario.',
|
|
660
673
|
ejemplo: <<~EX
|
|
661
|
-
vector =
|
|
674
|
+
vector = GRYDRA.vectorizar_texto("hola mundo", vocabulario)
|
|
662
675
|
EX
|
|
663
676
|
},
|
|
664
|
-
'
|
|
677
|
+
'GRYDRA.normalizar_con_vocabulario' => {
|
|
665
678
|
descripcion: 'Normaliza vectores generados con el vocabulario dividiendo entre el tamaño del vocabulario.',
|
|
666
679
|
ejemplo: <<~EX
|
|
667
|
-
vectores_norm =
|
|
680
|
+
vectores_norm = GRYDRA.normalizar_con_vocabulario(vectores, vocabulario)
|
|
668
681
|
EX
|
|
669
682
|
},
|
|
670
|
-
'
|
|
683
|
+
'GRYDRA.generar_ejemplo' => {
|
|
671
684
|
descripcion: 'Genera un ejemplo con código funcioanl con la libreria, con ejemplos del 1 al 9.',
|
|
672
685
|
ejemplo: <<~EX
|
|
673
|
-
|
|
686
|
+
GRYDRA.generar_ejemplo(1)
|
|
674
687
|
EX
|
|
675
688
|
}
|
|
676
689
|
}
|
|
@@ -703,7 +716,7 @@ module GR
|
|
|
703
716
|
end
|
|
704
717
|
|
|
705
718
|
#Función para generar ejemplos de uso con la libreria
|
|
706
|
-
def self.generar_ejemplo(num_ejemplo, nombre_archivo = "ejemplo", extension = "rb", path =
|
|
719
|
+
def self.generar_ejemplo(num_ejemplo, nombre_archivo = "ejemplo", extension = "rb", path = Dir.pwd)
|
|
707
720
|
case num_ejemplo
|
|
708
721
|
when 1
|
|
709
722
|
contenido = <<-RUBY
|
|
@@ -731,7 +744,7 @@ datos_entrenamiento = [
|
|
|
731
744
|
]
|
|
732
745
|
|
|
733
746
|
# Creamos el modelo
|
|
734
|
-
modelo =
|
|
747
|
+
modelo = GRYDRA::FacilRed.new(true) # true para que imprima el error cada 1000 épocas
|
|
735
748
|
|
|
736
749
|
# Entrenamos directamente usando datos tipo hash
|
|
737
750
|
modelo.entrenar_hashes(
|
|
@@ -745,7 +758,7 @@ modelo.entrenar_hashes(
|
|
|
745
758
|
|
|
746
759
|
|
|
747
760
|
# Guardamos el modelo entrenado
|
|
748
|
-
|
|
761
|
+
GRYDRA.guardar_modelo(modelo, "modelo_empresas")
|
|
749
762
|
|
|
750
763
|
puts "Entrenamiento completado y modelo guardado exitosamente." #Mensaje de depuración para comprobar la ejecución adecuada
|
|
751
764
|
RUBY
|
|
@@ -753,7 +766,7 @@ puts "Entrenamiento completado y modelo guardado exitosamente." #Mensaje de depu
|
|
|
753
766
|
contenido = <<-RUBY
|
|
754
767
|
require 'grydra'
|
|
755
768
|
modelo = nil
|
|
756
|
-
modelo =
|
|
769
|
+
modelo = GRYDRA.cargar_modelo("modelo_empresas")
|
|
757
770
|
|
|
758
771
|
# Nuevos datos de empresas a evaluar
|
|
759
772
|
nuevos_datos = [
|
|
@@ -778,7 +791,7 @@ end
|
|
|
778
791
|
require 'grydra'
|
|
779
792
|
|
|
780
793
|
# Crear red principal
|
|
781
|
-
red =
|
|
794
|
+
red = GRYDRA::RedPrincipal.new #Sin el true, simplemente no se imprimen las epocas
|
|
782
795
|
|
|
783
796
|
# Agregar una subred con estructura [2 entradas, 2 ocultas, 1 salida]
|
|
784
797
|
red.agregar_subred([2, 3, 1], [:tanh, :tanh])
|
|
@@ -832,15 +845,15 @@ datos_in = [[0], [10], [20], [30], [40], [50], [-10], [-20], [100], [-30], [-5],
|
|
|
832
845
|
datos_ou = [[32], [50], [68], [86], [104], [122], [14], [-4], [212], [-22], [23], [-40]]
|
|
833
846
|
|
|
834
847
|
# Encontrar valores máximos para normalizar (método :max)
|
|
835
|
-
max_in =
|
|
836
|
-
max_ou =
|
|
848
|
+
max_in = GRYDRA.calcular_maximos(datos_in, :max) # {0 => valor}
|
|
849
|
+
max_ou = GRYDRA.calcular_maximos(datos_ou, :max) # {0 => valor}
|
|
837
850
|
|
|
838
851
|
# Normalizar datos
|
|
839
|
-
datos_in_no =
|
|
840
|
-
datos_ou_no =
|
|
852
|
+
datos_in_no = GRYDRA.normalizar_varios(datos_in, max_in, :max)
|
|
853
|
+
datos_ou_no = GRYDRA.normalizar_varios(datos_ou, max_ou, :max)
|
|
841
854
|
|
|
842
855
|
# Crear red principal
|
|
843
|
-
red_principal =
|
|
856
|
+
red_principal = GRYDRA::RedPrincipal.new
|
|
844
857
|
|
|
845
858
|
# Agregar subredes
|
|
846
859
|
red_principal.agregar_subred([1, 4, 1], [:sigmoid, :tanh])
|
|
@@ -867,7 +880,7 @@ entrada_usuario = gets.chomp.split.map(&:to_f)
|
|
|
867
880
|
|
|
868
881
|
# Normalizar entradas
|
|
869
882
|
entrada_usuario_no = entrada_usuario.map { |e| [e] }
|
|
870
|
-
entrada_usuario_no =
|
|
883
|
+
entrada_usuario_no = GRYDRA.normalizar_varios(entrada_usuario_no, max_in, :max)
|
|
871
884
|
|
|
872
885
|
puts "\\nResultados combinados:"
|
|
873
886
|
entrada_usuario_no.each_with_index do |entrada_norm, i|
|
|
@@ -888,7 +901,7 @@ tanto como uno quiera, ejemplo:
|
|
|
888
901
|
0.003, 0.3, 0.9, 0.2, 0.223, 0.00008
|
|
889
902
|
=end
|
|
890
903
|
# Crear instancia de la clase FacilRed
|
|
891
|
-
red =
|
|
904
|
+
red = GRYDRA::FacilRed.new(true) # true para imprimir las épocas y errores
|
|
892
905
|
|
|
893
906
|
# Datos originales (temperatura Celsius y Fahrenheit)
|
|
894
907
|
datos_in = [[0], [10], [20], [30], [40], [50], [-10], [-20], [100], [-30], [-5], [-40]]
|
|
@@ -948,7 +961,7 @@ estructuras = [
|
|
|
948
961
|
]
|
|
949
962
|
|
|
950
963
|
# Crear red usando la interfaz fácil
|
|
951
|
-
red =
|
|
964
|
+
red = GRYDRA::FacilRed.new(true) # true para que imprima error por época
|
|
952
965
|
|
|
953
966
|
# Entrenar la red
|
|
954
967
|
red.entrenar_numericos(
|
|
@@ -1003,7 +1016,7 @@ estructuras = [
|
|
|
1003
1016
|
]
|
|
1004
1017
|
|
|
1005
1018
|
# Crear red Fácil
|
|
1006
|
-
red =
|
|
1019
|
+
red = GRYDRA::FacilRed.new # true para ver el progreso de entrenamiento
|
|
1007
1020
|
|
|
1008
1021
|
# Vamos a asignar activación 'sigmoid' en la última capa para limitar la salida entre 0 y 1
|
|
1009
1022
|
# Ajustamos internamente en el método agregar_subred
|
|
@@ -1026,7 +1039,7 @@ predicciones = red.predecir_numericos(nuevos_datos, :max)
|
|
|
1026
1039
|
# Las predicciones ya están desnormalizadas por FacilRed, solo redondeamos
|
|
1027
1040
|
puts "Predicción peso (kg) para altura \#{nuevos_datos[0][0]} cm y edad \#{nuevos_datos[0][1]} años:"
|
|
1028
1041
|
print predicciones.map { |p| p[0].round(2) }
|
|
1029
|
-
|
|
1042
|
+
GRYDRA.guardar_modelo(red, "peso_promedio")
|
|
1030
1043
|
RUBY
|
|
1031
1044
|
when 8
|
|
1032
1045
|
contenido = <<-RUBY
|
|
@@ -1034,7 +1047,7 @@ GR.guardar_modelo(red, "peso_promedio")
|
|
|
1034
1047
|
require 'grydra'
|
|
1035
1048
|
|
|
1036
1049
|
# Cargar el modelo previamente guardado
|
|
1037
|
-
modelo =
|
|
1050
|
+
modelo = GRYDRA.cargar_modelo("peso_promedio")
|
|
1038
1051
|
|
|
1039
1052
|
# Datos de entrada para predecir: altura=172 cm, edad=26 años
|
|
1040
1053
|
nuevos_datos = [[172, 26]]
|
|
@@ -1082,14 +1095,14 @@ datos_salida = [
|
|
|
1082
1095
|
]
|
|
1083
1096
|
|
|
1084
1097
|
#Normalziación de datos (dato común --> Dato vectorial)
|
|
1085
|
-
max_en =
|
|
1086
|
-
max_sal =
|
|
1098
|
+
max_en = GRYDRA.calcular_maximos(datos_entrada, :max) #Usaremos la normalizacion con max, aunque se puede con zscore
|
|
1099
|
+
max_sal = GRYDRA.calcular_maximos(datos_salida, :max)
|
|
1087
1100
|
|
|
1088
|
-
datos_en_no =
|
|
1089
|
-
datos_sal_no =
|
|
1101
|
+
datos_en_no = GRYDRA.normalizar_varios(datos_entrada, max_en, :max) #Por defecto usa max, entonces es opcional usar el :max
|
|
1102
|
+
datos_sal_no = GRYDRA.normalizar_varios(datos_salida, max_sal)
|
|
1090
1103
|
|
|
1091
1104
|
#Creamos la red
|
|
1092
|
-
red =
|
|
1105
|
+
red = GRYDRA::RedPrincipal.new
|
|
1093
1106
|
|
|
1094
1107
|
#Necesitamos agregar subredes a nuestra red
|
|
1095
1108
|
red.agregar_subred([2, 4, 1], [:relu, :tanh])
|
|
@@ -1114,7 +1127,7 @@ puts "Introduce los nuevos valores para predecir el precio del producto ej: (12
|
|
|
1114
1127
|
|
|
1115
1128
|
valores = gets.chomp.strip.split.map(&:to_f)
|
|
1116
1129
|
|
|
1117
|
-
entrada_nor =
|
|
1130
|
+
entrada_nor = GRYDRA.normalizar_varios([valores], max_en, :max)[0]
|
|
1118
1131
|
prediccion = red.combinar_resultados(entrada_nor)
|
|
1119
1132
|
prediccion_desnorm = prediccion[0] * max_sal[0]
|
|
1120
1133
|
puts "Precio aproximado en dolares es de $\#{prediccion_desnorm.round(2)}"
|
|
@@ -1122,9 +1135,9 @@ puts "Precio aproximado en dolares es de $\#{prediccion_desnorm.round(2)}"
|
|
|
1122
1135
|
else
|
|
1123
1136
|
puts "\e[1;35mLos ejemplos posibles son del 1 al 9\e[0m"
|
|
1124
1137
|
end
|
|
1125
|
-
if num_ejemplo
|
|
1126
|
-
File.write("#{nombre_archivo}.#{extension}", contenido)
|
|
1127
|
-
puts "Ejemplo generado y guardado en \e[33m#{path
|
|
1138
|
+
if num_ejemplo.between?(1, 9)
|
|
1139
|
+
File.write(File.join(path, "#{nombre_archivo}.#{extension}"), contenido)
|
|
1140
|
+
puts "Ejemplo generado y guardado en \e[33m#{File.join(path, nombre_archivo)}\e[0m"
|
|
1128
1141
|
end
|
|
1129
1142
|
end
|
|
1130
1143
|
end
|
data/lib/gr/version.rb
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module
|
|
2
|
-
VERSION = "0.1.
|
|
1
|
+
module GR
|
|
2
|
+
VERSION = "0.1.8"
|
|
3
3
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: grydra
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Razo
|
|
@@ -38,7 +38,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
39
|
version: '0'
|
|
40
40
|
requirements: []
|
|
41
|
-
rubygems_version: 3.
|
|
41
|
+
rubygems_version: 3.7.1
|
|
42
42
|
specification_version: 4
|
|
43
43
|
summary: Librería para redes neuronales en Ruby
|
|
44
44
|
test_files: []
|