Nichtlineare Koordinatentransformationen

Nichtlineare Koordinatentransformationen

Ich schreibe über neuronale Netzwerke, bei denen Koordinatenvektoren durch Matrizen transformiert und dann punktweise durch eine nichtlineare Funktion transformiert werden.

Als Gleichung ist es etwa soσ(wx+B), Woσist die nichtlineare Funktion,mUndBsind eine Matrix und ein Vektor entsprechend undXist der Eingangsvektor, hier eine Koordinate in TikZ.

Ich möchte das anhand einfacher Beispiele mit Ti veranschaulichen.kZ. Diewx+BDie Transformation lässt sich mit der Option einfach umsetzen [cm={w-entries, b-coordinate}]und auch die einzelnen Koordinaten kann ich über die calcBibliothek transformieren.

Wie Sie jedoch aus dem unten angegebenen MWE ersehen können, ist es in der falschen Reihenfolge. Ich habem σ(X) +Bund muss daher die Koordinaten ziemlich verschieben. Bei dem einfachen Beispiel funktioniert es gut, aber bei komplexeren Beispielen schlägt es fehl.

Gibt es eine einfache Möglichkeit, nichtlineare Transformationen nach der Koordinatentransformation über zu implementieren 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}

BEARBEITENFortschrittsaktualisierung: Ich habe es geschafft,Murmeltiers ausgezeichnete Antwortund erstellen Sie die gewünschte Transformation.

Ich schaffe es jedoch nicht, externe Variablen zu verwenden. Insbesondere hätte ich gerne einen Skalierungsparameter oder eine Möglichkeit, den umgebenden Skalierungswert in die Transformation zu übergeben. Derzeit kann ich die Bildgröße nur erhöhen, wenn ich den Transformationswert zwischen Zentimetern und Punkten ändere. (Gibt es eine bessere Möglichkeit, zwischen den beiden Koordinatensystemen zu wechseln? Eine harte Skalierung von 28,4 fühlt sich klobig an.)

\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}

Bildbeschreibung hier eingeben

Antwort1

Die Umrechnung von cm in pt ist so einfach wie das Hinzufügen von Faktoren wie 1cm/1pt. Und Sie können Dinge von einem Parameter abhängig machen, indem Sie sie in die Definition der Transformation einbauen. (Ich habe auch meinen alten Code ein wenig aufgeräumt.)

\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}

Bildbeschreibung hier eingeben

Bitte beachten Sie auch, dass ein Kreis mit einigen Bézierkurven konstruiert wird. Wenn Sie also genauer transformierte Kreise wünschen, möchten Sie diese möglicherweise mithilfe parametrischer Diagramme darstellen.

verwandte Informationen