使用 tikz 复制绘图

使用 tikz 复制绘图

我正在尝试在 LaTeX 中复制以下图并使用tikz。我正在使用 R 开发原型,但使用 R 有点困难 - 尤其是尝试让箭头与每次“跳跃”正确对齐。如何使用制作类似的图tikz? - 它是为了展示具有给定学习率的梯度下降。

在此处输入图片描述

答案1

可能最难的部分是找到一个合适的函数来绘图,但稍微思考一下就会发现类似的东西是x^2/2-3x+5可行的。由于您想多次重复使用此功能,我认为最好的方法是使用以下方法显式声明该函数:

\begin{tikzpicture}[declare function={f(\x)=0.5*\x*\x-3*\x+5;}]
    ...
\end{tikzpicture}

之后,您可以使用(a,{f(a)})的不同值绘制点a。 周围的括号f(a)是必要的,以便蒂克兹不会对绘制点的坐标感到困惑。这里a可以是任何东西,从明确的数字到\foreach循环或plot命令中的变量。

一旦完成了一些相当简单的蒂克兹命令产生:

在此处输入图片描述

请注意,与 OP 中的图像不同,我将点放在函数的顶部,因为我认为这看起来更好。要更改此设置,您只需将命令移到循环plot之后\foreach。我留下了“最小”和“学习步骤”这两个词作为练习:)

以下是代码:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\begin{document}

\tikzset{
  point/.style = {% define a style for the function points
    circle,
    fill=#1,
    draw=black,
    inner sep=2pt,
  },
  point/.default = {violet!60}
}

\begin{tikzpicture}[declare function={f(\x)=0.5*\x*\x-3*\x+5;}]
    \draw[thick,-{LaTeX}](0,0)--(6,0) node[right]{$\theta$};
    \draw[thick,-{LaTeX}](0,0)--(0,4) node[above]{Cost};
    \draw[thick, dashed](0.6, {f(0.6)}) -- (0.6,0)
          node[below, text width=4em, align=center]{Random initial value};
    \draw[thick, dashed](3, {f(3)}) -- (3,0) node[below]{$\hat\theta$};
    \draw[domain=0.5:5.5, smooth, thick, gray] plot (\x, f(\x);
    \foreach \a [count=\c, remember=\c as \C] in {0.6, 1.0, ..., 2.6} {
      \node[point] (\c) at (\a, {f(\a)}){};
      \ifnum\c>1 % after the first coordinate draw an arrow
         \draw[->, bend left](\C) to (\c);
      \fi
    }
    \node[point=yellow] (Y) at (3, {f(3)}){}; % add the yellow point
    \draw[->, bend left](6) to (Y);
 \end{tikzpicture}

\end{document}

只需改变循环中的点列表\foreach(然后更新(6)为最后一个命令中绘制的点数\draw)即可添加更多点。

相关内容