비선형 좌표 변환

비선형 좌표 변환

저는 좌표 벡터가 행렬로 변환된 다음 비선형 함수로 점별로 변환되는 신경망에 대해 쓰고 있습니다.

방정식으로는 다음과 같습니다.σ(wx+), 어디σ는 비선형 함수이고,그리고는 이에 상응하는 행렬과 벡터이고엑스는 입력 벡터입니다. 여기서는 Ti의 좌표입니다.케이지.

Ti를 사용한 기본 예제를 통해 이를 설명하고 싶습니다.케이Z. 더wx+변환은 옵션을 사용하면 쉽게 구현할 수 [cm={w-entries, b-coordinate}]있으며 라이브러리를 사용하여 개별 좌표를 변환할 수도 있습니다 calc.

그러나 아래 제공된 MWE에서 볼 수 있듯이 순서가 잘못되었습니다. 나는 가지고있다 σ(엑스) +따라서 좌표를 꽤 많이 움직여야 합니다. 간단한 예제에서는 잘 작동하지만 더 복잡한 예제에서는 실패합니다.

를 통해 좌표 변환 후 비선형 변환을 구현하는 쉬운 방법이 있습니까 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}

편집하다진행 상황 업데이트: 사용에 성공했습니다.마모트의 탁월한 답변원하는 변환을 생성합니다.

그러나 외부 변수를 사용하지 못했습니다. 특히, 스케일링 매개변수나 주변 스케일 값을 변환에 전달하는 방법이 필요합니다. 현재는 센티미터와 포인트 사이의 변환 값을 변경하는 경우에만 사진 크기를 늘릴 수 있습니다. (두 좌표계 사이를 이동하는 더 좋은 방법이 있습니까? 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}

여기에 이미지 설명을 입력하세요

또한 원은 일부 베지어 곡선으로 구성되므로 더 정확하게 변환된 원을 원할 경우 파라메트릭 플롯을 통해 원을 그릴 수 있습니다.

관련 정보