我正在写关于神经网络的文章,其中坐标向量通过矩阵变换,然后通过非线性函数逐点变换。
作为一个等式,它类似于σ(韦克斯+b), 在哪里σ是非线性函数,瓦和b分别是矩阵和向量,并且X是输入向量,这里是 Ti 中的坐标钾Z。
我想说明一下使用 Ti 的基本示例钾Z.韦克斯+b使用该选项可以轻松实现转换[cm={w-entries, b-coordinate}]
,并且我还可以使用该库转换各个坐标calc
。
但是,正如您从下面提供的 MWE 中看到的那样,它的顺序是错误的。我有瓦 σ(X)+b因此需要稍微调整一下坐标。对于简单示例,它运行良好,但对于更复杂的示例,它失败了。
有没有一种简单的方法可以通过坐标变换后实现非线性变换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}
编辑进度更新:我已经设法使用marmot 的精彩回答并创建所需的转换。
但是我无法让它使用任何外部变量。特别是,我希望有一个缩放参数或某种方式将周围的缩放值传递到转换中。目前,如果我更改厘米和点之间的转换值,我只能增加图片大小。(有没有更好的方法在两个坐标系之间切换?按 28.4 进行硬缩放感觉很笨拙。)
\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}
答案1
从 cm 到 pt 的转换很简单,只需添加诸如 之类的因子1cm/1pt
即可。并且,您可以通过将它们构建到转换的定义中,使事物依赖于参数。(我还清理了一些旧代码。)
\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}
还请注意,圆是由一些贝塞尔曲线构造的,因此如果您想要更精确地变换圆,您可能需要通过参数图来绘制它们。