[Archiv der Frage Plot to illustrate linear regression von LeO auf TeX.SX]


Im Rahmen einer Lehrtätigkeit möchte ich die Grundlagen der linearen Regression erklären und wie sie erweitert werden kann. Da ich kein TeXpert bin, befürchte ich, dass meine Idee vielleicht zu kompliziert und schwieriger ist als gedacht. Ich habe schon viele schöne Skizzen mit TikZ und pgfplots gesehen.

Ich habe gesucht und schließlich dieses Bild gefunden:

alt text

Das Bild sieht sehr passend aus, weil ich daran erklären kann wie lineare Regression aussehen könnte. Aber das Problem ist, dass ich das Bild nicht verändern kann, z.B. ein Gitter zeichnen, die Bezeichnungen wie x_0 oder \epsilon ändern oder aus der roten Linie eine gepunktete machen sowie weitere Punkte zu P und Q hinzufügen, etc. Mein Hauptziel ist es die grundlegende Idee zu veranschaulichen. Wenn ich ein Beispiel hätte, dann könnte ich dieses ein wenig erwietern auf Mittelwert, Varianz, etc.

Möchte mir jemand Hilfestellung anbieten? Es ist auch kein Problem, wenn mich jemand auf existierende Beispiele hinweist.

gefragt 03 Mai '14, 14:14

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 03 Mai '14, 14:32


Mit TikZ ist das wirklich leicht. Im folgenden habe ich Plain TeX verwendet, weshalb man \input tikz.tex machen muss statt \usepackage{tikz} und statt \begin{document}...\end{document} setzt man einfach \bye ans Ende des Dokuments.

Den folgenden Code setzt man mit pdftex

Open in writeLaTeX
\input tikz.tex
\nopagenumbers% for cropping
\usetikzlibrary{arrows,intersections}
\tikzpicture[
        thick,
        >=stealth',
        dot/.style = {
            draw,
            fill=white,
            circle,
            inner sep=0pt,
            minimum size=4pt
        }
    ]
    \coordinate (O) at (0,0);
    \draw[->] (-0.3,0) -- (8,0) coordinate[label={below:$x$}] (xmax);
    \draw[->] (0,-0.3) -- (0,5) coordinate[label={right:$f(x)$}] (ymax);
    \path[name path=x] (0.3,0.5) -- (6.7,4.7);
    \path[name path=y] plot[smooth] coordinates {(-0.3,2) (2,1.5) (4,2.8) (6,5)};
    \scope[name intersections={of=x and y,name=i}]
        \fill[gray!20] (i-1) -- (i-2 |- i-1) -- (i-2) -- cycle;
        \draw (0.3,0.5) -- (6.7,4.7) node[pos=0.8,below right] {Sekante};
        \draw[red] plot[smooth] coordinates {(-0.3,2) (2,1.5) (4,2.8) (6,5)};
        \draw (i-1) node[dot,label={above:$P$}] (i-1) {} -- node[left] {$f(x_0)$} (i-1 |- O) node[dot,label={below:$x_0$}] {};
        \path (i-2) node[dot,label={above:$Q$}] (i-2) {} -- (i-2 |- i-1) node[dot] (i-12) {};
        \draw (i-12) -- (i-12 |- O) node[dot,label={below:$x_0 + \varepsilon$}] {};
        \draw[blue,<->] (i-2) -- node[right] {$f(x_0 + \varepsilon) - f(x_0)$} (i-12);
        \draw[blue,<->] (i-1) -- node[below] {$\varepsilon$} (i-12);
        \path (i-1 |- O) -- node[below] {$\varepsilon$} (i-2 |- O);
        \draw[gray] (i-2) -- (i-2 -| xmax);
        \draw[gray,<->] ([xshift=-0.5cm]i-2 -| xmax) -- node[fill=white] {$f(x_0 + \varepsilon)$}  ([xshift=-0.5cm]xmax);
    \endscope
\endtikzpicture
\bye

Die produziert die folgende Ausgabe (freigestellt)

alt text

Da die Schnittpunkt mit der intersections Bibliothek berechnet werden ist die Lösung adaptiv. In der folgenden Lösung wird nicht der Punkt Q bewegt, sondern einer Punkte auf der roten Linien, was dazu führt, dass sich Q bewegt (wenn man genau hinschaut, dass kann man sehen, dass die rote Linie eine hässliche Delle bekommt wenn Q nach rechts läuft).

Mein Arbeitsablauf zum Erstellen von Animationen ist der folgende:

  • Verändere die Quelldatei, sodass für jede Variation des Parameters eine extra Seite ausgegeben wird (meistens mit Hilfe von der PGF \foreach Schleife, wie hier)
  • Das resultierende PDF freistellen mit Heiko Oberdieks pdfcrop.
  • Importieren der freigestellten PDF in GIMP.
  • In GIMP: Umkehren der Layer Ordnung und Export als .gif mit der Option Als Animation ausgewählt und einer Verzögerung von 200 Millisekunden (andernfalls ist es mit zu schnell).

Im folgenden befindet sich der Code zum erstellen der Animation. Ich habe die zusätzlichen und veränderten Zeilen markiert um den Unterschied zum obigen Code hervorzuheben.

Open in writeLaTeX
\input tikz.tex
\nopagenumbers% for cropping
\usetikzlibrary{arrows,intersections}
\foreach \Q in {4,4.1,4.2,...,5,4.9,4.8,...,4.1} {%<-- neu
\tikzpicture[
        thick,
        >=stealth',
        dot/.style = {
            draw,
            fill=white,
            circle,
            inner sep=0pt,
            minimum size=4pt
        }
    ]
    \coordinate (O) at (0,0);
    \draw[->] (-0.3,0) -- (8,0) coordinate[label={below:$x$}] (xmax);
    \draw[->] (0,-0.3) -- (0,5) coordinate[label={right:$f(x)$}] (ymax);
    \path[name path=x] (0.3,0.5) -- (6.7,4.7);
    \path[name path=y] plot[smooth] coordinates {(-0.3,2) (2,1.5) (\Q,2.8) (6,5)};%<-- geändert
    \scope[name intersections={of=x and y,name=i}]
        \fill[gray!20] (i-1) -- (i-2 |- i-1) -- (i-2) -- cycle;
        \draw (0.3,0.5) -- (6.7,4.7) node[pos=0.8,below right] {Sekante};
        \draw[red] plot[smooth] coordinates {(-0.3,2) (2,1.5) (\Q,2.8) (6,5)};%<-- geändert
        \draw (i-1) node[dot,label={above:$P$}] (i-1) {} -- node[left] {$f(x_0)$} (i-1 |- O) node[dot,label={below:$x_0$}] {};
        \path (i-2) node[dot,label={above:$Q$}] (i-2) {} -- (i-2 |- i-1) node[dot] (i-12) {};
        \draw (i-12) -- (i-12 |- O) node[dot,label={below:$x_0 + \varepsilon$}] {};
        \draw[blue,<->] (i-2) -- node[right] {$f(x_0 + \varepsilon) - f(x_0)$} (i-12);
        \draw[blue,<->] (i-1) -- node[below] {$\varepsilon$} (i-12);
        \path (i-1 |- O) -- node[below] {$\varepsilon$} (i-2 |- O);
        \draw[gray] (i-2) -- (i-2 -| xmax);
        \draw[gray,<->] ([xshift=-0.5cm]i-2 -| xmax) -- node[fill=white] {$f(x_0 + \varepsilon)$}  ([xshift=-0.5cm]xmax);
    \endscope
\endtikzpicture
\eject%<-- neu
}%<-- neu
\bye

alt text


Zum Spaß mit PSTricks vom TeX.SX User der ständig seinen Namen ändert, natürlich auf TeX.SX.

Open in writeLaTeX
\documentclass[pstricks]{standalone}
\usepackage{pst-plot,pst-eucl}
\def\f(#1){((#1-1)^2+5)/5}
\def\L#1#2#3{\psCoordinates[linestyle=dashed](#1)\uput[-90](#1|0,0){$#2\mathstrut$}\uput[180](0,0|#1){$#3$}}
\begin{document}
\begin{pspicture}[algebraic,saveNodeCoors,NodeCoorPrefix=N](-2,-1)(7,5)
    \psaxes[labels=none,ticks=none]{->}(0,0)(-1,-1)(6.5,4.5)[$x$,0][$y$,90]
    \psplot[linecolor=red]{-1}{5}{\f(x)}
    \pstGeonode[PosAngle=90](*1 {\f(x)}){P}(*3.5 {\f(x)}){Q}
    \psdot(Q|P)
    \pcline[nodesep=-2](P)(Q)
    \L{P}{x}{f(x)}
    \L{Q}{x+\varepsilon}{f(x+\varepsilon)}
    \pcline[linecolor=blue](P)(Q|P)\nbput{$\varepsilon$}
    \pcline[linecolor=blue](Q)(!NQx NPy)\naput{$f(x+\varepsilon)-f(x)$}
    \uput[-45]([nodesep=-1]{p}Q){secant}
    \uput[0](*5 {\f(x)}){\textcolor{red}{$y=f(x)$}}
\end{pspicture}
\end{document}

alt text


Mit MetaPost und dem Metafun-Format von fpast auf TeX.SX.

Das Bild übersetzt man mit mpost --mem=metafun --tex=latex file.mp

Open in writeLaTeX
input latexmp; setupLaTeXMP(textextlabel=enable, mode=rerun);

vardef drawemptydot expr z = 
  save circle; path circle; circle = fullcircle scaled 3bp shifted z;
  unfill circle;
  draw circle;
enddef;

u := cm; % Unit length

beginfig(1);

xmin := -0.5; xmax := 9.5; ymin := -0.5; ymax := 6;

path curve; curve = (-0.5, 3.5){dir -30} .. (2.5, 2){dir 15} .. (5, 3.5) .. (8, 6){dir 30};

% Triangle and labels
z.P = point 1 of curve; z.Q = point 2 of curve; 
z.R = (x.Q, y.P); z.S = (x.P, 0); z.T = (x.Q, 0);
fill z.P--z.Q--z.R--cycle scaled u withcolor 0.9[blue, white];
%
drawoptions(withcolor blue);
drawdblarrow (z.P -- z.R) scaled u shortened 2bp;
drawdblarrow (z.R -- z.Q) scaled u shortened 2bp;
label.bot("$\varepsilon$", u*.5[z.P, z.R]);
label.rt("$f(x_0+\varepsilon) - f(x_0)$", u*.5[z.R, z.Q]);
%
drawoptions(withcolor black);
draw ((x.P, 0) -- z.P) scaled u;
draw ((x.Q, 0) -- z.R) scaled u;
draw (z.Q -- (xmax, y.Q)) scaled u;

% The curve
draw curve scaled u withcolor red;

% Axes
drawarrow (xmin*u, 0) -- (xmax*u, 0);
drawarrow (0, ymin*u) -- (0, ymax*u);
label.bot("$x$", (xmax*u, 0));
label.lft("$f(x)$", (0, ymax*u));

% Other labels
label.ulft("$P$", u*z.P);
label.ulft("$Q$", u*z.Q);
label.bot("$x_0$", u*z.S);
label.bot("$x_0+\varepsilon$", u*z.T);
label.bot("$\varepsilon$", u*(.5(x.P+x.Q), 0));
label.lft("$f(x_0)$", u*(.5[z.S, z.P]));

z.U = (0.8[x.Q, xmax], y.Q);
drawdblarrow ((x.U, 0) -- z.U) scaled u shortened .5bp;
picture yQ_label; yQ_label = thelabel("$f(x_0+\varepsilon)$", u*.5[(x.U, 0), z.U]);
unfill bbox yQ_label; draw yQ_label;

% Secante
path secante; secante = 1.8[z.Q, z.P] -- 2.5[z.P, z.Q] ;
draw secante scaled u;
label.lrt("Sekante", u*point .9 of secante);
forsuffixes M = P, Q, R, S, T:
  drawemptydot z.M scaled u;
endfor;

endfig;
end.

alt text

Permanenter link

beantwortet 03 Mai '14, 14:26

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 03 Mai '14, 14:41

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×730
×117
×54

gestellte Frage: 03 Mai '14, 14:14

Frage wurde gesehen: 12,764 Mal

zuletzt geändert: 03 Mai '14, 15:59