Quiero dibujar un perceptrón multicapa como este:
Y creé el siguiente código:
\documentclass[tikz, margin=3mm] {standalone}
\usetikzlibrary{arrows.meta, matrix}
\begin{document}
\begin{tikzpicture}[
> = Stealth, thick,
plain/.style = {draw=none, fill=none, yshift=11mm, text width=7ex, align=center},% for text in images,
ec/.style = {draw=none, fill=none},% for emty cells,
net/.style = {matrix of nodes, % for matrix style
nodes={circle,fill=blue!20, draw, semithick, minimum width=12mm, inner sep=0mm},% circles in image
nodes in empty cells,% for not used cells in matrix
column sep = 16mm, % distance between columns in matrix
row sep = -3mm % distance between rows in matrix
}]
\matrix[net] (m)% m is matrix name, it is used for names of cell: firs has name m-1-1
% in empty space between ampersands will show circles:
% i.e.: nodes of the neural network
{
|[plain]| Input layer & |[plain]| Hidden layer & |[plain]| Output layer \\
|[ec]| & |[ec]| & |[ec]| \\
& -1 & |[ec]| \\
|[ec]| & |[ec]| & |[ec]| \\
|[ec]| & |[ec]| & 3 \\
|[ec]| & |[ec]| & |[ec]| \\
& -1 & |[ec]| \\
|[ec]| & |[ec]| & |[ec]| \\
};
\draw[<-] (m-3-1) -- node[left, xshift=-0.65cm] {$x_1$} +(-2cm,0);
\draw[<-] (m-7-1) -- node[left, xshift=-0.65cm] {$x_2$} +(-2cm,0);
\draw[->] (m-5-3) -- node[right, xshift=0.65cm] {$y$} +(2cm,0);
\draw[->] (m-3-1) -- node[above] {$-2$} (m-3-2);
\draw[->] (m-3-1) -- node[below, yshift=-0.75cm, xshift=-0.5cm] {$2$} (m-7-2);
\draw[->] (m-7-1) -- node[above, yshift=0.75cm, xshift=-0.5cm] {$2$} (m-3-2);
\draw[->] (m-7-1) -- node[below] {$-2$} (m-7-2);
\draw[->] (m-3-2) -- node[above] {$2$} (m-5-3);
\draw[->] (m-7-2) -- node[below] {$2$} (m-5-3);
\end{tikzpicture}
\end{document}
Este es el resultado de lo anterior:
El problema es que el dibujo de tikz es asimétrico cada vez que elimino un nodo en la primera capa. Cuando dibujo un "1", la imagen es simétrica.
Entonces, ¿cómo puedo solucionar esto? Intenté ajustar el tamaño mínimo pero esto no ayuda.
¡Gracias!
Respuesta1
A matrix of nodes
cambia los anclajes del nodo interno a base
, si los mantiene así center
( nodes={... anchor=center}
el diagrama volverá a ser simétrico).
\documentclass[tikz, margin=3mm] {standalone}
\usetikzlibrary{arrows.meta, matrix}
\begin{document}
\begin{tikzpicture}[
> = Stealth, thick,
plain/.style = {draw=none, fill=none, yshift=11mm, text width=7ex, align=center},% for text in images,
ec/.style = {draw=none, fill=none},% for emty cells,
net/.style = {matrix of nodes, % for matrix style
nodes={circle,fill=blue!20, draw, semithick, minimum width=12mm, inner sep=0mm, anchor=center},% circles in image
nodes in empty cells,% for not used cells in matrix
column sep = 16mm, % distance between columns in matrix
row sep = -3mm % distance between rows in matrix
}]
\matrix[net] (m)% m is matrix name, it is used for names of cell: firs has name m-1-1
% in empty space between ampersands will show circles:
% i.e.: nodes of the neural network
{
|[plain]| Input layer & |[plain]| Hidden layer & |[plain]| Output layer \\
|[ec]| & |[ec]| & |[ec]| \\
& -1 & |[ec]| \\
|[ec]| & |[ec]| & |[ec]| \\
|[ec]| & |[ec]| & 3 \\
|[ec]| & |[ec]| & |[ec]| \\
& -1 & |[ec]| \\
|[ec]| & |[ec]| & |[ec]| \\
};
\draw[<-] (m-3-1) -- node[left, xshift=-0.65cm] {$x_1$} +(-2cm,0);
\draw[<-] (m-7-1) -- node[left, xshift=-0.65cm] {$x_2$} +(-2cm,0);
\draw[->] (m-5-3) -- node[right, xshift=0.65cm] {$y$} +(2cm,0);
\draw[->] (m-3-1) -- node[above] {$-2$} (m-3-2);
\draw[->] (m-3-1) -- node[below, yshift=-0.75cm, xshift=-0.5cm] {$2$} (m-7-2);
\draw[->] (m-7-1) -- node[above, yshift=0.75cm, xshift=-0.5cm] {$2$} (m-3-2);
\draw[->] (m-7-1) -- node[below] {$-2$} (m-7-2);
\draw[->] (m-3-2) -- node[above] {$2$} (m-5-3);
\draw[->] (m-7-2) -- node[below] {$2$} (m-5-3);
\end{tikzpicture}
\end{document}