diff --git a/Biblioteca-Redes-Neuronales/src/weight-initializer-algorithm/multiple-input-single-ouput.jl b/Biblioteca-Redes-Neuronales/src/weight-initializer-algorithm/multiple-input-single-ouput.jl index f87c2e9..65c7a8c 100644 --- a/Biblioteca-Redes-Neuronales/src/weight-initializer-algorithm/multiple-input-single-ouput.jl +++ b/Biblioteca-Redes-Neuronales/src/weight-initializer-algorithm/multiple-input-single-ouput.jl @@ -22,7 +22,7 @@ function InitializeNodes(X_train::Matrix,Y_train::Vector, n::Int, M=10)::Abstrac (_ , entry_dimension) = size(X_train) output_dimension = 1 # inicializamos p - p = rand(Float64, entry_dimension+1) + p = rand(Float32, entry_dimension) index = 1 tam :: Int8= 0 @@ -31,7 +31,7 @@ function InitializeNodes(X_train::Matrix,Y_train::Vector, n::Int, M=10)::Abstrac my_keys = zeros(Float64, n) while tam < n && index <= n new_point = X_train[index, :] - append!(new_point,1) + #append!(new_point,1) if notOrtonormal(nodes, p, new_point, tam) tam += 1 ordered_vector = sum(p.*new_point) @@ -56,8 +56,8 @@ function InitializeNodes(X_train::Matrix,Y_train::Vector, n::Int, M=10)::Abstrac x_a = nodes[key] y_a = y_values[key] - S[1]=M*p[entry_dimension+1] - A[1,:] = M.*p[1:entry_dimension] + S[1]=M + A[1,:] = zeros(Float64, entry_dimension) B[1] = y_a for index in 2:n @@ -65,14 +65,14 @@ function InitializeNodes(X_train::Matrix,Y_train::Vector, n::Int, M=10)::Abstrac x_s = nodes[key] y_s = y_values[key] + coeff_aux = 2M / sum(p.* (x_s - x_a)) - S[index] = M - sum(p .* x_s) * coeff_aux - A[index,:] = coeff_aux * p[1:entry_dimension] + S[index] = M - coeff_aux*sum(p .* x_s) + A[index,:] = coeff_aux * p B[index] = y_s - y_a x_a = x_s y_a = y_s - end return OneLayerNeuralNetworkFromMatrix(S,A,B) end \ No newline at end of file diff --git a/Biblioteca-Redes-Neuronales/test/weight-inizializer-algorithm/multiple-input-single-output.test.jl b/Biblioteca-Redes-Neuronales/test/weight-inizializer-algorithm/multiple-input-single-output.test.jl index c65d300..1853207 100644 --- a/Biblioteca-Redes-Neuronales/test/weight-inizializer-algorithm/multiple-input-single-output.test.jl +++ b/Biblioteca-Redes-Neuronales/test/weight-inizializer-algorithm/multiple-input-single-output.test.jl @@ -1,12 +1,3 @@ -using Test -using Random -Random.seed!(2); - -include("./../../src/activation_functions.jl") -include("./../../src/one_layer_neuronal_network.jl") -include("./../../src/weight-initializer-algorithm/main.jl") -using .InitialNeuralNetwork -### borrar lo de arriba @testset "Nodes initialization algorithm entry dimension >1 output dimension 1" begin # Comprobamos que las hipótesis de selección son correctas M = 1 @@ -15,16 +6,16 @@ using .InitialNeuralNetwork # Bien definido para tamaño n = 2 y salida de dimensión 1 f_regression(x,y,z)=x*y-z - data_set_size = 3 + data_set_size = 4 entry_dimension = 3 output_dimension = 1 # Número de neuronas n = data_set_size# Debe de ser mayor que 1 para que no de error X_train= rand(Float64, data_set_size, entry_dimension) - Y_train = map(x->f_regression(x...), eachrow(X_train))#ones(Float64, data_set_size, output_dimension) + Y_train = map(x->f_regression(x...), eachrow(X_train)) h = InitializeNodes(X_train, Y_train, n, M) - + # veamos que el tamaño de la salida es la adecuada @test size(h.W1) == (n,entry_dimension+1) @test size(h.W2) == (output_dimension,n) diff --git a/Memoria/capitulos/5-Estudio_experimental/2_descripcion_inicializacion-pesos.tex b/Memoria/capitulos/5-Estudio_experimental/2_descripcion_inicializacion-pesos.tex index 34b3652..fc101a2 100644 --- a/Memoria/capitulos/5-Estudio_experimental/2_descripcion_inicializacion-pesos.tex +++ b/Memoria/capitulos/5-Estudio_experimental/2_descripcion_inicializacion-pesos.tex @@ -112,8 +112,8 @@ \section{Descripción del método propuesto} $p_{[i,j]} = (p_i, p_{i+1}, \ldots, p_{j})$ donde $(p_0, p_1, \ldots, p_d)=p$, comenzaremos definiendo el valor de la primera fila como \begin{align} - &S_1 = M p_0, \\ - & A_{1 *} = M p_{[1,d]}, \\ + &S_1 = 0, \\ + & A_{1 *} = 0_{[1,d]}, \\ & B_{* 1} = y_1. \end{align} @@ -151,8 +151,9 @@ \section{Descripción del método propuesto} \begin{equation} \left\{ \begin{array}{l} + % sesgo \alpha_{k 0} = \tilde{\alpha}_{k s} = - M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k}) + M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k}) \\ \alpha_{k i} = \tilde{\alpha}_{k p} p_{i} = @@ -168,9 +169,11 @@ \section{Descripción del método propuesto} \begin{equation} \left\{ \begin{array}{l} - S_{k} = M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k-1})\\ + S_{k} = + M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k}) + \\ A_{k i} = \frac{2 M}{p \cdot (x_k - x_{k-1})} - p_{i} + p_{i} \\ B_{* k} = y_k - y_{k-1} \end{array} @@ -223,7 +226,7 @@ \section{Descripción del método propuesto} \STATE \textit{Cálculo del resto de neuronas}. \For{ cada $(x_k, y_k) \in \Lambda$}{ \begin{align} - &S_{k} = M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k-1})\\ + &S_{k} = M - \frac{2 M}{p \cdot (x_k - x_{k-1})}(p \cdot x_{k}),\\ & A_{k i} = \frac{2 M}{p \cdot (x_k - x_{k-1})} p_{i} \quad i \in \{1, \ldots d\},\\ & B_{* k} = y_k - y_{k-1}. diff --git a/Memoria/capitulos/5-Estudio_experimental/3_detalles_implementacion.tex b/Memoria/capitulos/5-Estudio_experimental/3_detalles_implementacion.tex index 535708b..770dad6 100644 --- a/Memoria/capitulos/5-Estudio_experimental/3_detalles_implementacion.tex +++ b/Memoria/capitulos/5-Estudio_experimental/3_detalles_implementacion.tex @@ -126,14 +126,15 @@ \subsubsection*{ Selección de la estructuras de datos adecuada} } se nos indica que evitar el uso de tipo abstractos mejora la eficiencia. \item Mantiene el mismo coste computacional. Concretamente para ordenar Julia dispone de - dos algoritmo en su núcleo: \textit{Quick Sort} y \textit{Merge Sort}. - - Nosotros hemos optado por usar \textit{Quick Sort} \cite{Quicksort} porque a pesar de tener la misma complejidad $\mathcal{O}(n \log(n))$ la constante oculta de \textit{Quick Sort} es menor con array y además no necesita de memoria adicional, (\textit{Merge Sort}\cite{merge-sort} tiene complejidad $\mathcal{O}(n)$ en memoria). - ya que la ordenación de un array mantiene la eficiencia ya que - tal y como se indica en la documentación de Julia \footnote{ Consúltese \url{https://docs.julialang.org/en/v1/base/sort/}} - en la ordenación de array numéricos - (nuestro caso) utiliza el método de ordenación de \textit{Quick Sort} - (véase el artículo comparativo \cite{quicksort-vs-merge-sort}). + dos algoritmos: \textit{Quick Sort} y \textit{Merge Sort}\footnote{ Consúltese \url{https://docs.julialang.org/en/v1/base/sort/}} . + + Nosotros hemos optado por usar \textit{Quick Sort} \cite{Quicksort} porque a pesar de tener ambos algoritmos la misma complejidad media $\mathcal{O}(n \log(n))$, la constante oculta de \textit{Quick Sort} es menor con \textit{arrays} y además no necesita de memoria adicional, (\textit{Merge Sort} \cite{merge-sort} tiene complejidad $\mathcal{O}(n)$ en memoria) (véase el artículo comparativo \cite{quicksort-vs-merge-sort}). \end{itemize} - +\subsection{Diseño de los tests} + +Deberá de comprobarse que las dimensiones de salida de la red neuronal son las adecuadas +con respecto a la entrada y salida de los datos. + +De acorde a la propiedad del teorema \ref{teo:eficacia-funciones-activation} todos los datos con los que se construya la red neuronal deben de tener una aproximación exacta. +