Wie zeichne ich ein Tikz-Bild des Ridge-Regressionsbildes?

Wie zeichne ich ein Tikz-Bild des Ridge-Regressionsbildes?

Ich versuche, das folgende Bild nachzubilden:Bildbeschreibung hier eingeben

Leider wurde dies in Python gezeichnet, sodass ich es nicht wirklich verwenden kann. Daher dachte ich, ich sollte es mit Tikz neu erstellen.

Mein Versuch, das linke Bild zu erstellen:

\usetikzlibrary{arrows}
\usetikzlibrary{decorations.markings}
\begin{tikzpicture}
\coordinate (Origin) at (0,0);
\coordinate (OLSEstimates) at (2,8);
\coordinate (Intersect) at (2.55,4.3);
%0.5 scaled
\draw[rotate=45] (OLSEstimates) ellipse (1.275 and 3);
%0.75 scaled
\draw[rotate=45] (OLSEstimates) ellipse (1.9125 and 4.5);
%original boundary
\draw[rotate=45] (OLSEstimates) ellipse (2.56 and 6);
\draw [<->,thick] (0,10) node (yaxis) [above] {$y$}
        |- (10,0) node (xaxis) [right] {$x$};
\draw (0,0) circle (5);
%draw line to intersection
\draw[draw=black,-triangle 90] (Origin) -- (Intersect);
\end{tikzpicture}

Das Problem ist nun, dass, obwohl es so aussieht, als würde mein Kreis die Ellipse treffen, dies mühsam durch manuelles Anpassen der Koordinaten erreicht wurde (also wahrscheinlich falsch). Zweitens wurde der Schnittpunkt zwischen der Ellipse und dem Kreis ebenfalls mit derselben Methode erstellt, also ist er wahrscheinlich etwas daneben.

Jetzt habe ich etwas Verrücktes gesehen, nämlich dass Tikz die Koordinaten der Schnittpunkte zweier Linien berechnen kann, und ich habe mich gefragt, ob hier irgendeine Technik angewendet werden könnte.

Eine kleine Randbemerkung: Es wäre perfekt, wenn es die Ellipse sogar automatisch auf die richtige „Größe“ skalieren könnte, um sie an genau einem Punkt zu schneiden, aber ich schätze, das ist unmöglich (ich habe noch nie jemanden gesehen, der das macht).

Danke!

Antwort1

Der Code wurde geändert, um die konzentrischen Ellipsen und den Punkt zu platzieren. Die gleiche Idee mit der Verankerung der Ellipsen am quadratischen Knoten ist ebenfalls möglich.

Die Ausrichtung der Ellipsen kann stattdessen geändert werden, indem sie in Bezug auf den Ursprungsknoten verankert werden (diesen Teil habe ich jedoch nicht verstanden), worauf die Ridge-Gleichung meiner Meinung nach verweisen sollte.

\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.geometric,calc}
\begin{document}
\begin{tikzpicture}[>=latex]
\clip (-1,-1) rectangle (6,6);
\draw[->,thick] (-1,0) --++(6,0);
\draw[->,thick] (0,-1) --++(0,6);
% Given 
\def\myradius{2.5cm} % CHANGE THESE
\def\mypoint{(3,2)}
% computed 
\node[circle,draw,minimum height=2*\myradius] (o) at (0,0) {};
% here we take the point and compute the distance to the circle node 
% and also the angle of the point wrt to origin. Then we rotate ellipses and adjust the size
\path let \p1=\mypoint,\n1 = {veclen(\x1,\y1)-\myradius},\n2={atan2(\y1,\x1)} in 
\foreach \x in {1,0.75,0.5}{
node[ellipse,draw,
     minimum height=2*\n1*\x,
     minimum width=3.5*\n1*\x,
     rotate=\n2-90] (a) at \mypoint {}
};
\draw[->] (o.center) -- (a.center) 
node[above,inner sep=1pt,rounded corners,fill=white,draw] {$\theta_{\text{Normal Equation}}$};
\draw[->] (o.center) -- (o.80) 
node[above,inner sep=1pt,rounded corners,fill=white,draw] {$\theta_{\text{RidgeEquation}}$};
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Sie können so etwas versuchen, aber es dürfte effizientere Methoden geben:

\usetikzlibrary{intersections,calc}
\usetikzlibrary{arrows}
\usetikzlibrary{decorations.markings}
\begin{tikzpicture}
\draw [<->,thick] (0,10) node (yaxis) [above] {$y$}
    |- (10,0) node (xaxis) [right] {$x$};

\coordinate (Origin) at (0,0);
\coordinate (OLSEstimates) at (2,8);
\coordinate (Intersect) at (0,5.1); % Initial guess, must be inside the ellipse
%original boundary
\draw[rotate=45, name path=ellipse] (OLSEstimates) ellipse (2.56 and 6);
%scaled boundaries
\foreach \scale in {0.75,0.5} {
    \draw[rotate=45] (OLSEstimates) ellipse (\scale*2.56 and \scale*6);
}
%Compute intersection point iteratively
\foreach \j in {1,...,3} {
    \path[name path=circle-\j, overlay] let \p1 = ($(Origin)-(Intersect)$) in (Origin) circle ({veclen(\x1,\y1)});
    \draw[name intersections={of=ellipse and circle-\j,by={a,b}, total=\t}] let \p1 = ($0.5*(a)+0.5*(b)$) in (\x1,\y1) coordinate (Intersect);
}
\draw let \p1 = ($(Origin)-(Intersect)$) in (Origin) circle ({veclen(\x1,\y1)});
%draw line to intersection
\draw[draw=black,-triangle 90] (Origin) -- (Intersect);
\end{tikzpicture}

Wir möchten einen Kreis finden, der nur einen Schnittpunkt mit der Ellipse hat. In diesem Code wird er iterativ berechnet, indem der Mittelpunkt der beiden Schnittpunkte zwischen einem Kreis und der Ellipse genommen wird und der nächste Kreis diesen Punkt kreuzt.

Der Code funktioniert, ist aber extrem langsam!

Was das Zeichnen der Auslassungspunkte betrifft, habe ich den \drawBefehl in eine foreachSchleife eingefügt. Wie Sie sehen, ist das ganz einfach.

verwandte Informationen