
¿Cómo puedo dibujar esto?
Un diagrama relacionado (más complicado) está aquí.Tikz dibuja el contorno de la red neuronal
Intenté modificar el código proporcionado por @Zarco pero solo pude modificar los nodos. Termino realmente confundido con las flechas.
\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{chains, positioning}
\begin{document}
\begin{tikzpicture}[shorten >=1pt,->, draw=black!50,
node distance = 6mm and 15mm,
start chain = going below,
every pin edge/.style = {<-,shorten <=1pt},
neuron/.style = {circle, draw=black, fill=#1, % <--- changed
minimum size=17pt, inner sep=0pt,
on chain},
annot/.style = {text width=4em, align=center}
]
% Draw the input layer nodes
\foreach \i in {1,...,3}
\node[neuron=green!50,
pin=180:] (I-\i) {};
% Draw the hidden layer nodes
\node[neuron=blue!50,
above right=6mm and 15mm of I-1.center] (H-1) {$x_{1}$};
\foreach \i [count=\j from 1] in {2}
\node[neuron=blue!50,
below=of H-\j] (H-\i) {$x_{\i}$};
% Draw the output layer node
\node[neuron=red!50,
pin= {[pin edge=->]0:Output \#1},
right=of I-2 -| H-1] (O-1) {$x_{1}$};
\node[neuron=red!50, % <--- changed
pin= {[pin edge=->]0:Output \#2},
below=of O-1] (O-2) {$x_{2}$}; % <--- changed
\node[neuron=red!50,
pin= {[pin edge=->]0:Output \#3},
below=of 0-2] (O-3) {$x_{1}$};
% Connect input nodes with hidden nodes and
% hiden nodes with output nodes with the output layer
\foreach \i in {1,...,4}
\foreach \j in {1,...,5}
{
\path (I-\i) edge (H-\j)
\ifnum\i<3 % <--- changed
(H-\j) edge (O-\i)
\fi;
}
\end{tikzpicture}
\end{document}
Gracias de antemano.
Respuesta1
La chains
biblioteca es una herramienta poderosa, pero quizás no sea realmente adecuada para este tipo de diagramas. Este es un intento de hacer las cosas más automáticas y accesibles. Lea las anotaciones en el código. Las entradas y salidas se almacenan en listas, al igual que el número de neuronas.
\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{quotes,positioning}
\begin{document}
\begin{tikzpicture}[shorten >=1pt,->, draw=black!50,>=stealth,
every pin edge/.style = {<-,shorten <=1pt},
every pin/.style={font=\small\sffamily,text=gray,inner sep=1pt},
neuron/.style = {circle, draw=black, fill=#1,
minimum size=20pt, inner sep=0pt},
neuron/.default=white,
layer 1/.style={neuron=green!50,pin={[alias=el1-\i]180:\myedgelabel}},
layer 2/.style={neuron=blue!50},
layer 3/.style={neuron=red!50,pin={[pin edge={->},alias=el3-\i]0:\myedgelabel}},
annot/.style = {text width=4em, align=center},
neuron list/.store in=\NeuronList,
neuron list={3,2,3}, %<- # of neurons at each layer
input list/.store in=\InputList,
input list={200,150,200},%<- inputs
output list/.store in=\OutputList,
output list={200,250,100},%<- outputs
]
% Draw the input layer nodes
\pgfmathtruncatemacro{\imax}{{\NeuronList}[0]}
\path foreach \i in {1,...,\imax}
{(0,{(\imax/2-1/2-\i)*1.5})
[/utils/exec=\pgfmathsetmacro{\myedgelabel}{{\InputList}[\i-1]}]
node[layer 1] (P-\i) {$P_\i$}};
% Draw the hidden layer nodes
\pgfmathtruncatemacro{\imax}{{\NeuronList}[1]}
\path foreach \i in {1,...,\imax}
{(25mm,{(\imax/2-1/2-\i)*1.5}) node[layer 2] (T-\i) {$T_\i$}};
% % Draw the output layer node
\pgfmathtruncatemacro{\imax}{{\NeuronList}[2]}
\path foreach \i in {1,...,\imax}
{(60mm,{(\imax/2-1/2-\i)*1.5})
[/utils/exec=\pgfmathsetmacro{\myedgelabel}{{\OutputList}[\i-1]}]
node[layer 3] (D-\i) {$D_\i$}};
% edges
\path[nodes={text=red,font=\small\sffamily},->]
(P-1) edge["1"] (T-1)
(P-1) edge["4"' {pos=0.2}] (T-2) %<- a prime swaps the label position
(P-2) edge["2" {pos=0.15}] (T-2) %<- with pos you can control the position
(P-3) edge["2"' {pos=0.3}] (T-1)
(P-3) edge["3"] (P-2)
(T-1) edge["2"] (D-1)
(T-1) edge["3"] (D-2)
(D-1) edge["2"] (D-2)
(T-2) edge["1"] (D-2)
(T-2) edge["3"] (D-3);
% extra
\begin{scope}[node distance=0pt,nodes={font=\small\sffamily,color=blue}]
\node[above=of P-1]{(pure)};
\node[below=of P-3]{(pure)};
\node[below=of el3-2]{(pure)};
\end{scope}
\end{tikzpicture}
\end{document}