Transformaciones de coordenadas no lineales

Transformaciones de coordenadas no lineales

Estoy escribiendo sobre redes neuronales, donde los vectores de coordenadas se transforman mediante matrices y luego se transforman puntualmente mediante una función no lineal.

Como ecuación, es algo así comoσ(wx+b), dóndeσes la función no lineal,wybson una matriz y un vector correspondientemente yXes el vector de entrada, aquí una coordenada en TikZ.

Quiero ilustrar eso con ejemplos básicos usando TikZ. Elwx+bLa transformación es fácil de implementar usando la [cm={w-entries, b-coordinate}]opción y también puedo transformar las coordenadas individuales usando la calcbiblioteca.

Sin embargo, como puede ver en el MWE que se proporciona a continuación, está en el orden incorrecto. Tengow σ(X) +by por lo tanto es necesario mover bastante las coordenadas. Funciona bien para el ejemplo simple, pero falla cuando paso a otros más complejos.

¿Existe una manera fácil de implementar transformaciones no lineales después de la transformación de coordenadas mediante cm?

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\pgfmathsetseed{1}
\begin{tikzpicture}[scale=2]
\fill[red!20] (0,0) -- (2.5, 2.5) -- (2.5, 0);
\fill[blue!20] (0,0) -- (2.5, 2.5) -- (0, 2.5);
\begin{scope}[cm={0, 2, -2, 0, (2.25, 0.25)}]
    \foreach \i in {0, ..., 50} {
        \draw[red] ({1/(1+exp(-3*(rnd-1.5)))}, {1/(1+exp(-3*(rnd-1.5))}) circle (0.015);
        \draw[blue] ({1/(1+exp(-3*(rnd+.5)}, {1/(1+exp(-3*(rnd+.5))}) circle (0.015);
    };
\end{scope}
\draw (0,0) -- (2.5, 2.5);
\end{tikzpicture}

\end{document}

EDITARActualización de progreso: he logrado usarla excelente respuesta de la marmotay crear la transformación deseada.

Sin embargo, no logro que utilice variables externas. En particular, me gustaría tener un parámetro de escala o alguna forma de pasar el valor de escala circundante a la transformación. Actualmente sólo puedo aumentar el tamaño de la imagen si cambio el valor de transformación entre centímetros y puntos. (¿Existe una mejor manera de pasar entre los dos sistemas de coordenadas? El escalado estricto a 28,4 parece complicado).

\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usepgfmodule{nonlineartransformations}
\makeatletter
\def\sigmoidtransformation{%
\edef\oriX{\the\pgf@x}%
\edef\oriY{\the\pgf@y}%
\typeout{old\space y=\oriX\space old \space y=\oriY}
\pgfmathsetmacro{\sigmoidx}{28.4/(1+exp(min(-\oriX/28,4, 5))}
\pgfmathsetmacro{\sigmoidy}{28.4/(1+exp(min(-\oriY/28.4, 5))}
\typeout{new\space x=\sigmoidx\space new\space y=\sigmoidy}
\setlength{\pgf@x}{\sigmoidx pt}
\setlength{\pgf@y}{\sigmoidy pt}
}
\begin{document}
\pgfmathsetseed{1}
\begin{tikzpicture}
\draw[red!50] (0,0) grid[xstep=0.333cm, ystep=0.333cm] (1,1);
\draw[red!50, shift={(0.5, 0.5)}] (0,0) circle (0.5);
\pgftransformnonlinear{\sigmoidtransformation}
\draw[gray] (-3,-3) grid[xstep=15pt, ystep=15pt] (3,3);
\draw[cm={1, 1, 0, 1, (1, 1)}] (0,0) circle(1);
\end{tikzpicture}

\end{document}

ingrese la descripción de la imagen aquí

Respuesta1

La conversión de cm a pt es tan simple como sumar factores como 1cm/1pt. Y podría hacer que las cosas dependan de un parámetro incorporándolos a la definición de la transformación. (También limpié un poco mi código anterior).

\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usepgfmodule{nonlineartransformations}
\makeatletter
\def\mytrafoA{1}
\def\sigmoidtransformation{%
\pgf@xa=\pgf@x%
\pgf@ya=\pgf@y%
\typeout{old\space x=\pgf@xa\space old \space y=\pgf@ya}%
\pgfmathsetmacro{\sigmoidx}{1cm/(1+exp(min(-\mytrafoA\pgf@xa/1cm, 5))}%
\pgfmathsetmacro{\sigmoidy}{1cm/(1+exp(min(-\mytrafoA\pgf@ya/1cm, 5))}%
\typeout{new\space x=\sigmoidx\space new\space y=\sigmoidy}%
\pgf@x=\sigmoidx pt
\pgf@y=\sigmoidy pt
}
\begin{document}
\begin{tikzpicture}
\draw[red!50] (0,0) grid[xstep=0.333cm, ystep=0.333cm] (1,1);
\draw[red!50, shift={(0.5, 0.5)}] (0,0) circle (0.5);
\pgftransformnonlinear{\sigmoidtransformation}
\draw[gray] (-3,-3) grid[xstep=15pt, ystep=15pt] (3,3);
\draw[cm={1, 1, 0, 1, (1, 1)}] (0,0) circle(1);
\end{tikzpicture}
\quad
\begin{tikzpicture}
\draw[red!50] (0,0) grid[xstep=0.333cm, ystep=0.333cm] (1,1);
\draw[red!50, shift={(0.5, 0.5)}] (0,0) circle (0.5);
\def\mytrafoA{2}
\pgftransformnonlinear{\sigmoidtransformation}
\draw[gray] (-3,-3) grid[xstep=15pt, ystep=15pt] (3,3);
\draw[cm={1, 1, 0, 1, (1, 1)}] (0,0) circle(1);
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

Tenga en cuenta también que un círculo se construye con algunas curvas de Bézier, por lo que si desea tener círculos transformados con mayor precisión, es posible que desee trazarlos mediante gráficos paramétricos.

información relacionada