<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Madiyar&#39;s Page</title>
<link>https://maitbayev.github.io/</link>
<atom:link href="https://maitbayev.github.io/index.xml" rel="self" type="application/rss+xml"/>
<description>Madiyar&#39;s Page</description>
<generator>quarto-1.8.27</generator>
<lastBuildDate>Sun, 11 May 2025 23:00:00 GMT</lastBuildDate>
<item>
  <title>Why are two random vectors near orthogonal in high dimensions?</title>
  <dc:creator>Madiyar Aitbayev</dc:creator>
  <link>https://maitbayev.github.io/posts/random-two-vectors/</link>
  <description><![CDATA[ 





<section id="why-are-two-random-vectors-near-orthogonal-in-high-dimensions" class="level1">
<h1>Why are two random vectors near orthogonal in high dimensions?</h1>
<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>High-dimensional embedding vectors are fundamental building blocks in Machine Learning, particularly in <a href="https://en.wikipedia.org/wiki/Transformer_(deep_learning_architecture)">transformers</a> or <a href="https://en.wikipedia.org/wiki/Word2vec">word2vec</a>. Typically, two vectors that are semantically similar point in roughly the same direction; if they are entirely dissimilar, they point in opposite directions; and if they’re nearly orthogonal, they are unrelated.</p>
<p>We usually think in two or three dimensions, but there are some unintuitive properties that only apply in higher dimensions. For example, two random vectors are expected to be near orthogonal in high dimensions. Intuitively, it makes sense for <a href="https://en.wikipedia.org/wiki/Word2vec">word2vec</a>, as we expect that two words are unrelated in most instances.</p>
<p>In this post, I will explain why two random vectors are expected to be nearly orthogonal in high dimensions.</p>
<p><a href="https://maitbayev.substack.com/subscribe">Subscribe</a> to get a notification about future posts.</p>
</section>
<section id="two-dimensions" class="level2">
<h2 class="anchored" data-anchor-id="two-dimensions">Two Dimensions</h2>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb1" data-startfrom="25" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 24;"><span id="cb1-25"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeCircle2D</span>(vecU<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> vecV<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> height<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span>) {</span>
<span id="cb1-26">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> svg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> d3<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'svg'</span>)</span>
<span id="cb1-27">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'viewBox'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> height])<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-28">  </span>
<span id="cb1-29">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">appendArrow</span>(svg<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> v<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> id) {</span>
<span id="cb1-30">    svg</span>
<span id="cb1-31">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">append</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'defs'</span>)</span>
<span id="cb1-32">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">append</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'marker'</span>)</span>
<span id="cb1-33">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'id'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> id)</span>
<span id="cb1-34">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'viewBox'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>])</span>
<span id="cb1-35">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'refX'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>)</span>
<span id="cb1-36">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'refY'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>)</span>
<span id="cb1-37">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'markerWidth'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>)</span>
<span id="cb1-38">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'markerHeight'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>)</span>
<span id="cb1-39">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'orient'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'auto-start-reverse'</span>)</span>
<span id="cb1-40">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">append</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'path'</span>)</span>
<span id="cb1-41">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'d'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> d3<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">line</span>()([[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>]]))</span>
<span id="cb1-42">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'fill'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> color)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-43">    svg</span>
<span id="cb1-44">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">append</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'path'</span>)</span>
<span id="cb1-45">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'d'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> d3<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">line</span>()(</span>
<span id="cb1-46">        [[width <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> height <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [width <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> v[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> height <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> v[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]]]</span>
<span id="cb1-47">      ))</span>
<span id="cb1-48">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'stroke'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> color)</span>
<span id="cb1-49">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'stroke-width'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'2px'</span>)</span>
<span id="cb1-50">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'marker-end'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'url(#'</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> id <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">')'</span>)</span>
<span id="cb1-51">      <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'fill'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'none'</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-52">  }</span>
<span id="cb1-53">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> radius <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">min</span>(width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> height) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-54">  vecU <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [vecU[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> radius<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> vecU[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> radius]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-55">  vecV <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [vecV[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> radius<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> vecV[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> radius]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-56">  svg</span>
<span id="cb1-57">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">append</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'circle'</span>)</span>
<span id="cb1-58">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'cx'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'50%'</span>)</span>
<span id="cb1-59">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'cy'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'50%'</span>)</span>
<span id="cb1-60">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">attr</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'r'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> radius)</span>
<span id="cb1-61">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">style</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'stroke'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'black'</span>)</span>
<span id="cb1-62">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">style</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'stroke-width'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'2px'</span>)</span>
<span id="cb1-63">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">style</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'fill'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'none'</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-64"></span>
<span id="cb1-65">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">appendArrow</span>(svg<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> vecU<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"arrow-0"</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-66">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">appendArrow</span>(svg<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> vecV<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"red"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"arrow-1"</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-67">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> svg<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">node</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-68">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-1" data-nodetype="declaration">

</div>
</div>
</div>
<p>This problem is equivalent to selecting two random vectors <strong>u</strong> and <strong>v</strong> on a circle of radius 1 and computing their <a href="https://maitbayev.github.io/posts/dot-product/">dot product</a>.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb2" data-startfrom="75" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 74;"><span id="cb2-75"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeCircle2D</span>([<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)])</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-2" data-nodetype="expression">

</div>
</div>
</div>
<p>As a reminder <a href="https://maitbayev.github.io/posts/dot-product/">the dot product</a> of <strong>u</strong> and <strong>v</strong> is:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%7Bu%7D%20%5Ccdot%20%5Cmathbf%7Bv%7D%20=%20u_x%20v_x%20+%20u_y%20v_y%20=%20%5Ccos%20(%5Calpha)%0A"></p>
<p>The dot product is zero when <strong>u</strong> and <strong>v</strong> are orthogonal, and near zero when they are nearly orthogonal.</p>
<p>The dot product is <a href="https://maitbayev.github.io/posts/dot-product/#rotational-invariance">invariant under rotations</a>, which means that we can rotate both vectors in the same way such that the vector <strong>u</strong> is [0, 1]:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb3" data-startfrom="91" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 90;"><span id="cb3-91"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeCircle2D</span>([<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)])</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-3" data-nodetype="expression">

</div>
</div>
</div>
<p>This simplifies the dot product to <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bu%7D%20%5Ccdot%20%5Cmathbf%7Bv%7D%20=%20%5Ccos%20(%5Calpha)%20=%20v_y">. The probability of being near orthogonal is pretty low in two dimensions, but this helps us in framing our problem for higher dimensions.</p>
<p>It turns out that the average value of <img src="https://latex.codecogs.com/png.latex?%5Ccos%5E2(%5Calpha)"> or <img src="https://latex.codecogs.com/png.latex?v_y%5E2"> is exactly <img src="https://latex.codecogs.com/png.latex?%5Cfrac%7B1%7D%7B2%7D">. There are numerous analytical proofs, but the simplest intuition is derived from <img src="https://latex.codecogs.com/png.latex?v_x%5E2+v_y%5E2=1">. We have a total budget of 1, which we distribute between <img src="https://latex.codecogs.com/png.latex?v_x%5E2"> and <img src="https://latex.codecogs.com/png.latex?v_y%5E2">; thus, on average, <img src="https://latex.codecogs.com/png.latex?v_y%5E2"> receives half of the budget.</p>
<p>We only have two orthogonal vectors to <strong>u</strong>, and they are:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb4" data-startfrom="102" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 101;"><span id="cb4-102"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">html</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">`</span></span>
<span id="cb4-103"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">&lt;div style="display: flex; justify-content: center;"&gt;</span></span>
<span id="cb4-104"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">  &lt;div style="width: 50%;"&gt;</span></span>
<span id="cb4-105"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">    </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">${</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeCircle2D</span>([<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>)<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span></span>
<span id="cb4-106"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">  &lt;/div&gt;</span></span>
<span id="cb4-107"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">  &lt;div style="width: 50%;"&gt;</span></span>
<span id="cb4-108"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">    </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">${</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeCircle2D</span>([<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>)<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span></span>
<span id="cb4-109"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">  &lt;/div&gt;</span></span>
<span id="cb4-110"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">&lt;/div&gt;</span></span>
<span id="cb4-111"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">`</span></span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-4" data-nodetype="expression">

</div>
</div>
</div>
</section>
<section id="three-dimensions" class="level2">
<h2 class="anchored" data-anchor-id="three-dimensions">Three Dimensions</h2>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb5" data-startfrom="119" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 118;"><span id="cb5-119">THREE <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {</span>
<span id="cb5-120">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> THREE <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">window</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">THREE</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">await</span> <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">require</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"three@0.145.0/build/three.min.js"</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb5-121">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">await</span> <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">require</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"three@0.145.0/examples/js/controls/OrbitControls.js"</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">catch</span>(() <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">=&gt;</span> {})<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb5-122">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb5-123">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-5" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb6" data-startfrom="128" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 127;"><span id="cb6-128"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeSphere</span>(wireframe <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> opacity <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>) {</span>
<span id="cb6-129">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> material <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">MeshBasicMaterial</span>({</span>
<span id="cb6-130">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">wireframe</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> wireframe<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb6-131">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">opacity</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> opacity<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb6-132">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="bn" style="color: #AD0000;
background-color: null;
font-style: inherit;">0x555555</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb6-133">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">transparent</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span>  </span>
<span id="cb6-134">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb6-135">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> geometry <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">SphereGeometry</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">32</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">32</span> )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span> </span>
<span id="cb6-136">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Mesh</span>(geometry<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> material)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb6-137">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-6" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb7" data-startfrom="142" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 141;"><span id="cb7-142"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeSphereSlice</span>(wireframe <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> opacity <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>) {</span>
<span id="cb7-143">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> material <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">MeshBasicMaterial</span>({</span>
<span id="cb7-144">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">wireframe</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> wireframe<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-145">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">opacity</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> opacity<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-146">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="bn" style="color: #AD0000;
background-color: null;
font-style: inherit;">0xff0000</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-147">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">transparent</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-148">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">side</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">DoubleSide</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-149">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">depthTest</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-150">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-151">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> geometry <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">SphereGeometry</span>(</span>
<span id="cb7-152">    <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.01</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">32</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">32</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-153">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">PI</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-154">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">PI</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">PI</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">32</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">PI</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">16</span></span>
<span id="cb7-155">  )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span> </span>
<span id="cb7-156">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Mesh</span>(geometry<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> material)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-157">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-7" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb8" data-startfrom="162" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 161;"><span id="cb8-162"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeCircle3D</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> radius<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>) {</span>
<span id="cb8-163">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> geometry <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">CircleGeometry</span>(radius<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">32</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span> </span>
<span id="cb8-164">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">// radius^2+z^2=1</span></span>
<span id="cb8-165">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">// z=sqrt(1-radius^2)</span></span>
<span id="cb8-166">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> material <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">MeshStandardMaterial</span>({ </span>
<span id="cb8-167">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb8-168">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">side</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">DoubleSide</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb8-169">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">opacity</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb8-170">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">transparent</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb8-171">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">depthTest</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb8-172">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span> </span>
<span id="cb8-173">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> circle <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Mesh</span>( geometry<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> material )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb8-174">  circle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">position</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">y</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> radius <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> radius)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb8-175">  circle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lookAt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb8-176">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> circle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb8-177">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-8" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb9" data-startfrom="182" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 181;"><span id="cb9-182"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeVector</span>(vec<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> color) {</span>
<span id="cb9-183">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">customArrow</span>( fx<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> fy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> fz<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> ix<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> iy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> iz<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> thickness<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> color) {</span>
<span id="cb9-184">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> ARROW_BODY <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">CylinderGeometry</span>( <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span> )</span>
<span id="cb9-185">                            <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rotateX</span>( <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">PI</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span>
<span id="cb9-186">                            <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">translate</span>( <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span> )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-187"></span>
<span id="cb9-188">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> ARROW_HEAD <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ConeGeometry</span>( <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span> )</span>
<span id="cb9-189">                            <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rotateX</span>( <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">PI</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span>
<span id="cb9-190">                            <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">translate</span>( <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span> )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-191">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> material <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">MeshLambertMaterial</span>( {<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> color} )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-192">    </span>
<span id="cb9-193">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> length <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>( (ix<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>fx)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (iy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>fy)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (iz<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>fz)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-194">    </span>
<span id="cb9-195">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> body <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Mesh</span>( ARROW_BODY<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> material )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-196">    body<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">scale</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set</span>( thickness<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> thickness<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> length<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>thickness )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-197">      </span>
<span id="cb9-198">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> head <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Mesh</span>( ARROW_HEAD<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> material )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-199">    head<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">position</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set</span>( <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> length )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-200">    head<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">scale</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set</span>( <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>thickness<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>thickness<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>thickness )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-201">    </span>
<span id="cb9-202">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> arrow <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Group</span>( )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-203">    arrow<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">position</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set</span>( ix<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> iy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> iz )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-204">    arrow<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lookAt</span>( fx<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> fy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> fz )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span> </span>
<span id="cb9-205">    arrow<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add</span>( body<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> head )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-206">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> arrow<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-207">  }</span>
<span id="cb9-208">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">customArrow</span>(vec[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> vec[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> vec[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.02</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> color)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb9-209">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-9" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb10" data-startfrom="214" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 213;"><span id="cb10-214"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeScene</span>(vec) {</span>
<span id="cb10-215">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> scene <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Scene</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb10-216">  scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">background</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Color</span>(<span class="bn" style="color: #AD0000;
background-color: null;
font-style: inherit;">0xffffff</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb10-217">  scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">AxesHelper</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.5</span>))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb10-218">  scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeSphere</span>(<span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*wireframe: */</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*opacity: */</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb10-219">  scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeSphere</span>(<span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*wireframe: */</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*opacity: */</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb10-220">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> light <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">AmbientLight</span>(<span class="bn" style="color: #AD0000;
background-color: null;
font-style: inherit;">0xFFFFFF</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*intensity=*/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb10-221">  scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add</span>(light)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb10-222">  scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeVector</span>([<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="bn" style="color: #AD0000;
background-color: null;
font-style: inherit;">0x000000</span>))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb10-223">  scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeVector</span>(vec<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="bn" style="color: #AD0000;
background-color: null;
font-style: inherit;">0xff0000</span>))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb10-224">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb10-225">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-10" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb11" data-startfrom="231" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 230;"><span id="cb11-231"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeRendererElement</span>(height<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> scene) {</span>
<span id="cb11-232">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeCamera</span>() {</span>
<span id="cb11-233">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> fov <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">45</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-234">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> aspect <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> width <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> height<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-235">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> near <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-236">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> far <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1000</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-237">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> camera <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">PerspectiveCamera</span>(fov<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> aspect<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> near<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> far)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-238">    camera<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">position</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">z</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-239">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> camera<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-240">  }</span>
<span id="cb11-241">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> camera <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeCamera</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-242">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> renderer <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">WebGLRenderer</span>({<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">antialias</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span>})<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-243">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> controls <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">new</span> THREE<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">OrbitControls</span>(camera<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> renderer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">domElement</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-244">  controls<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">autoRotate</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-245">  controls<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">enableZoom</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-246">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">animate</span>() {</span>
<span id="cb11-247">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">requestAnimationFrame</span>( animate )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-248">    controls<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">update</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-249">    renderer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">render</span>( scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> camera )<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-250">  }</span>
<span id="cb11-251">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">animate</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-252">  invalidation<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">then</span>(() <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">=&gt;</span> (controls<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">dispose</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> renderer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">dispose</span>()))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-253">  renderer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">setSize</span>(width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> height)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-254">  renderer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">setPixelRatio</span>(devicePixelRatio)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-255">  renderer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">render</span>(scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> camera)</span>
<span id="cb11-256">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">// controls.addEventListener("change", () =&gt; renderer.render(scene, camera));</span></span>
<span id="cb11-257">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> renderer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">domElement</span></span>
<span id="cb11-258">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-11" data-nodetype="declaration">

</div>
</div>
</div>
<p>In three dimensions, we take two random vectors <strong>u</strong> and <strong>v</strong> on a unit sphere and rotate them together so that the vector <strong>u</strong> becomes the north pole ([0, 0, 1]):</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb12" data-startfrom="266" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 265;"><span id="cb12-266">{ </span>
<span id="cb12-267">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> scene <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeScene</span>([<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)])<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb12-268">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeRendererElement</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">300</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> scene)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb12-269">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-12" data-nodetype="expression">

</div>
</div>
</div>
<p><strong>Tip</strong>: The spheres in this post are <strong>interactive</strong>.</p>
<p>The dot product of <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bu%7D=%5B0,%200,%201%5D"> and <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bv%7D=%5Bv_x,%20v_y,%20v_z%5D"> is:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%7Bu%7D%20%5Ccdot%20%5Cmathbf%7Bv%7D%20=%20%5Ccos%20(%5Calpha)%20=%20v_z%0A"></p>
<p>In 2D, we only had two vectors that are orthogonal to <strong>u</strong>. In 3D, we have an entire subspace of vectors that are orthogonal to <strong>u</strong>:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb13" data-startfrom="284" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 283;"><span id="cb13-284">{ </span>
<span id="cb13-285">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> scene <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeScene</span>([<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)])<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb13-286">  scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeCircle3D</span>(<span class="bn" style="color: #AD0000;
background-color: null;
font-style: inherit;">0xff0000</span>))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb13-287">  scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rotateX</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">PI</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb13-288">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeRendererElement</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">300</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> scene)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb13-289">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-13" data-nodetype="expression">

</div>
</div>
</div>
<p>In other words, any vector in the red circle above is orthogonal to <strong>u</strong>. Moreover, this circle is the largest one that can be found on the sphere. For example, compare with a smaller circle which spans non-orthogonal vectors:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb14" data-startfrom="296" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 295;"><span id="cb14-296">{ </span>
<span id="cb14-297">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> vec <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb14-298">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> scene <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeScene</span>(vec)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb14-299">  scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeCircle3D</span>(<span class="bn" style="color: #AD0000;
background-color: null;
font-style: inherit;">0xff0000</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span>))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb14-300">  scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rotateX</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">PI</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb14-301">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeRendererElement</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">300</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> scene)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb14-302">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-14" data-nodetype="expression">

</div>
</div>
</div>
<p>The larger the circle from which we select the vector <strong>v</strong> is, the closer it is to being orthogonal:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb15" data-startfrom="309" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 308;"><span id="cb15-309">{ </span>
<span id="cb15-310">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> vec <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb15-311">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> scene <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeScene</span>(vec)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb15-312">  scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeSphereSlice</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.3</span>))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb15-313">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">// scene.add(makeCircle3D(0xff0000, 1));</span></span>
<span id="cb15-314">  scene<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rotateX</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">PI</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb15-315">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">makeRendererElement</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">300</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> scene)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb15-316">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-15" data-nodetype="expression">

</div>
</div>
</div>
<p>For example, we can consider all vectors within the thin red stripe to be nearly orthogonal.</p>
<p>The average value of <img src="https://latex.codecogs.com/png.latex?%5Ccos%5E2%20(%5Calpha)"> or <img src="https://latex.codecogs.com/png.latex?v_z%5E2"> is <img src="https://latex.codecogs.com/png.latex?%5Cdfrac%7B1%7D%7B3%7D">. Similar to the 2D case, this comes from the fact that <img src="https://latex.codecogs.com/png.latex?v_x%5E2+v_y%5E2+v_z%5E2=1">. With a total budget of 1 split among <img src="https://latex.codecogs.com/png.latex?v_x%5E2">, <img src="https://latex.codecogs.com/png.latex?v_y%5E2"> and <img src="https://latex.codecogs.com/png.latex?v_z%5E2">, each gets, on average, one-third of it.</p>
</section>
<section id="n-dimensions" class="level2">
<h2 class="anchored" data-anchor-id="n-dimensions">N-dimensions</h2>
<p>Visualizing an N-dimensional sphere is challenging. However, we have all the tools needed to develop an intuition.</p>
<p>Similar to the 2D and 3D cases, we can fix the first vector as <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bu%7D=%5B0,%200,%20%5Cdots,%201%5D">. The second vector <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bv%7D=%5Bv_1,%20v_2,%20%5Ccdots,%20v_n%5D"> is randomly chosen from an N-dimensional unit sphere. Their dot product is then given by:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%7Bu%7D%20%5Ccdot%20%5Cmathbf%7Bv%7D%20=%20%5Ccos%20(%5Calpha)%20=%20v_n%0A"></p>
<p>The average value of <img src="https://latex.codecogs.com/png.latex?%5Ccos%5E2%20(%5Calpha)"> or <img src="https://latex.codecogs.com/png.latex?v_n%5E2"> is <img src="https://latex.codecogs.com/png.latex?%5Cdfrac%7B1%7D%7Bn%7D">. Since <img src="https://latex.codecogs.com/png.latex?v_1%5E2+v_2%5E2%20+%20%5Ccdot%20+%20v_n%5E2=1"> and the total value of 1 is divided equally among n components, giving <img src="https://latex.codecogs.com/png.latex?v_n%5E2"> a share of <img src="https://latex.codecogs.com/png.latex?%5Cfrac%7B1%7D%7Bn%7D">. As n becomes large enough, the average value of <img src="https://latex.codecogs.com/png.latex?cos%5E2(%5Calpha)"> approaches zero.</p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-1-contents" aria-controls="callout-1" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>More Formal Proof
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-1" class="callout-1-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>In my opinion the above explanation is enough to understand the intuition. However, let’s also present a formal proof for the expected value of <img src="https://latex.codecogs.com/png.latex?v_n%5E2">.</p>
<p>We’re looking for <img src="https://latex.codecogs.com/png.latex?%5Cmathbb%7BE%7D%5Cleft%5Bv_n%5E2%5Cright%5D">. And we also have:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5Cmathbb%7BE%7D%5B%5Csum_%7Bi=1%7D%5En%20v_i%5E2%5D%20&amp;=%5Csum_%7Bi=1%7D%5En%20%5Cmathbb%7BE%7D%5Bv_i%5E2%5D%20%5C%5C%0A&amp;=%20n%5Cmathbb%7BE%7D%5Bv_n%5E2%5D%20%5C%5C%0A&amp;=%201%0A%5Cend%7Balign%7D%0A"></p>
<p>Hence, <img src="https://latex.codecogs.com/png.latex?%5Cmathbb%7BE%7D%5Bv_n%5E2%5D=%5Cfrac%7B1%7D%7Bn%7D">. Here we used the property that all components of <strong>v</strong> have identical expected values and <a href="https://en.wikipedia.org/wiki/Expected_value#Properties">the linearity of expectation</a>.</p>
</div>
</div>
</div>
</section>
<section id="the-end" class="level2">
<h2 class="anchored" data-anchor-id="the-end">The End</h2>
<p>I hope you enjoyed this post.</p>
<p><a href="https://maitbayev.substack.com/subscribe">Subscribe</a> to get a notification about future posts.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb16" data-startfrom="363" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 362;"><span id="cb16-363"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">html</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">`</span></span>
<span id="cb16-364"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">    &lt;canvas id="canvas" style="width:100%; height: 360px;"&gt;</span></span>
<span id="cb16-365"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">    &lt;/canvas&gt;</span></span>
<span id="cb16-366"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">`</span></span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-16" data-nodetype="expression">

</div>
</div>
</div>
<div class="cell hidden">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb17" data-startfrom="372" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 371;"><span id="cb17-372">pkg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {</span>
<span id="cb17-373">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> file <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">await</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">FileAttachment</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"./pkg/demo.js"</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">url</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-374">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> module <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">await</span> <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span>(file)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-375">  module<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">default</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">await</span> module<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">default</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-376">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">// module.set_panic_hook();</span></span>
<span id="cb17-377">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> module<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-378">}</span></code></pre></div></div>
<div class="cell-output cell-output-display hidden">
<div id="ojs-cell-17" data-nodetype="declaration">

</div>
</div>
</div>


</section>
</section>

 ]]></description>
  <category>math</category>
  <category>random</category>
  <category>vector</category>
  <guid>https://maitbayev.github.io/posts/random-two-vectors/</guid>
  <pubDate>Sun, 11 May 2025 23:00:00 GMT</pubDate>
  <media:content url="https://maitbayev.github.io/posts/random-two-vectors/images/image.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Implementation of ROC AUC Score</title>
  <dc:creator>Madiyar Aitbayev</dc:creator>
  <link>https://maitbayev.github.io/posts/roc-auc-implementation/</link>
  <description><![CDATA[ 





<section id="implementation-of-roc-auc-score" class="level1">
<h1>Implementation of ROC AUC Score</h1>
<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>This post is a continuation of the <a href="https://maitbayev.github.io/posts/roc-auc">ROC and AUC Interpretation</a>. Please make sure that you understand that post before reading this one.</p>
<p>In this post, we will implement a ROC AUC Score in Python with <img src="https://latex.codecogs.com/png.latex?O(n%5Clog%20n)"> runtime complexity.</p>
<p><a href="https://maitbayev.substack.com/subscribe">Subscribe</a> to get a notification about future posts.</p>
</section>
<section id="explanation" class="level2">
<h2 class="anchored" data-anchor-id="explanation">Explanation</h2>
<p>Similar to the <a href="https://maitbayev.github.io/posts/roc-auc">previous post</a> we have:</p>
<ul>
<li>A dataset with positive and negative items</li>
<li>An ML model that predicts a probability score from 0 to 1, representing the probability that the input belongs to the positive class</li>
</ul>
<p>We want to compute the ROC AUC score of our model predictions. The algorithm that we are going to implement is explained more easily with a visualization (press the play button):</p>
<div id="51790732-e7a0-4432-a5dd-b6e501ed9174" class="cell" data-execution_count="2">
<div class="cell-output cell-output-display" data-execution_count="2">

<video controls="" style="width: 94%; max-width: 600px; display: block; margin: auto; padding: 10px;">
<source src="images/algo.mp4" type="video/mp4">
</video>
</div>
</div>
<p>This is a slightly modified visualization from <a href="https://maitbayev.github.io/posts/roc-auc">the other post</a>. A few notes from the animation video:</p>
<ul>
<li>The ROC score is the sum of the areas of trapezoids formed by two adjacent points on the ROC curve</li>
<li>Some trapezoids have zero area</li>
<li>We process the dataset items in order of their probability scores, from the highest to the lowest</li>
</ul>
</section>
<section id="implementation" class="level2">
<h2 class="anchored" data-anchor-id="implementation">Implementation</h2>
<p>Let’s setup our environment:</p>
<div id="efb4296c-f16a-4bbb-a08e-9a30cb0bf997" class="cell" data-execution_count="3">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> numpy <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> np</span>
<span id="cb1-2"></span>
<span id="cb1-3">np.random.seed(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb1-4">n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span></span>
<span id="cb1-5">target <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.random.randint(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, n)</span>
<span id="cb1-6">predicted <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.random.rand(n)</span></code></pre></div></div>
</div>
<p>We randomly generated targets and predicted probability scores. Let’s check the result of <code>sklearn.metrics.roc_auc_score</code>:</p>
<div id="03e87115-b626-451c-a9b3-ab7e57330b61" class="cell" data-execution_count="4">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> sklearn</span>
<span id="cb2-2">sklearn.metrics.roc_auc_score(target, predicted)</span></code></pre></div></div>
<div class="cell-output cell-output-display" data-execution_count="4">
<pre><code>np.float64(0.4277597402597403)</code></pre>
</div>
</div>
<p>Our implementation should have the same score.</p>
<section id="trapezoid-area" class="level3">
<h3 class="anchored" data-anchor-id="trapezoid-area">Trapezoid Area</h3>
<p>First, let’s implement a helper function that finds the area of the trapezoid defined by two points <img src="https://latex.codecogs.com/png.latex?(x_0,%20y_0)"> and <img src="https://latex.codecogs.com/png.latex?(x_1,%20y_1)">.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://maitbayev.github.io/posts/roc-auc-implementation/images/trapezoid.jpg" class="img-fluid figure-img" width="300"></p>
<figcaption>Area of trapezoid</figcaption>
</figure>
</div>
<p>To achieve this, we can add the area of the rectangle and the area of the right triangle, which is:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5Ctext%7BArea%7D&amp;=(x_1-x_0)%20%5Ctimes%20y0+%5Cfrac%7B1%7D%7B2%7D(x_1-x_0)%20%5Ctimes%20(y_1-y_0)%5C%5C%0A&amp;=%20%5Cfrac%7B1%7D%7B2%7D(x_1-x_0)%20%5Ctimes%20(2y_0+y_1%20-%20y_0)%5C%5C%0A&amp;=%20%5Cfrac%7B1%7D%7B2%7D(x_1-x_0)%20%5Ctimes%20(y_0%20+%20y_1)%5C%5C%0A%5Cend%7Balign%7D%0A"></p>
<p>Let’s implement the formula in Python:</p>
<div id="b05fd4da-7772-4c00-bc16-e4daa55e44b8" class="cell" data-execution_count="5">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> trapezoid_area(p0, p1):</span>
<span id="cb4-2">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> (p1[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> p0[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (p0[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> p1[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.0</span></span></code></pre></div></div>
</div>
</section>
<section id="roc-auc-score" class="level3">
<h3 class="anchored" data-anchor-id="roc-auc-score">ROC AUC Score</h3>
<p>Now our main implementation:</p>
<div id="86bf73f9-97bb-4468-a13c-8a4caaf28e4a" class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="annotated-cell-4" style="background: #f1f3f5;"><pre class="sourceCode python code-annotation-code code-with-copy code-annotated"><code class="sourceCode python"><span id="annotated-cell-4-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> roc_auc_score(target, predicted):</span>
<span id="annotated-cell-4-2">    n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> target.shape[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="annotated-cell-4-3">    num_positive <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>(target <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="annotated-cell-4-4">    num_negative <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> num_positive </span>
<span id="annotated-cell-4-5">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># argsort in reverse order</span></span>
<a class="code-annotation-anchor" data-target-cell="annotated-cell-4" data-target-annotation="1" onclick="event.preventDefault();">1</a><span id="annotated-cell-4-6" class="code-annotation-target">    order <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.argsort(predicted)[::<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]</span>
<span id="annotated-cell-4-7">    last <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="annotated-cell-4-8">    num_true_positive <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span></span>
<span id="annotated-cell-4-9">    num_false_positive <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span></span>
<span id="annotated-cell-4-10">    score <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span></span>
<a class="code-annotation-anchor" data-target-cell="annotated-cell-4" data-target-annotation="2" onclick="event.preventDefault();">2</a><span id="annotated-cell-4-11" class="code-annotation-target">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> index <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(n):</span>
<span id="annotated-cell-4-12">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Make sure that the new threshold is unique</span></span>
<span id="annotated-cell-4-13">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> index <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">or</span> predicted[order[index]] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!=</span> predicted[order[index <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]]:</span>
<span id="annotated-cell-4-14">            <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># True positive rate</span></span>
<span id="annotated-cell-4-15">            tpr <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> num_true_positive <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> num_positive</span>
<span id="annotated-cell-4-16">            <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># False positive rate</span></span>
<span id="annotated-cell-4-17">            fpr <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> num_false_positive <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> num_negative</span>
<span id="annotated-cell-4-18">            <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># New point on the ROC curve</span></span>
<a class="code-annotation-anchor" data-target-cell="annotated-cell-4" data-target-annotation="3" onclick="event.preventDefault();">3</a><span id="annotated-cell-4-19" class="code-annotation-target">            cur <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [fpr, tpr]</span>
<span id="annotated-cell-4-20">            </span>
<a class="code-annotation-anchor" data-target-cell="annotated-cell-4" data-target-annotation="4" onclick="event.preventDefault();">4</a><span id="annotated-cell-4-21" class="code-annotation-target">            score <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+=</span> trapezoid_area(last, cur)</span>
<span id="annotated-cell-4-22">            last <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cur</span>
<span id="annotated-cell-4-23">        </span>
<span id="annotated-cell-4-24">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> target[order[index]] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>:</span>
<a class="code-annotation-anchor" data-target-cell="annotated-cell-4" data-target-annotation="5" onclick="event.preventDefault();">5</a><span id="annotated-cell-4-25" class="code-annotation-target">            num_true_positive <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="annotated-cell-4-26">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<a class="code-annotation-anchor" data-target-cell="annotated-cell-4" data-target-annotation="6" onclick="event.preventDefault();">6</a><span id="annotated-cell-4-27" class="code-annotation-target">            num_false_positive <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="annotated-cell-4-28">    score <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+=</span> trapezoid_area(last, [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>])</span>
<span id="annotated-cell-4-29"></span>
<span id="annotated-cell-4-30">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> score </span><div class="code-annotation-gutter-bg"></div><div class="code-annotation-gutter"></div></code></pre></div></div>
<div class="cell-annotation">
<dl class="code-annotation-container-grid">
<dt data-target-cell="annotated-cell-4" data-target-annotation="1">1</dt>
<dd>
<span data-code-cell="annotated-cell-4" data-code-lines="6" data-code-annotation="1">Sort items by their predicted scores, from largest to smallest</span>
</dd>
<dt data-target-cell="annotated-cell-4" data-target-annotation="2">2</dt>
<dd>
<span data-code-cell="annotated-cell-4" data-code-lines="11" data-code-annotation="2">Process the sorted items one by one in a loop:</span>
</dd>
<dt data-target-cell="annotated-cell-4" data-target-annotation="3">3</dt>
<dd>
<span data-code-cell="annotated-cell-4" data-code-lines="19" data-code-annotation="3">Form the current point on the ROC curve by: <img src="https://latex.codecogs.com/png.latex?(%5Cfrac%7B%5Ctext%7Bnum%5C_false%5C_positive%7D%7D%7B%5Ctext%7Bnum%5C_negative%7D%7D,%20%5Cfrac%7B%5Ctext%7Bnum%5C_true%5C_positive%7D%7D%7B%5Ctext%7Bnum%5C_positive%7D%7D)"></span>
</dd>
<dt data-target-cell="annotated-cell-4" data-target-annotation="4">4</dt>
<dd>
<span data-code-cell="annotated-cell-4" data-code-lines="21" data-code-annotation="4">Add the trapezoid area formed by the previous point and the current one</span>
</dd>
<dt data-target-cell="annotated-cell-4" data-target-annotation="5">5</dt>
<dd>
<span data-code-cell="annotated-cell-4" data-code-lines="25" data-code-annotation="5">If the current item is positive, then increase <code>num_true_positive</code> by one</span>
</dd>
<dt data-target-cell="annotated-cell-4" data-target-annotation="6">6</dt>
<dd>
<span data-code-cell="annotated-cell-4" data-code-lines="27" data-code-annotation="6">If the current item is negative, then increase <code>num_false_positive</code> by one</span>
</dd>
</dl>
</div>
</div>
<p>Let’s verify the result:</p>
<div id="361f6637-19a5-467b-96bb-6b4ae06f04ce" class="cell" data-execution_count="7">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1">roc_auc_score(target, predicted)</span></code></pre></div></div>
<div class="cell-output cell-output-display" data-execution_count="7">
<pre><code>np.float64(0.4277597402597403)</code></pre>
</div>
</div>
<p>Nice, we got exactly the same result as <code>sklearn</code>.</p>
</section>
</section>
<section id="the-end" class="level2">
<h2 class="anchored" data-anchor-id="the-end">The End</h2>
<p>I hope you enjoyed this post.</p>
<p><a href="https://maitbayev.substack.com/subscribe">Subscribe</a> to get a notification about future posts.</p>


</section>
</section>

 ]]></description>
  <category>loss</category>
  <category>code</category>
  <guid>https://maitbayev.github.io/posts/roc-auc-implementation/</guid>
  <pubDate>Mon, 03 Feb 2025 00:00:00 GMT</pubDate>
  <media:content url="https://maitbayev.github.io/posts/roc-auc-implementation/images/image.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>ROC and AUC Interpretation</title>
  <dc:creator>Madiyar Aitbayev</dc:creator>
  <link>https://maitbayev.github.io/posts/roc-auc/</link>
  <description><![CDATA[ 





<section id="roc-and-auc-interpretation" class="level1">
<h1>ROC and AUC Interpretation</h1>
<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>A <strong>binary classification</strong> is a machine learning model that classifies input data into two classes. We need different metrics to train or evaluate the performance of ML models. The <a href="https://en.wikipedia.org/wiki/Receiver_operating_characteristic">Area Under the Receiver Operating Characteristic Curve</a> (<strong>ROC AUC</strong>) score is a popular metric for evaluating binary classification models. In this post, we will try to understand the intuition behind the <strong>ROC AUC</strong> with simple and interactive visualizations.</p>
<p><a href="https://maitbayev.substack.com/subscribe">Subscribe</a> to get a notification about future posts.</p>
</section>
<section id="recap" class="level2">
<h2 class="anchored" data-anchor-id="recap">Recap</h2>
<p>Feel free to skip this section if you are already familiar with the confusion matrix, true positive rate and false positive rate. Next Section</p>
<p>I suggest you also checkout the following resources:</p>
<ol type="1">
<li><a href="https://www.evidentlyai.com/classification-metrics/explain-roc-curve">evidentlyai.com/classification-metrics/…</a> - quite detailed explaination</li>
<li><a href="https://developers.google.com/machine-learning/crash-course/classification/roc-and-auc">developers.google.com/machine-learning/…</a> - beginner friendly explanation</li>
<li><a href="https://madrury.github.io/jekyll/update/statistics/2017/06/21/auc-proof.html">madrury.github.io/jekyll/update/statistics/…</a> - my favourite so far that gives a probabilistic intution of ROC AUC score</li>
<li><a href="https://www.alexejgossmann.com/auc/">www.alexejgossmann.com/auc/</a> - more advanced explanation</li>
</ol>
<p>Let’s say we have two classes (“positive” and “negative”) and a machine learning model that predicts a probability score between 0 and 1. A probability of <strong>0.9</strong> signifes that the input is closer to <strong>“positive”</strong> than “negative”, a probability of <strong>0.2</strong> signifies that the input is closer to <strong>“negative”</strong>, and so on.</p>
<p>However, our task is to produce a binary output: “positive” or “negative”. To achieve this, we choose a <strong>threshold</strong>. Any input with a predicted probability score above the threshold is classified as positive, while inputs with lower scores are classified as negative.</p>
<section id="confusion-matrix" class="level3">
<h3 class="anchored" data-anchor-id="confusion-matrix">Confusion Matrix</h3>
<p>There are four outcomes of the predicted binary output, which can be nicely summarized with the following table, called a confusion matrix:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://maitbayev.github.io/posts/roc-auc/images/confusion_matrix.jpg" class="img-fluid figure-img"></p>
<figcaption>confusion matrix</figcaption>
</figure>
</div>
<p>The green row corresponds to the positive items in our dataset, while the red row corresponds to the negative items in the dataset. The columns correspond to the model predictions. The cells outlined with dark green are the items our model classified correctly, i.e., the accurate predictions of our model.</p>
<p>Now, we can give a few relevant metrics based on the confusion matrix.</p>
</section>
<section id="accuracy" class="level3">
<h3 class="anchored" data-anchor-id="accuracy">Accuracy</h3>
<p>Accuracy is the proportion of all accurate predictions <strong>among all items</strong> in the dataset. It is defined as:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctext%7BAccuracy%7D%20=%20%5Cfrac%7BTP+TN%7D%7BTP+TN+FP+FN%7D%0A"></p>
<p>Accuracy can be misleading, especially with imbalanced datasets. For example, if 99% of our dataset is positive, a model that always predicts positive will have an accuracy of 99%, but this doesn’t provide meaningful insight. Hence, we need other metrics.</p>
</section>
<section id="true-positive-rate" class="level3">
<h3 class="anchored" data-anchor-id="true-positive-rate">True Positive Rate</h3>
<p>The true positive rate or <strong>recall</strong> is the proportion of accurate predictions <strong>among positive items</strong>:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctext%7BRecall%20or%20TPR%7D%20=%20%5Cfrac%7BTP%7D%7BTP+FN%7D%0A"></p>
<p>The recall only considers the green row (actual positives) from our confusion table, and completely ignores the red row.</p>
</section>
<section id="true-negative-rate" class="level3">
<h3 class="anchored" data-anchor-id="true-negative-rate">True Negative Rate</h3>
<p>The true negative rate or <strong>specificity</strong> is the proportion of accurate predictions <strong>among negative items</strong>:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctext%7BSpecificity%20or%20TNR%7D%20=%20%5Cfrac%7BTN%7D%7BFP+TN%7D%0A"></p>
<p>The specificity only considers the red row (actual negatives) from our confusion table.</p>
</section>
<section id="false-positive-rate" class="level3">
<h3 class="anchored" data-anchor-id="false-positive-rate">False Positive Rate</h3>
<p>The false positive rate is the proportion of <strong>inaccurate</strong> predictions <strong>among negative items</strong>:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctext%7BFPR%7D%20=%20%5Cfrac%7BFP%7D%7BFP+TN%7D%0A"></p>
<p>alternatively:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctext%7BFPR%7D=1-%5Ctext%7BTNR%7D%0A"></p>
<p>The false positive rate is related to the true negative rate. However, we will be using FPR more than TNR in the next sections.</p>
</section>
</section>
<section id="visualization" class="level2">
<h2 class="anchored" data-anchor-id="visualization">Visualization</h2>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb1" data-startfrom="99" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 98;"><span id="cb1-99">stats <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {</span>
<span id="cb1-100">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">truePositive</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold) {</span>
<span id="cb1-101">        <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> truePositive <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-102">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> positives) {</span>
<span id="cb1-103">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (positives[i] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> threshold) {</span>
<span id="cb1-104">                truePositive <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-105">            }</span>
<span id="cb1-106">        }</span>
<span id="cb1-107">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> truePositive<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-108">    }</span>
<span id="cb1-109"></span>
<span id="cb1-110">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">trueNegative</span>(negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold) {</span>
<span id="cb1-111">        <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> trueNegative <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-112">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> negatives) {</span>
<span id="cb1-113">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (negatives[i] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;=</span> threshold) {</span>
<span id="cb1-114">                trueNegative <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-115">            }</span>
<span id="cb1-116">        }</span>
<span id="cb1-117">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> trueNegative<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-118">    }</span>
<span id="cb1-119"></span>
<span id="cb1-120">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">falsePositive</span>(negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold) {</span>
<span id="cb1-121">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">length</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">trueNegative</span>(negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-122">    }</span>
<span id="cb1-123"></span>
<span id="cb1-124">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">falseNegative</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold) {</span>
<span id="cb1-125">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">length</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">truePositive</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-126">    }</span>
<span id="cb1-127"></span>
<span id="cb1-128">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">recall</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold) {</span>
<span id="cb1-129">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">truePositive</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">length</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-130">    }</span>
<span id="cb1-131"></span>
<span id="cb1-132">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">specifity</span>(negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold) {</span>
<span id="cb1-133">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">trueNegative</span>(negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">length</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-134">    }</span>
<span id="cb1-135"></span>
<span id="cb1-136">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fallout</span>(negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold) {</span>
<span id="cb1-137">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">specifity</span>(negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-138">    }</span>
<span id="cb1-139"></span>
<span id="cb1-140">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> {</span>
<span id="cb1-141">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">truePositive</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> truePositive<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb1-142">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">trueNegative</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> trueNegative<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb1-143">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">falsePositive</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> falsePositive<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb1-144">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">falseNegative</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> falseNegative<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb1-145">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">recall</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> recall<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb1-146">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">specifity</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> specifity<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb1-147">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fallout</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> fallout</span>
<span id="cb1-148">    }</span>
<span id="cb1-149">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-1" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb2" data-startfrom="155" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 154;"><span id="cb2-155"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">confusionMatrix</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold) {</span>
<span id="cb2-156">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">this</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">positives</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb2-157">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">this</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">negatives</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb2-158">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">this</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">threshold</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> threshold<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb2-159">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">this</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">truePositive</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> stats<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">truePositive</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb2-160">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">this</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">trueNegative</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> stats<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">trueNegative</span>(negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb2-161">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">this</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">falsePositive</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> stats<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">falsePositive</span>(negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb2-162">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">this</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">falseNegative</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> stats<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">falseNegative</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb2-163">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">this</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">recall</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> stats<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">recall</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb2-164">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">this</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">fallout</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> stats<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fallout</span>(negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb2-165">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">this</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb2-166">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-2" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb3" data-startfrom="171" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 170;"><span id="cb3-171">positives <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.6</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.9</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-3" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb4" data-startfrom="176" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 175;"><span id="cb4-176">negatives <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-4" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb5" data-startfrom="181" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 180;"><span id="cb5-181">lightRed <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#ff8886"</span></span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-5" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb6" data-startfrom="187" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 186;"><span id="cb6-187"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">customTable</span>(data) {</span>
<span id="cb6-188">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> table <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> Inputs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">table</span>(data)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb6-189">    table<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">style</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">setProperty</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"font-size"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"1.3em"</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb6-190">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> table </span>
<span id="cb6-191">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-6" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb7" data-startfrom="196" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 195;"><span id="cb7-196"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot1D</span>(simple<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> fpr<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> reverse<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span>) {</span>
<span id="cb7-197">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> positiveDots <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb7-198">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> positives) {</span>
<span id="cb7-199">        positiveDots<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">push</span>({</span>
<span id="cb7-200">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> positives[i]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-201">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-202">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">r</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> positives[i]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-203">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span>simple <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;&amp;</span> positives[i] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> threshold<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">?</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-204">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">stroke</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"green"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-205">        })</span>
<span id="cb7-206">    }</span>
<span id="cb7-207">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> negativeDots <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-208">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> negatives) {</span>
<span id="cb7-209">        <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> strokeWidth <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-210">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (simple) {</span>
<span id="cb7-211">            strokeWidth <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-212">        } <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (fpr <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;&amp;</span> negatives[i] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> threshold) {</span>
<span id="cb7-213">            strokeWidth <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-214">        } <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span>fpr <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;&amp;</span> negatives[i] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;=</span> threshold) {</span>
<span id="cb7-215">            strokeWidth <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-216">        }</span>
<span id="cb7-217">        negativeDots<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">push</span>({</span>
<span id="cb7-218">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> negatives[i]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-219">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-220">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">r</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> negatives[i]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-221">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> strokeWidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-222">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">stroke</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> fpr <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">?</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#8b0000"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"green"</span></span>
<span id="cb7-223">            <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//stroke: "red"</span></span>
<span id="cb7-224">        })</span>
<span id="cb7-225">    }</span>
<span id="cb7-226">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> Plot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot</span>({</span>
<span id="cb7-227">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">r</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">range</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>]}<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-228">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">height</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-229">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">width</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">600</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-230">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> { <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">label</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"probability"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">reverse</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> reverse }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-231">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> { <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">axis</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">null</span> }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-232">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">marginRight</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">25</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-233">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">marginTop</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">25</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-234">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">marginBottom</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">25</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-235">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">marginLeft</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">25</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-236">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">marks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> [</span>
<span id="cb7-237">            Plot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">dot</span>(positiveDots<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb7-238">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">r</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"r"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-239">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">stroke</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"stroke"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"strokeWidth"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-240">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fill</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"lightgreen"</span></span>
<span id="cb7-241">            })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-242">            Plot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">dot</span>(negativeDots<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb7-243">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">r</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"r"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-244">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">stroke</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"stroke"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"strokeWidth"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-245">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fill</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> lightRed</span>
<span id="cb7-246">            })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-247">            Plot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">line</span>([</span>
<span id="cb7-248">                [<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">min</span>(threshold<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-249">                [<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">min</span>(threshold<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]</span>
<span id="cb7-250">            ]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> { </span>
<span id="cb7-251">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-252">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeDasharray</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2, 6"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-253">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">opacity</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> simple <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">?</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-254">            })</span>
<span id="cb7-255">        ]</span>
<span id="cb7-256">    })</span>
<span id="cb7-257">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-7" data-nodetype="declaration">

</div>
</div>
</div>
<p>Let’s setup a visualization for better understanding. Assume that we have:</p>
<ul>
<li>A dataset with positive and negative items</li>
<li>An ML model that predicts a probability score from 0 to 1, representing the probability that the input belongs to the positive class.</li>
</ul>
<p>Then, we can visualize our dataset and their probability predictions in the same visualization as below:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb8" data-startfrom="270" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 269;"><span id="cb8-270"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot1D</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> thresholdSlider)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-8" data-nodetype="expression">

</div>
</div>
</div>
<p>Positive items in the dataset are shown in green, and negative items are shown in red. The sizes of circles represent the predicted probability scores, with smaller circles representing scores close to 0 and larger circles representing scores close to 1. The items are ordered according to their probability scores, from smallest to largest.</p>
<p>Next, we choose a threshold depending on the application of our ML model. But, for now, let’s visualize the threshold as well:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb9" data-startfrom="279" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 278;"><span id="cb9-279"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot1D</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> thresholdSlider)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-9" data-nodetype="expression">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb10" data-startfrom="284" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 283;"><span id="cb10-284">viewof thresholdSlider <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">html</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">`</span></span>
<span id="cb10-285"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">&lt;input type=range min=0 max=1.1 step=0.01 value=0.5 style="width:90%"/&gt;</span></span>
<span id="cb10-286"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">`</span></span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-10" data-nodetype="declaration">

</div>
</div>
</div>
<p>The circles with dark green outline represent items that are accurately classified, in other words, true positives and true negatives.</p>
<p>Why not calculate the true positive (TP), false positive (FP), false negative (FP) and true negative (TN) values from the confusion matrix:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb11" data-startfrom="297" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 296;"><span id="cb11-297">{</span>
<span id="cb11-298">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> confusion <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">confusionMatrix</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> thresholdSlider)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-299">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> data <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [{</span>
<span id="cb11-300">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Threshold"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">min</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> thresholdSlider)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb11-301">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TP"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> confusion<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">truePositive</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb11-302">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FN"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> confusion<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">falseNegative</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb11-303">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FP"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> confusion<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">falsePositive</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb11-304">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TN"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> confusion<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">trueNegative</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb11-305">    }]</span>
<span id="cb11-306">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">customTable</span>(data)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb11-307">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-11" data-nodetype="expression">

</div>
</div>
</div>
<p><strong>Tip</strong>: You can adjust the threshold using the slider above (give it a try), and the tables above and below will update accordingly.</p>
<p>And the metrics as defined above:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb12" data-startfrom="316" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 315;"><span id="cb12-316">{</span>
<span id="cb12-317">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> confusion <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">confusionMatrix</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> thresholdSlider)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb12-318">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> correctItems <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> confusion<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">truePositive</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> confusion<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">trueNegative</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb12-319">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> allItems <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">length</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">length</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb12-320">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> data <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [{</span>
<span id="cb12-321">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Accuracy"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> correctItems <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"/"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> allItems<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb12-322">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TPR"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> confusion<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">truePositive</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"/"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">length</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb12-323">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FPR"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> confusion<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">falsePositive</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"/"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">length</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb12-324">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TNR"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> confusion<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">trueNegative</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"/"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">length</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb12-325">    }]</span>
<span id="cb12-326">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">customTable</span>(data)</span>
<span id="cb12-327">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-12" data-nodetype="expression">

</div>
</div>
</div>
<p>Play with the threshold slider and make sure that you understand different metrics, especially the true positive rate and the false positive rate. Maybe try to reproduce the metrics youself first at different thresholds and compare with the table?</p>
</section>
<section id="roc-and-auc" class="level2">
<h2 class="anchored" data-anchor-id="roc-and-auc">ROC and AUC</h2>
<section id="roc-curve" class="level3">
<h3 class="anchored" data-anchor-id="roc-curve">ROC Curve</h3>
<p>Choosing a specific threshold can be difficult since it depends on the particular application. Luckily we have metrics that show the performance of an ML model at varying threshold values. One of them is a <a href="https://en.wikipedia.org/wiki/Receiver_operating_characteristic">receiver operating characteristic curve</a> or ROC curve.</p>
<p>The term “Receiver Operating Characteristic” originates from Word War II, where it was used in radar systems for detecting enemy objects.</p>
<p>The ROC curve is the plot of the true positive rate (TPR) against the false positive rate (FPR) at each threshold values.</p>
<p>Let’s bring back a slightly modified version of our visualization:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb13" data-startfrom="349" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 348;"><span id="cb13-349"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot1D</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> thresholdSlider2<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*fpr=*/</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-13" data-nodetype="expression">

</div>
</div>
</div>
<p>Earlier, we have been visualizing the true negative rate. Now, we are visualizing the false positive rate, outlined with dark red.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb14" data-startfrom="357" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 356;"><span id="cb14-357">viewof thresholdSlider2 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">html</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">`</span></span>
<span id="cb14-358"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">&lt;input type=range min=0 max=1.1 step=0.01 value=0.5 style="width:90%"/&gt;</span></span>
<span id="cb14-359"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">`</span></span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-14" data-nodetype="declaration">

</div>
</div>
</div>
<p>The true positive and the false positive rates accordingly:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb15" data-startfrom="366" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 365;"><span id="cb15-366">{</span>
<span id="cb15-367">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> confusion <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">confusionMatrix</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> thresholdSlider2)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb15-368">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">customTable</span>([{</span>
<span id="cb15-369">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Threshold"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">min</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> thresholdSlider2)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb15-370">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TPR"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> confusion<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">truePositive</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"/"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">length</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb15-371">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FPR"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> confusion<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">falsePositive</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"/"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">length</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb15-372">       </span>
<span id="cb15-373">    }])</span>
<span id="cb15-374">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-15" data-nodetype="expression">

</div>
</div>
</div>
<p>Now, we need to plot FPR (x-axis) against TPR (y-axis).</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb16" data-startfrom="382" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 381;"><span id="cb16-382"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot_roc</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">null</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> thresholdSlider2)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-16" data-nodetype="expression">

</div>
</div>
</div>
<p><strong>Tip</strong>: You can adjust the slider above, then this visualization will update accordingly.</p>
<p>Play with the slider above and compare the values in the table and (x, y) values of the black point.</p>
<p>The new 2D visualization is similar to the previous 1D visualization, except the following differences:</p>
<ul>
<li>The positives items (green) are visualized along the Y-axis</li>
<li>The negatives items (red) are visualized along the X-axis</li>
<li>The threshold is visualized by the black circle</li>
</ul>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb17" data-startfrom="397" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 396;"><span id="cb17-397"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot_roc</span>(pointSelection<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">null</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointThreshold<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>) {</span>
<span id="cb17-398">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">roc_curve</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> negatives) {</span>
<span id="cb17-399">        <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> thresholds <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">concat</span>(negatives)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-400">        thresholds<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">push</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-401">        thresholds<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">push</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.1</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-402">        thresholds<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sort</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-403">        thresholds<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">reverse</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-404">        <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> result <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb17-405">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> thresholds) {</span>
<span id="cb17-406">            <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> threshold <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> thresholds[i]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span> </span>
<span id="cb17-407">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (i <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;&amp;</span> threshold <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> thresholds[i <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]) {</span>
<span id="cb17-408">                <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">continue</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-409">            }</span>
<span id="cb17-410">            <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> f <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> stats<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fallout</span>(negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-411">            <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> r <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> stats<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">recall</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> threshold)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-412">            <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> prevx <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (i <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">?</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> result[result<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">length</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">x</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-413">            result<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">push</span>({<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> prevx <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> f <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">?</span> prevx <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1e-8</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> f<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> r})</span>
<span id="cb17-414">        }</span>
<span id="cb17-415">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> result<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-416">    }</span>
<span id="cb17-417"></span>
<span id="cb17-418">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> falloutDots <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb17-419">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> negatives) {</span>
<span id="cb17-420">        <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> value <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> stats<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fallout</span>(negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> negatives[i] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1e-6</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-421">        falloutDots<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">push</span>({</span>
<span id="cb17-422">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> value<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb17-423">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-424">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">r</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> negatives[i] </span>
<span id="cb17-425">        })</span>
<span id="cb17-426">    }</span>
<span id="cb17-427">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> recallDots <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb17-428">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> positives) {</span>
<span id="cb17-429">        <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> value <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> stats<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">recall</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> positives[i] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1e-6</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-430">        recallDots<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">push</span>({</span>
<span id="cb17-431">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb17-432">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> value<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-433">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">r</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> positives[i]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-434">        })</span>
<span id="cb17-435">    }</span>
<span id="cb17-436"></span>
<span id="cb17-437">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> aucPoints <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-438">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> falloutDots) {</span>
<span id="cb17-439">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> j <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> recallDots) {</span>
<span id="cb17-440">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (falloutDots[i]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">r</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;=</span> recallDots[j]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">r</span>) {</span>
<span id="cb17-441">                aucPoints<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">push</span>([falloutDots[i]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> recallDots[j]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">y</span>])</span>
<span id="cb17-442">            }</span>
<span id="cb17-443">        }</span>
<span id="cb17-444">    }</span>
<span id="cb17-445">    aucPoints<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">reverse</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-446">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> point <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-447">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> pointOpacity <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-448">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (pointThreshold <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">null</span>) { </span>
<span id="cb17-449">        point <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [</span>
<span id="cb17-450">            stats<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fallout</span>(negatives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointThreshold)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb17-451">            stats<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">recall</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointThreshold)</span>
<span id="cb17-452">        ]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-453">        pointOpacity <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-454">    } </span>
<span id="cb17-455">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (pointSelection <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">null</span>) {</span>
<span id="cb17-456">        point <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> aucPoints[<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">floor</span>(pointSelection <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">101</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> aucPoints<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">length</span>)]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-457">        pointOpacity <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb17-458">    }</span>
<span id="cb17-459">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> Plot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot</span>({</span>
<span id="cb17-460">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">grid</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-461">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">label</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"False Positive Rate"</span>}<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-462">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">label</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"True Positive Rate"</span>}<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-463">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">r</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">range</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>]}<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-464">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">aspectRatio</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-465">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">width</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-466">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">marks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> [</span>
<span id="cb17-467">            Plot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">line</span>([[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> point[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> point]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb17-468">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeDasharray</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"1, 7"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-469">            })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-470">            Plot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">line</span>([[point[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> point]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb17-471">            <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeDasharray</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"1, 7"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-472">            })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-473">            Plot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">areaY</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">roc_curve</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> negatives)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb17-474">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-475">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-476">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">opacity</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.15</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-477">            })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-478">            Plot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">line</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">roc_curve</span>(positives<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> negatives)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb17-479">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-480">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-481">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb17-482">            })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-483">            Plot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">dot</span>(falloutDots<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">r</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"r"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fill</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> lightRed})<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-484">            Plot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">dot</span>(recallDots<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">r</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"r"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fill</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"lightgreen"</span>})<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-485">            Plot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">line</span>([[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb17-486">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">stroke</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"orange"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-487">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">opacity</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-488">            })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-489">            Plot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">dot</span>([{<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> point[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> point[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">r</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.15</span>}]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb17-490">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">r</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"r"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-491">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fill</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-492">                <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">opacity</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> pointOpacity</span>
<span id="cb17-493">            })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb17-494">        ]</span>
<span id="cb17-495">    })</span>
<span id="cb17-496">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-17" data-nodetype="declaration">

</div>
</div>
</div>
</section>
<section id="area-under-the-curve" class="level3">
<h3 class="anchored" data-anchor-id="area-under-the-curve">Area Under the Curve</h3>
<p>The area under the ROC curve is called ROC AUC score. ROC AUC stands for “Receiver Operating Characteristic Area Under the Curve”.</p>
<p>The ROC AUC score is a single number that summarizes the ML model’s performance across all threshold values. Note that the ROC curve summarizes with a visual plot, whereas the ROC AUC score summarizes with a single number.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb18" data-startfrom="510" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 509;"><span id="cb18-510"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot_roc</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">null</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">null</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-18" data-nodetype="expression">

</div>
</div>
</div>
<p>The area of the light gray region in the above visualization is the ROC AUC Score.</p>
<p>The ROC AUC score is 0.5 for a classifier that performs no better than random guessing and approaches 1.0 for a classifier with perfect performance.</p>
</section>
<section id="probabilistic-interpretation" class="level3">
<h3 class="anchored" data-anchor-id="probabilistic-interpretation">Probabilistic Interpretation</h3>
<p>The ROC AUC score has a very nice probabilistic interpretation:</p>
<blockquote class="blockquote">
<p>The ROC AUC is the probability that the model will predict a higher probability score to a randomly selected positive item than a randomly selected negative item.</p>
</blockquote>
<p>It is nicely explained with the visualization that we already have:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb19" data-startfrom="527" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 526;"><span id="cb19-527"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot_roc</span>(pointSelection)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-19" data-nodetype="expression">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb20" data-startfrom="532" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 531;"><span id="cb20-532">viewof pointSelection <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">html</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">`</span></span>
<span id="cb20-533"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">&lt;input type=range min=1 max=100 step=1 value=50 style="width:90%"/&gt;</span></span>
<span id="cb20-534"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">`</span></span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-20" data-nodetype="declaration">

</div>
</div>
</div>
<p>Every point (e.g., the black dot above) under the ROC curve has a corresponding green circle (follow the dotted horizontal segment) and a corresponding red circle (follow the dotted vertical segment). Then, the mentioned green circle is always bigger or equal to the red circle.</p>
<p><strong>Tip</strong>: Try the slider above and compare the matching green circle with the matching red circle.</p>
<p>This is the same interpretation as the probabilistic interpretation when the number of items in our dataset approaches infinity.</p>
</section>
</section>
<section id="the-end" class="level2">
<h2 class="anchored" data-anchor-id="the-end">The End</h2>
<p>I hope you enjoyed this post.</p>
<p>In the next post, we will work on an <a href="https://maitbayev.github.io/posts/roc-auc-implementation/">efficient Python implementation of the ROC AUC score</a> based on probabilistic intuition.</p>
<p><a href="https://maitbayev.substack.com/subscribe">Subscribe</a> to get a notification about future posts.</p>


</section>
</section>

 ]]></description>
  <category>math</category>
  <category>cv</category>
  <category>loss</category>
  <guid>https://maitbayev.github.io/posts/roc-auc/</guid>
  <pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate>
  <media:content url="https://maitbayev.github.io/posts/roc-auc/images/image.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Linear Equation Intuition</title>
  <dc:creator>Madiyar Aitbayev</dc:creator>
  <link>https://maitbayev.github.io/posts/linear-equation/</link>
  <description><![CDATA[ 





<section id="linear-equation-intuition" class="level1">
<h1>Linear Equation Intuition</h1>
<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>A <strong>linear equation</strong> is an equation in the form <img src="https://latex.codecogs.com/png.latex?a_1x_1+%5Ccdots+a_nx_n+b=0">. In two dimensions, it’s an <strong>equation of a line</strong> <img src="https://latex.codecogs.com/png.latex?ax+by+c=0">, while in three dimensions, it’s an <strong>equation of a plane</strong> <img src="https://latex.codecogs.com/png.latex?ax+by+cz+d=0">.</p>
<p>A linear equation is the foundation of linear models in machine learning, such as <a href="https://en.wikipedia.org/wiki/Linear_regression">linear regression</a> and <a href="https://en.wikipedia.org/wiki/Logistic_regression">logistic regression</a>.</p>
<p>In this post, let’s understand the intuitions behind the linear equation, such as:</p>
<ul>
<li>Why <img src="https://latex.codecogs.com/png.latex?ax+by+c"> is the distance between the point <img src="https://latex.codecogs.com/png.latex?(x,%20y)"> and the line?</li>
<li>What are the meanings of <img src="https://latex.codecogs.com/png.latex?(a,%20b)"> and <img src="https://latex.codecogs.com/png.latex?c">?</li>
<li>How are <a href="https://maitbayev.github.io/posts/dot-product/">the dot product</a> and linear equation related?</li>
</ul>
<p>My previous post about <a href="https://maitbayev.github.io/posts/dot-product/">the dot product</a> is a required prerequisite to this post. You need to have a good intuition about the dot product.</p>
</section>
<section id="cheatsheet" class="level2">
<h2 class="anchored" data-anchor-id="cheatsheet">Cheatsheet</h2>
<p>A short summary for people in hurry.</p>
<p>The distance from the point (x, y) to the line is: <img src="https://latex.codecogs.com/png.latex?%0A%5Cleft%7C%5Cfrac%7Bax+by+c%7D%7B%5Csqrt%7Ba%5E2+b%5E2%7D%7D%5Cright%7C%0A"></p>
<p>in n-dimensions:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cleft%7C%5Cfrac%7Ba_1x_1+%5Ccdots+a_nx_n+b%7D%7B%5Csqrt%7Ba_1%5E1+%5Ccdots+a_n%5E2%7D%7D%5Cright%7C%0A"></p>
<p>The vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D=%5Ba,%20b%5D"> is the orthogonal vector to the line <img src="https://latex.codecogs.com/png.latex?ax+by+c=0">, and <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D=%5Ba_1,%20a_2,%20%5Ccdots,%20a_n%5D"> in n-dimensions.</p>
<p>The line equation can be expressed with the dot product as <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D%20%5Ccdot%20%7B%5Bx,%20y%5D%7D+c=0"> and <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D%20%5Ccdot%20%5Ctextbf%7Bx%7D%20+%20b%20=%200"> in n-dimensions.</p>
</section>
<div class="$">
<section id="equation-of-a-line" class="level2">
<h2 class="anchored" data-anchor-id="equation-of-a-line">Equation of a line</h2>
<section id="axby" class="level3">
<h3 class="anchored" data-anchor-id="axby">ax+by</h3>
<p>Let’s start with a <strong>simpler</strong> equation of a line in the form of <img src="https://latex.codecogs.com/png.latex?ax+by=0">, where we have <img src="https://latex.codecogs.com/png.latex?c=0">. Does it remind you something ? Yes, <a href="https://maitbayev.github.io/posts/dot-product/">the dot product</a> between <img src="https://latex.codecogs.com/png.latex?(a,%20b)"> and <img src="https://latex.codecogs.com/png.latex?(x,%20y)">. The dot product <img src="https://latex.codecogs.com/png.latex?(a,%20b)%20%5Ccdot%20(x,%20y)"> is zero when the two vectors are orthogonal. Oh nice, this means that (a, b) is an orthogonal vector to our line. An orthogonal vector is also known as a <strong>normal vector</strong> of a line. Also, notice that the simpler line contains the origin since <img src="https://latex.codecogs.com/png.latex?a%5Ccdot0+b%5Ccdot0=0"> holds true.</p>
<p>Let’s visualize our setup:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb1" data-startfrom="58" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 57;"><span id="cb1-58">JXG <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">await</span> <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">require</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'https://cdnjs.cloudflare.com/ajax/libs/jsxgraph/1.10.1/jsxgraphcore.js'</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-1" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb2" data-startfrom="63" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 62;"><span id="cb2-63"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">board_div</span>(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">500</span>) {</span>
<span id="cb2-64">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">html</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">`&lt;div </span></span>
<span id="cb2-65"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">    id=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">${</span>name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;"> </span></span>
<span id="cb2-66"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">    style='max-width:</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">${</span>width<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">px; aspect-ratio: 1; </span></span>
<span id="cb2-67"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">            margin-inline: auto'&gt;</span></span>
<span id="cb2-68"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">  &lt;/div&gt;`</span> </span>
<span id="cb2-69">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-2" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb3" data-startfrom="75" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 74;"><span id="cb3-75"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">init_board</span>(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> extend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5.5</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> grid<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span>) {</span>
<span id="cb3-76">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> JXG<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">JSXGraph</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">initBoard</span>(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb3-77">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">boundingbox</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> [<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>extend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> extend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> extend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>extend]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-78">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">showCopyright</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-79">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">showNavigation</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-80">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">axis</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-81">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">grid</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> grid<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-82">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">pan</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {</span>
<span id="cb3-83">      <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">needTwoFingers</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span></span>
<span id="cb3-84">    }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-85">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">defaultAxes</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {</span>
<span id="cb3-86">      <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {</span>
<span id="cb3-87">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">ticks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {</span>
<span id="cb3-88">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">insertTicks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-89">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">minorTicks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span>   </span>
<span id="cb3-90">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">majorHeight</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-91">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">ticksDistance</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-92">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeOpacity</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-93">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeColor</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'#000000'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-94">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> </span>
<span id="cb3-95">        }</span>
<span id="cb3-96">      }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-97">      <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {</span>
<span id="cb3-98">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">ticks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {</span>
<span id="cb3-99">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">insertTicks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-100">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">minorTicks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-101">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">majorHeight</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-102">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeOpacity</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-103">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeColor</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'#000000'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-104">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> </span>
<span id="cb3-105">        }</span>
<span id="cb3-106">      }</span>
<span id="cb3-107">    }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-108">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb3-109">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-3" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb4" data-startfrom="115" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 114;"><span id="cb4-115"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_board1</span>() {</span>
<span id="cb4-116">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> board <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">init_board</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board1"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*extend=*/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*grid=*/</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-117">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> pointN <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"point"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-118">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"n"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-119">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"red"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-120">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">snapToGrid</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-121">  })</span>
<span id="cb4-122">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> lineN <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"line"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointN]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-123">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokewidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-124">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"red"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-125">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-126">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightFirst</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb4-127">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightLast</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb4-128">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">lastArrow</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-129">  })</span>
<span id="cb4-130">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> line <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"line"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb4-131">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-132">  }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb4-133">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> pointN<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-134">  }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb4-135">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> pointN<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-136">  }]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-137">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokewidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-138">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span></span>
<span id="cb4-139">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-140">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> lineText <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"text"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb4-141">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> pointN<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x + "</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> pointN<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y = 0"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-142">  }]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-143">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fontSize</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">19</span></span>
<span id="cb4-144">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-145">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-146">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-4" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb5" data-startfrom="152" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 151;"><span id="cb5-152"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">board_div</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board1"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*width=*/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-5" data-nodetype="expression">

</div>
</div>
</div>
<div class="cell hidden">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb6" data-startfrom="159" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 158;"><span id="cb6-159"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_board1</span>()</span></code></pre></div></div>
<div class="cell-output cell-output-display hidden">
<div id="ojs-cell-6" data-nodetype="expression">

</div>
</div>
</div>
<p>We have the following items visualized:</p>
<ul>
<li>Our line <img src="https://latex.codecogs.com/png.latex?ax+by=0"> is visualized with blue
<ul>
<li>It passes through the origin</li>
</ul></li>
<li>A normal vector of the line <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D=%5Ba,%20b%5D"> is visualized with red</li>
<li>Note that multiple <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D"> vectors can represent the same line</li>
</ul>
<p>Feel free to <strong>play</strong> (by moving) with the point <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D"> and notice how the line equation is changing with respect to the normal vector.</p>
<p>We can multiply or divide the line equation by any real number <img src="https://latex.codecogs.com/png.latex?k"> without changing the equation, in other words, <img src="https://latex.codecogs.com/png.latex?kax+kby+kc=0"> and <img src="https://latex.codecogs.com/png.latex?ax+by+c=0"> hold true to the same set of points. Let’s use this property and divide the equation by <img src="https://latex.codecogs.com/png.latex?%5Csqrt%7Ba%5E2+b%5E2%7D">, since it gives us <img src="https://latex.codecogs.com/png.latex?a%5E2+b%5E2=1"> and <img src="https://latex.codecogs.com/png.latex?%5C%7C%5Ctextbf%7Bn%7D%5C%7C=1">.</p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-1-contents" aria-controls="callout-1" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Explanation
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-1" class="callout-1-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>We obtain a new normalized line equation with the coefficients: <img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0Aa_%7Bnew%7D&amp;=%5Cfrac%7Ba%7D%7B%5Csqrt%7Ba%5E2+b%5E2%7D%7D%5C%5C%0Ab_%7Bnew%7D&amp;=%5Cfrac%7Bb%7D%7B%5Csqrt%7Ba%5E2+b%5E2%7D%7D%5C%5C%0Ac_%7Bnew%7D&amp;=%5Cfrac%7Bc%7D%7B%5Csqrt%7Ba%5E2+b%5E2%7D%7D%0A%5Cend%7Balign%7D%0A"></p>
<p>Note that <img src="https://latex.codecogs.com/png.latex?a_%7Bnew%7D%5E2+b_%7Bnew%7D%5E2=1"> holds true.</p>
</div>
</div>
</div>
<p>From now on, we assume that <img src="https://latex.codecogs.com/png.latex?%5C%7C%5Ctextbf%7Bn%7D%5C%7C=1">. Let’s check what we have:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb7" data-startfrom="194" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 193;"><span id="cb7-194"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_board</span>(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> props <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {}) {</span>
<span id="cb7-195">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rad</span>(deg) {</span>
<span id="cb7-196">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> deg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">180</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">PI</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-197">  }</span>
<span id="cb7-198">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_scale</span>(v<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> s) {</span>
<span id="cb7-199">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> [v[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> s<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> v[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> s]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-200">  }</span>
<span id="cb7-201">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_dot</span>(a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> b) {</span>
<span id="cb7-202">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> b[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> b[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-203">  }</span>
<span id="cb7-204">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> showPoint <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> props<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">showPoint</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">||</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span></span>
<span id="cb7-205">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> board <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">init_board</span>(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*extend=*/</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">4.5</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-206"> </span>
<span id="cb7-207">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> sliderAlpha <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"slider"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.5</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.5</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">45</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">360</span>]]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb7-208">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"alpha"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-209">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">snapWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb7-210">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-211">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> sliderC <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"slider"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">3.5</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">3.5</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>]]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb7-212">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"c"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-213">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">snapWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-214">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> props<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">showC</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">||</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span></span>
<span id="cb7-215">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-216">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> pointN <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"point"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb7-217">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cos</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rad</span>(sliderAlpha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Value</span>()))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-218">  }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb7-219">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sin</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rad</span>(sliderAlpha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Value</span>()))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-220">  }]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb7-221">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-222">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"n"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-223">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#00000000"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-224">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-225">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">highlight</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span></span>
<span id="cb7-226">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-227">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> line <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"line"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb7-228">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> sliderC<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Value</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-229">  }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb7-230">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> pointN<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-231">  }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb7-232">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> pointN<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-233">  }]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb7-234">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokewidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-235">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-236">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">highlight</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span></span>
<span id="cb7-237">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-238">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> pointP <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"point"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb7-239">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"p"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-240">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">size</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-241">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"green"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-242">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> props<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">showPoint</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">||</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span> </span>
<span id="cb7-243">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-244">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> gliderP <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"glider"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> line]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb7-245">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"p"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-246">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">size</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-247">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"green"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-248">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> props<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">showPointGlider</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">||</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-249">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-250">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> pointProj <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"point"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb7-251">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">let</span> p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [pointP<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointP<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-252">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">let</span> n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [pointN<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointN<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-253">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">let</span> proj <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_scale</span>(n<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_dot</span>(p<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> n))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-254">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> proj[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-255">  }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb7-256">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">let</span> p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [pointP<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointP<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-257">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">let</span> n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [pointN<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointN<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-258">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">let</span> proj <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_scale</span>(n<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_dot</span>(p<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> n))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-259">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> proj[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-260">  }]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb7-261">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span></span>
<span id="cb7-262">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-263">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> lineProj <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"line"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [pointP<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointProj]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb7-264">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gray"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-265">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-266">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-267">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">dash</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-268">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightFirst</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-269">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightLast</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-270">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> showPoint </span>
<span id="cb7-271">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-272">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> normalAxis <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'axis'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointN]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb7-273">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> props<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">showNormalAxis</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">||</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-274">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">ticks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {</span>
<span id="cb7-275">      <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">majorHeight</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-276">      <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">minorHeight</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-277">    }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-278">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">needsRegularUpdate</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span></span>
<span id="cb7-279">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-280">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> lineN <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"line"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointN]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb7-281">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokewidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-282">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"red"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-283">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-284">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightFirst</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-285">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightLast</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb7-286">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">lastArrow</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb7-287">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">highlight</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span></span>
<span id="cb7-288">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-289">  </span>
<span id="cb7-290">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-291">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-7" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb8" data-startfrom="297" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 296;"><span id="cb8-297"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">board_div</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board2"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*width=*/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-8" data-nodetype="expression">

</div>
</div>
</div>
<div class="cell hidden">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb9" data-startfrom="304" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 303;"><span id="cb9-304"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_board</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board2"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display hidden">
<div id="ojs-cell-9" data-nodetype="expression">

</div>
</div>
</div>
<p>We introduced <strong>a slider</strong> that defines the angle of the normal vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D">. We also restricted <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D"> so that <img src="https://latex.codecogs.com/png.latex?%5C%7C%5Ctextbf%7Bn%7D%5C%7C=1">. Now, our line is uniquely defined by <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D">, which was not case before.</p>
<p>Let’s introduce a point <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D=%5Bx,%20y%5D"> on the line:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb10" data-startfrom="315" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 314;"><span id="cb10-315"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">board_div</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board3"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*width=*/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-10" data-nodetype="expression">

</div>
</div>
</div>
<div class="cell hidden">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb11" data-startfrom="322" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 321;"><span id="cb11-322"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_board</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board3"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb11-323">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">showPointGlider</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb11-324">})</span></code></pre></div></div>
<div class="cell-output cell-output-display hidden">
<div id="ojs-cell-11" data-nodetype="expression">

</div>
</div>
</div>
<p>Try moving the new green point! The point <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D=%5Bx,%20y%5D"> always lies on the line, in other words:</p>
<ul>
<li><img src="https://latex.codecogs.com/png.latex?ax+by=0">, where <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D=%5Ba,%20b%5D"></li>
<li>Equivalently <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D%20%5Ccdot%20%5Ctextbf%7Bp%7D%20=%200"></li>
<li>The angle defined by the points <img src="https://latex.codecogs.com/png.latex?(%5Ctextbf%7Bn%7D,%20%5Ctext%7Borigin%7D,%20%5Ctextbf%7Bp%7D)"> is a right angle.</li>
</ul>
<p>We have learned so far that <img src="https://latex.codecogs.com/png.latex?a"> and <img src="https://latex.codecogs.com/png.latex?b"> represent the normal vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D=%5Ba,%20b%5D">, and we can express the line equation with the dot product <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D%20%5Ccdot%20%5Ctextbf%7Bp%7D%20=%200">.</p>
<p>What is the meaning of the line equation when the point <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> is outside of the line, i.e., when <img src="https://latex.codecogs.com/png.latex?ax+by%20%5Cneq%200">? <strong>Spoiler:</strong> the value is the signed distance from the point <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> to our line. Let’s understand this intuitively.</p>
<p>The dot product <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D%20%5Ccdot%20%5Ctextbf%7Bp%7D"> is a non-zero value when the point <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> is not on the line. From <a href="https://maitbayev.github.io/posts/dot-product/">the previous</a> post we know that the dot product is the projection of the vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> to the vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D">. Imagine a 1D number line spanned by the vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D"> like this:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb12" data-startfrom="341" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 340;"><span id="cb12-341"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">board_div</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board4"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*width=*/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-12" data-nodetype="expression">

</div>
</div>
</div>
<div class="cell hidden">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb13" data-startfrom="348" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 347;"><span id="cb13-348"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_board</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board4"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb13-349">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">showPoint</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb13-350">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">showNormalAxis</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb13-351">})</span></code></pre></div></div>
<div class="cell-output cell-output-display hidden">
<div id="ojs-cell-13" data-nodetype="expression">

</div>
</div>
</div>
<p>The introduced 1D number line has ticks that represent the signed distances from our line. The projection of the point <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> falls somewhere on that 1D number line (following the dotted line segment), which corresponds to the dot product. Remember that <img src="https://latex.codecogs.com/png.latex?ax+by"> and <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D%20%5Ccdot%20%5Ctextbf%7Bp%7D"> are the same. Play with the point <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> (and with the slider) to understand when <img src="https://latex.codecogs.com/png.latex?ax+by"> is zero, positive and negative. Can you see that <img src="https://latex.codecogs.com/png.latex?ax+by"> (and <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D%20%5Ccdot%20%5Ctextbf%7Bp%7D">) represents the signed distance from the point <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> to our line?</p>
</section>
<section id="axbyc" class="level3">
<h3 class="anchored" data-anchor-id="axbyc">ax+by+c</h3>
<p>By this point, you need to understand the line equation of the form <img src="https://latex.codecogs.com/png.latex?ax+by=0">. Now, let’s explore the line equation of the form <img src="https://latex.codecogs.com/png.latex?ax+by+c=0">!</p>
<p>We represented <img src="https://latex.codecogs.com/png.latex?ax+by"> with the dot product <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D%20%5Ccdot%20%5Ctextbf%7Bp%7D">, similarly <img src="https://latex.codecogs.com/png.latex?ax+by+c"> can be represented with <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D%20%5Ccdot%20%5Ctextbf%7Bp%7D+c">. First, we land on the 1D number line with <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bn%7D%20%5Ccdot%20%5Ctextbf%7Bp%7D">, then move <img src="https://latex.codecogs.com/png.latex?c"> steps forward on that 1D number line. It is easier explained with a visualization:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb14" data-startfrom="371" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 370;"><span id="cb14-371"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">board_div</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board5"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*width=*/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-14" data-nodetype="expression">

</div>
</div>
</div>
<div class="cell hidden">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb15" data-startfrom="378" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 377;"><span id="cb15-378"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_board</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board5"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb15-379">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">showPoint</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb15-380">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">showNormalAxis</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb15-381">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">showC</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb15-382">})</span></code></pre></div></div>
<div class="cell-output cell-output-display hidden">
<div id="ojs-cell-15" data-nodetype="expression">

</div>
</div>
</div>
<p>Play with the slider for <img src="https://latex.codecogs.com/png.latex?c">, and notice the location of our line when <img src="https://latex.codecogs.com/png.latex?c=1"> and <img src="https://latex.codecogs.com/png.latex?c=-1">.</p>
<p>Can you see that <img src="https://latex.codecogs.com/png.latex?ax+by+c"> is still the signed distance from the point <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> to our line? What does <img src="https://latex.codecogs.com/png.latex?c"> represent?</p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-2-contents" aria-controls="callout-2" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Explanation
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-2" class="callout-2-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>First, we land on the 1D number line with <img src="https://latex.codecogs.com/png.latex?c'=%5Ctextbf%7Bn%7D%20%5Ccdot%20%5Ctextbf%7Bp%7D">. Then, let’s denote <img src="https://latex.codecogs.com/png.latex?ax+by+c"> as <img src="https://latex.codecogs.com/png.latex?c'+c">. The <img src="https://latex.codecogs.com/png.latex?c'+c"> is zero when <img src="https://latex.codecogs.com/png.latex?c'=-c">; <img src="https://latex.codecogs.com/png.latex?1"> when <img src="https://latex.codecogs.com/png.latex?c'=-c+1">; <img src="https://latex.codecogs.com/png.latex?-1"> when <img src="https://latex.codecogs.com/png.latex?c'=-c-1">; and so on.</p>
<p><img src="https://latex.codecogs.com/png.latex?%7Cc%7C"> is the distance from the origin to our line, c is the signed distance. The signed distance is positive in the direction of the normal vector, and negative in the opposite direction.</p>
</div>
</div>
</div>
</section>
</section>
<section id="the-end" class="level2">
<h2 class="anchored" data-anchor-id="the-end">The End</h2>
<p>I hope you enjoyed this post. <a href="https://maitbayev.substack.com/subscribe">Subscribe</a> to get a notification about future posts.</p>


</section>
</div>
</section>

 ]]></description>
  <category>math</category>
  <guid>https://maitbayev.github.io/posts/linear-equation/</guid>
  <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
  <media:content url="https://maitbayev.github.io/posts/linear-equation/images/image.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Dot Product Intuition</title>
  <dc:creator>Madiyar Aitbayev</dc:creator>
  <link>https://maitbayev.github.io/posts/dot-product/</link>
  <description><![CDATA[ 





<section id="dot-product-intuition" class="level1">
<h1>Dot Product Intuition</h1>
<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>The <strong>dot product</strong> (or <strong>scalar product</strong>) is a simple yet powerful operation that is used in many places in Machine Learning and other fields. In this post, I will explain the geometric intuition behind the dot product. You need to have a basic grasp of trigonometry and vector algebra to follow this post.</p>
<p>I will need this explanation for my future posts.</p>
<p>Feel free to ask questions on <a href="https://t.me/swemanml">my telegram channel</a></p>
</section>
<section id="recap" class="level2">
<h2 class="anchored" data-anchor-id="recap">Recap</h2>
<p>More beginner friendly explanations are available in the following resources:</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Dot_product">en.wikipedia.org/wiki/Dot_product</a></li>
<li><a href="https://brilliant.org/wiki/dot-product-definition">brilliant.org/wiki/dot-product-definition</a></li>
<li><a href="https://betterexplained.com/articles/vector-calculus-understanding-the-dot-product/">betterexplained.com/articles/vector-calculus-understanding-the-dot-product</a></li>
</ul>
<p>Feel free to checkout the above or other resources first.</p>
<p>Assume we have two vectors <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D=%5Ba_1,%20a_2,%20%5Ccdots,%20a_n%5D"> and <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D%20=%20%5Bb_1,%20b_2,%20%5Ccdots,%20b_n%5D">, then there are two definitions of the dot product: <strong>algebraic</strong> and <strong>geometric</strong>.</p>
<section id="algebraic-definition" class="level3">
<h3 class="anchored" data-anchor-id="algebraic-definition">Algebraic definition</h3>
<p>The dot product of <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D"> and <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D"> is:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctextbf%7Ba%7D%20%5Ccdot%20%5Ctextbf%7Bb%7D%20=%20%5Csum_%7Bi=1%7D%5En%7Ba_ib_i%7D%20=%20a_1b_1+a_2b_2+%5Ccdots+a_nb_n%0A"></p>
</section>
<section id="geometric-definition" class="level3">
<h3 class="anchored" data-anchor-id="geometric-definition">Geometric definition</h3>
<p>The dot product of <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D"> and <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D"> is: <img src="https://latex.codecogs.com/png.latex?%0A%5Ctextbf%7Ba%7D%20%5Ccdot%20%5Ctextbf%7Bb%7D%20=%20%5C%7C%5Cmathbf%7Ba%7D%5C%7C%5C%7C%5Cmathbf%7Bb%7D%5C%7C%5Ccos%20%5Ctheta%0A"></p>
<p>where <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> is the angle between <strong>a</strong> and <strong>b</strong> and <img src="https://latex.codecogs.com/png.latex?%5C%7C%5Ctextbf%7Ba%7D%5C%7C"> is the magnitude of a vector <strong>a</strong>.</p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-1-contents" aria-controls="callout-1" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Geometric properties
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-1" class="callout-1-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>The geometric definition gives us a few useful properties:</p>
<ul>
<li>The dot product is zero when <strong>a</strong> and <strong>b</strong> are orthogonal, since <img src="https://latex.codecogs.com/png.latex?%5Ccos(90%20%5Cdegree)%20=%200"></li>
<li>The dot product is positive for acute angles and negative for obtuse, e.g., <img src="https://latex.codecogs.com/png.latex?%5Ccos(45%5Cdegree)"> or <img src="https://latex.codecogs.com/png.latex?%5Ccos(89%5Cdegree)"> are positive but <img src="https://latex.codecogs.com/png.latex?%5Ccos(180%5Cdegree),%20%5Ccos(91%5Cdegree)"> are negative.</li>
<li>We can find the angle between vectors by <img src="https://latex.codecogs.com/png.latex?%5Ctheta%20=%20%5Carccos(%5Cfrac%7B%5Ctextbf%7Ba%7D%20%5Ccdot%20%5Ctextbf%7Bb%7D%7D%7B%5C%7C%5Cmathbf%7Ba%7D%5C%7C%5C%7C%5Cmathbf%7Bb%7D%5C%7C%7D)">. A picture from Wikipedia:</li>
</ul>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://upload.wikimedia.org/wikipedia/commons/7/76/Inner-product-angle.svg" class="img-fluid figure-img" width="300"></p>
<figcaption>Source Wikipedia</figcaption>
</figure>
</div>
</div>
</div>
</div>
</section>
<section id="equivalence" class="level3">
<h3 class="anchored" data-anchor-id="equivalence">Equivalence?</h3>
<p>Wait, how are the two dot product definitions the same? How is <img src="https://latex.codecogs.com/png.latex?cos(%20%5Ctheta)"> related to such a straightforward sum of components? A few questions I asked when I first encountered the dot product. I accepted the fact and moved on with my life until today. I will try to understand myself and also explain by interactive visualizations.</p>
</section>
</section>
<section id="explanation" class="level2">
<h2 class="anchored" data-anchor-id="explanation">Explanation</h2>
<p>Let’s first simplify the problem as much as possible. Once we build up an intuition for simpler cases, we can come back and try to understand the general cases.</p>
<section id="simplified-version" class="level3">
<h3 class="anchored" data-anchor-id="simplified-version">Simplified version</h3>
<p>First, we will only consider the <img src="https://latex.codecogs.com/png.latex?n=2"> case. Assume that we have 2D vectors: <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D=%5Ba_x,%20a_y%5D"> and <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D=%5Bb_x,%20b_y%5D"> with the dot product:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctextbf%7Ba%7D%20%5Ccdot%20%5Ctextbf%7Bb%7D%20=%20a_xb_x+a_yb_y=%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5C%7C%5Ctextbf%7Bb%7D%5C%7C%5Ccos%20%5Ctheta%0A"></p>
<p>where <img src="https://latex.codecogs.com/png.latex?%5C%7C%5Ctextbf%7Ba%7D%5C%7C=%5Csqrt%7Ba_x%5E2+a_y%5E2%7D"> is the length of the vector and <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> is the angle between the vectors.</p>
<p>Second, scaling either <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D"> or <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D"> by a real number <img src="https://latex.codecogs.com/png.latex?k"> does not invalidate the dot product equivalence. Let’s say we scale <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D"> by <img src="https://latex.codecogs.com/png.latex?k">, then:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctextbf%7Ba%7D%20%5Ccdot%20(k%20%5Ctextbf%7Bb%7D)%20=%20a_x(kb_x)+a_y(kb_y)=%5C%7C%5Ctextbf%7Ba%7D%5C%7Ck%5C%7C%5Ctextbf%7Bb%7D%5C%7C%5Ccos%20%5Ctheta%0A"></p>
<p>With the above, we can simplify further by constraining <img src="https://latex.codecogs.com/png.latex?%5C%7C%5Ctextbf%7Bb%7D%5C%7C%20=%201">. If the equivalence holds for <img src="https://latex.codecogs.com/png.latex?%5C%7C%5Ctextbf%7Bb%7D%5C%7C%20=%201">, then it holds for any <img src="https://latex.codecogs.com/png.latex?%5C%7Ck%5Ctextbf%7Bb%7D%5C%7C">.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb1" data-startfrom="91" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 90;"><span id="cb1-91">JXG <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">await</span> <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">require</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'https://cdnjs.cloudflare.com/ajax/libs/jsxgraph/1.10.1/jsxgraphcore.js'</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-1" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb2" data-startfrom="96" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 95;"><span id="cb2-96"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">board_div</span>(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">500</span>) {</span>
<span id="cb2-97">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">html</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">`&lt;div </span></span>
<span id="cb2-98"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">    id=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">${</span>name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;"> </span></span>
<span id="cb2-99"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">    style='max-width:</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">${</span>width<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">px; aspect-ratio: 1; </span></span>
<span id="cb2-100"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">            margin-inline: auto'&gt;</span></span>
<span id="cb2-101"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">  &lt;/div&gt;`</span> </span>
<span id="cb2-102">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-2" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb3" data-startfrom="108" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 107;"><span id="cb3-108"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">init_board</span>(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> extend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5.5</span>) {</span>
<span id="cb3-109">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> JXG<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">JSXGraph</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">initBoard</span>(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb3-110">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">boundingbox</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> [<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>extend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> extend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> extend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>extend]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-111">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">showCopyright</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-112">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">showNavigation</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-113">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">axis</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-114">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">grid</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-115">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">pan</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {</span>
<span id="cb3-116">      <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">needTwoFingers</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span></span>
<span id="cb3-117">    }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-118">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">defaultAxes</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {</span>
<span id="cb3-119">      <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">x</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {</span>
<span id="cb3-120">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">ticks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {</span>
<span id="cb3-121">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">insertTicks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-122">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">minorTicks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span>   </span>
<span id="cb3-123">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">majorHeight</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-124">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">ticksDistance</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-125">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeOpacity</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-126">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeColor</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'#000000'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-127">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> </span>
<span id="cb3-128">        }</span>
<span id="cb3-129">      }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-130">      <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">y</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {</span>
<span id="cb3-131">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">ticks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> {</span>
<span id="cb3-132">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">insertTicks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-133">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">minorTicks</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-134">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">majorHeight</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-135">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeOpacity</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-136">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeColor</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'#000000'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-137">          <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> </span>
<span id="cb3-138">        }</span>
<span id="cb3-139">      }</span>
<span id="cb3-140">    }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-141">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb3-142">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-3" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb4" data-startfrom="148" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 147;"><span id="cb4-148"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_board</span>(</span>
<span id="cb4-149">  name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> showSlider<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> sliderValue<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb4-150">  showP<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> showPLabel<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span></span>
<span id="cb4-151">) {</span>
<span id="cb4-152">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_length</span>(a)  {</span>
<span id="cb4-153">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>])<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-154">  }</span>
<span id="cb4-155">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_unit</span>(a) {</span>
<span id="cb4-156">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> len <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_length</span>(a)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-157">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_scale</span>(a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> len)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-158">  }</span>
<span id="cb4-159">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_scale</span>(a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> scalar) {</span>
<span id="cb4-160">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> [a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> scalar<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> scalar]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-161">  }</span>
<span id="cb4-162">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_dot</span>(a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> b) {</span>
<span id="cb4-163">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> b[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> b[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-164">  }</span>
<span id="cb4-165">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_cross</span>(a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> b) {</span>
<span id="cb4-166">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> b[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> b[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-167">  }</span>
<span id="cb4-168">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_mid</span>(a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> b) {</span>
<span id="cb4-169">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_scale</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_add</span>(a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> b)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-170">  }</span>
<span id="cb4-171">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_rot90</span>(v) {</span>
<span id="cb4-172">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> [<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>v[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> v[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-173">  }</span>
<span id="cb4-174">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_add</span>(a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> b) {</span>
<span id="cb4-175">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> [a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> b[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> b[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-176">  }</span>
<span id="cb4-177"></span>
<span id="cb4-178">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">calcP</span>(a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> b) {</span>
<span id="cb4-179">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> unit_b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_unit</span>(b)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-180">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_scale</span>(unit_b<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_dot</span>(a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> unit_b))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-181">  }</span>
<span id="cb4-182"></span>
<span id="cb4-183">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">calcUnder</span>(p<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> delta<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.05</span>) {</span>
<span id="cb4-184">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_scale</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_rot90</span>(p)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> delta <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_length</span>(p))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-185">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_cross</span>(a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> p) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>) {</span>
<span id="cb4-186">      n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_scale</span>(n<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-187">    }</span>
<span id="cb4-188">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> [n<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_add</span>(p<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> n)]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-189">  }</span>
<span id="cb4-190"></span>
<span id="cb4-191">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.5</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-192">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-193">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [a[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-194">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> board <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">init_board</span>(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">3.5</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-195">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> pointa <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"point"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-196">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-197">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"a"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-198">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"blue"</span></span>
<span id="cb4-199">  })</span>
<span id="cb4-200">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> pointb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"point"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> b<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-201">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-202">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"b"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-203">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"red"</span></span>
<span id="cb4-204">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-205">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> pointp <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"point"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb4-206">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">calcP</span>([pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [pointb<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointb<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()])[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-207">  }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb4-208">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">calcP</span>([pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [pointb<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointb<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()])[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-209">  }]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-210">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> showP<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-211">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-212">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"p"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-213">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">color</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"green"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-214">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">size</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-215">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-216">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> lineGreen <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"line"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb4-217">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">calcUnder</span>([pointp<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointp<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.03</span>)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-218">  }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb4-219">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">calcUnder</span>([pointp<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointp<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.03</span>)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-220">  }]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-221">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> showP<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-222">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">lastArrow</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-223">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-224">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightFirst</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb4-225">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightLast</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb4-226">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeColor</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"green"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-227">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.5</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-228">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">label</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span>{<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">offsets</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span>[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]}</span>
<span id="cb4-229">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-230">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> linea <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"line"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointa]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-231">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-232">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightFirst</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb4-233">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightLast</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb4-234">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">lastArrow</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-235">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeColor</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"blue"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-236">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb4-237">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-238">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> lineb <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"line"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointb]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-239">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-240">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightFirst</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb4-241">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightLast</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb4-242">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">lastArrow</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-243">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeColor</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"red"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-244">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb4-245">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-246"></span>
<span id="cb4-247">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> lineap <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"line"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointp]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-248">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> showP<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-249">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-250">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightFirst</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb4-251">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">straightLast</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> </span>
<span id="cb4-252">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">dash</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-253">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeColor</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-254">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb4-255">  })</span>
<span id="cb4-256">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> rightAngle <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nonreflexangle"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointp<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointb]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-257">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> showP<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-258">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-259">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeColor</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-260">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">strokeWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-261">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fillColor</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#00000000"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-262">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">radius</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.3</span></span>
<span id="cb4-263">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-264">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> pointo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"point"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-265">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-266">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">fixed</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-267">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"o"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-268">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-269">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> alphaAngle <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"angle"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [pointb<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointo<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointa]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-270">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"θ"</span></span>
<span id="cb4-271">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-272"> </span>
<span id="cb4-273">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> slider <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'slider'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> sliderValue<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">360</span>]]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-274">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> showSlider<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-275">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">name</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"alpha"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-276">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">snapWidth</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb4-277">  })<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-278">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> text <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'text'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb4-279">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> s <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">calcUnder</span>([pointp<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointp<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-280">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_mid</span>(s[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> s[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>])[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-281">  }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() {</span>
<span id="cb4-282">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> s <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">calcUnder</span>([pointp<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointp<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">X</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointa<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Y</span>()]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-283">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">vec_mid</span>(s[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> s[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>])[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-284">  }<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'||a||cos(θ)'</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {</span>
<span id="cb4-285">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">visible</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> showP <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;&amp;</span> showPLabel<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-286">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">anchorX</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"middle"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-287">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">anchorY</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"middle"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb4-288">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">// fontSize: 15,</span></span>
<span id="cb4-289">  })</span>
<span id="cb4-290">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> rot <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'transform'</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(){<span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> slider<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Value</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">180</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">PI</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span>}<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">type</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'rotate'</span>})<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-291">  rot<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">bindTo</span>([pointb<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> pointa])<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-292">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> board<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb4-293">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-4" data-nodetype="declaration">

</div>
</div>
</div>
<p>A visualization for the setup we have so far:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb5" data-startfrom="301" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 300;"><span id="cb5-301"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">board_div</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board1"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">300</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-5" data-nodetype="expression">

</div>
</div>
</div>
<div class="cell hidden">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb6" data-startfrom="307" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 306;"><span id="cb6-307">board1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_board</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board1"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*showSlider=*/</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*sliderValue=*/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*showP=*/</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display hidden">
<div id="ojs-cell-6" data-nodetype="declaration">

</div>
</div>
</div>
<p>We have the following items shown above:</p>
<ul>
<li>The vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D">: it is <strong>interactive</strong> and visualized with blue; feel free to move the point <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D"> around.</li>
<li>The vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D">: it is visualized with red and <img src="https://latex.codecogs.com/png.latex?%5C%7C%5Ctextbf%7Bb%7D%5C%7C=1">.</li>
<li><img src="https://latex.codecogs.com/png.latex?%5Ctheta">: the angle from <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D"> to <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D"></li>
</ul>
<p>The geometric definition implies that the dot product is <strong>invariant under rotations</strong>. So, if we rotate the both vectors <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D"> and <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D"> by the same angle <img src="https://latex.codecogs.com/png.latex?%5Calpha">, the dot product won’t change. It is not obvious from the algebraic definition, but a detailed proof is provided in the next section. Let’s trust this property for now until the next section, and simplify our problem for the third time.</p>
<p>We can rotate the both vectors such that <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D"> is aligned with the x-axis. Click the button below for the illustration:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb7" data-startfrom="326" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 325;"><span id="cb7-326">viewof mybutton <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {</span>
<span id="cb7-327">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> form <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> Inputs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">button</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Play to Rotate"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> {<span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">value</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">null</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">reduce</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> () <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">=&gt;</span> {</span>
<span id="cb7-328">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">var</span> slider <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> board2<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">elementsByName</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"alpha"</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-329">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">updateRotate</span>() {</span>
<span id="cb7-330">      <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (slider<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Value</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>) {</span>
<span id="cb7-331">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-332">      }</span>
<span id="cb7-333">      slider<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">setValue</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Math</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> slider<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Value</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-334">      board2<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">update</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-335">      <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">setTimeout</span>(updateRotate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-336">    }</span>
<span id="cb7-337">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (slider<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Value</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>) {</span>
<span id="cb7-338">      slider<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">setValue</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-339">    }</span>
<span id="cb7-340">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">updateRotate</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-341">  }})<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-342">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> scope <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> DOM<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">uid</span>()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">id</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-343">  <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">const</span> cls <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> form<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">classList</span>[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-344">  form<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">classList</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add</span>(scope)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-345">  form<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">append</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">html</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">`&lt;style&gt;</span></span>
<span id="cb7-346"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">    .</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">${</span>cls<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;"> &gt; button { color: white }</span></span>
<span id="cb7-347"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">    &lt;/style&gt;</span></span>
<span id="cb7-348"><span class="vs" style="color: #20794D;
background-color: null;
font-style: inherit;">  `</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-349">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> form<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-350">}</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-7" data-nodetype="declaration">

</div>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb8" data-startfrom="356" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 355;"><span id="cb8-356"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">board_div</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board2"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">300</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-8" data-nodetype="expression">

</div>
</div>
</div>
<div class="cell hidden">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb9" data-startfrom="362" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 361;"><span id="cb9-362">board2 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_board</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board2"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*showSlider=*/</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*sliderValue=*/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*showP=*/</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display hidden">
<div id="ojs-cell-9" data-nodetype="declaration">

</div>
</div>
</div>
<p>We arrived at a simplifed version of the problem: a vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D=%5Ba_x,%20a_y%5D"> and a fixed vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D=%5B1,%200%5D">. Let’s check if the definitions agree now. The algebraic dot product is:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctextbf%7Ba%7D%20%5Ccdot%20%5Ctextbf%7Bb%7D%20=%20a_xb_x+a_yb_y=a_x%0A"></p>
<p>and the geometric is:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctextbf%7Ba%7D%20%5Ccdot%20%5Ctextbf%7Bb%7D%20=%20%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5C%7C%5Ctextbf%7Bb%7D%5C%7C%5Ccos%20%5Ctheta%20=%20%20%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5Ccos%20%5Ctheta%0A"></p>
<p>now, we have <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D%20%5Ccdot%20%5Ctextbf%7Bb%7D%20=%20a_x%20=%20%20%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5Ccos%20%5Ctheta">. This is correct due to <a href="https://en.wikipedia.org/wiki/Polar_coordinate_system#Converting_between_polar_and_Cartesian_coordinates">the polar coordinates</a>. Alternatively, we can easily derive from the <a href="https://en.wikipedia.org/wiki/Sine_and_cosine">cosine definition</a>. The proof is left as an exercise to the reader. You can use the visualization below to convince yourself:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb10" data-startfrom="382" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 381;"><span id="cb10-382"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">board_div</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board3"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-10" data-nodetype="expression">

</div>
</div>
</div>
<div class="cell hidden">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb11" data-startfrom="388" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 387;"><span id="cb11-388">board3 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_board</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board3"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*showSlider=*/</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*sliderValue=*/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*showP=*/</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display hidden">
<div id="ojs-cell-11" data-nodetype="declaration">

</div>
</div>
</div>
<p>We introduced <strong>a new vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"></strong> in the above visualization:</p>
<ul>
<li>It is visualized in green and visually represents the dot product</li>
<li>It has coordinates <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D=%5B%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5Ccos%20%5Ctheta,%200%5D=%5Ba_x,%200%5D">:
<ul>
<li>Where <img src="https://latex.codecogs.com/png.latex?p_x"> is the dot product as we derived above</li>
</ul></li>
<li>The vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> is collinear with the vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D"></li>
<li>Since the vectors <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> and <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D"> lie along the same line:
<ul>
<li>We can express <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> using vector arithmetic: <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D=(%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5Ccos%20%5Ctheta)%5Ctextbf%7Bb%7D"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5Ccos%20%5Ctheta"> is a real number, which means how many <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D">`s are required to reach the vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"></li>
<li>You can visualize a 1D number line spanned by the vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D">, then <img src="https://latex.codecogs.com/png.latex?%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5Ccos%20%5Ctheta"> is the location of <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> in that 1D coordinate system.</li>
</ul></li>
<li><img src="https://latex.codecogs.com/png.latex?p_x"> can be 0, positive or negative. When negative, the vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> is opposite to the vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D"></li>
<li>The vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> is actually <a href="https://en.wikipedia.org/wiki/Dot_product#Scalar_projection_and_first_properties">the projection</a> of the vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D"> into <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D">.</li>
<li>Play with the point <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D"> to gain more intuition!</li>
</ul>
<p>Try different values of <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D"> by moving it in the visualization, and verify the following questions:</p>
<ul>
<li>When the dot product is zero?</li>
<li>When the dot product is negative ?</li>
<li>When the dot product is positive ?</li>
<li>What values of <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D"> result in the same dot product?</li>
</ul>
<p>The simplified form of the dot product is quite useful for intuition. I visualize this version in my mind when I forget some details of the dot product. At this point, you should be comfortable with the dot product of the simplified form: <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D%20%5Ccdot%20%5B1,%200%5D">.</p>
</section>
<section id="rotational-invariance" class="level3">
<h3 class="anchored" data-anchor-id="rotational-invariance">Rotational invariance</h3>
<p>First, let’s visualize the rotation:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb12" data-startfrom="421" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 420;"><span id="cb12-421"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">board_div</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board4"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">500</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="ojs-cell-12" data-nodetype="expression">

</div>
</div>
</div>
<div class="cell hidden">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code hidden" id="cb13" data-startfrom="427" data-source-offset="0" style="background: #f1f3f5;"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 426;"><span id="cb13-427">board4 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_board</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"board4"</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*showSlider=*/</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*sliderValue=*/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*showP=*/</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/*showP=*/</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display hidden">
<div id="ojs-cell-13" data-nodetype="declaration">

</div>
</div>
</div>
<p>There is <strong>a slider</strong> which represents the angle <img src="https://latex.codecogs.com/png.latex?%5Calpha"> (in degrees) by which both vectors are rotated. Feel free to play with the slider! You can also interact with the point <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D">.</p>
<p>It is easy to see why the dot product is invariant under rotations from the geometric definition. The geometric definition relies only on the lengths of the vectors, and the lengths don’t change when rotated.</p>
<p>However, it is not immediately clear from the algebraic definition. To prove it, we derive an alternative formula for the algebraic dot product:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5C%7C%5Ctextbf%7Ba%7D-%5Ctextbf%7Bb%7D%5C%7C%5E2%20&amp;=%20(a_x-b_x)%5E2%20+%20(a_y-b_y)%5E2%20%5C%5C%0A&amp;=%20a_x%5E2%20+%20b_x%5E2%20-%202a_xb_x%20+%20a_y%5E2%20+%20b_y%5E2%20-%202a_yb_y%20%5C%5C%0A&amp;=%20(a_x%5E2%20+%20a_y%5E2)%20+%20(b_x%5E2%20+%20b_y%5E2)%20-%202(a_xb_x%20+%20a_yb_y)%20%5C%5C%0A&amp;=%20%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5E2%20+%20%5C%7C%5Ctextbf%7Bb%7D%5C%7C%5E2%20-%202%20%5Ctextbf%7Ba%7D%20%5Ccdot%20%5Ctextbf%7Bb%7D%0A%5Cend%7Balign%7D%0A"></p>
<p>which gives us:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5Ctextbf%7Ba%7D%20%5Ccdot%20%5Ctextbf%7Bb%7D%20&amp;=%20a_xb_x%20+%20a_yb_y%20%5C%5C%0A&amp;=%20%5Cfrac%7B%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5E2%20+%20%5C%7C%5Ctextbf%7Bb%7D%5C%7C%5E2%20-%20%5C%7C%5Ctextbf%7Ba%7D-%5Ctextbf%7Bb%7D%5C%7C%5E2%20%7D%7B2%7D%0A%5Cend%7Balign%7D%0A"></p>
<p>The dot product above is derived purely from the lengths. Since the lengths remain unchanged under rotations, the algebraic dot product remains unchanged as well, which completes our proof.</p>
<p>Note that we derived the <a href="https://en.wikipedia.org/wiki/Law_of_cosines">law of cosine</a>, which is quite cool!</p>
</section>
<section id="general-version" class="level3">
<h3 class="anchored" data-anchor-id="general-version">General version</h3>
<p>It’s not hard to extend the 2D version of the proof to n-dimensional vectors, since we didn’t rely on any properties unique to 2D. The shortest way is:</p>
<ul>
<li>Note that the dot product of n-dimensional vectors is invariant under rotations. The same proof as in the rotational invariance</li>
<li>Rotate the vectors such that they lie in the xy-plane</li>
<li>Now, we reduced n-dimensional vectors to 2D vectors, which we already know how to prove</li>
</ul>
<p>I will provide more alternative proofs below, mostly for myself. They’re optional and collapsed, feel free to read them.</p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-2-contents" aria-controls="callout-2" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Alternative Proof 1
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-2" class="callout-2-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>We only scaled the vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D"> but we can also scale the vector <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D">, so that <img src="https://latex.codecogs.com/png.latex?%5C%7C%5Ctextbf%7Ba%7D%5C%7C=1">. Also switch to the polar coordinates: <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Ba%7D=%5B%5Ccos%20%5Calpha,%20%5Csin%20%5Calpha%5D"> and <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bb%7D=%5B%5Ccos%20%5Cbeta,%20%5Csin%20%5Cbeta%5D">.</p>
<p>Then, the geometric dot product is:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctextbf%7Ba%7D%20%5Ccdot%20%5Ctextbf%7Bb%7D%20=%20%5Ccos(%5Calpha%20-%20%5Cbeta)%0A"></p>
<p>The algebraic is:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctextbf%7Ba%7D%20%5Ccdot%20%5Ctextbf%7Bb%7D%20=%20%5Ccos%20%5Calpha%20%5Ccos%20%5Cbeta%20+%20%5Csin%20%5Calpha%20%5Csin%20%5Cbeta%0A"></p>
<p>We arrive at the <a href="https://mathworld.wolfram.com/TrigonometricAdditionFormulas.html">cosine subtraction rule</a>: <img src="https://latex.codecogs.com/png.latex?%0A%5Ccos(%5Calpha-%5Cbeta)=%5Ccos%20%5Calpha%20%5Ccos%20%5Cbeta%20+%20%5Csin%20%5Calpha%20%5Csin%20%5Cbeta%0A"></p>
</div>
</div>
</div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-3-contents" aria-controls="callout-3" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Alternative Proof 2
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-3" class="callout-3-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>We will extend the formula from the rotational invariance section further. We derived the following dot product formula:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5Ctextbf%7Ba%7D%20%5Ccdot%20%5Ctextbf%7Bb%7D%20&amp;=%20%5Csum_%7Bi=1%7D%5En%20a_ib_i%20%5C%5C%0A&amp;=%20%5Cfrac%7B%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5E2%20+%20%5C%7C%5Ctextbf%7Bb%7D%5C%7C%5E2%20-%20%5C%7C%5Ctextbf%7Ba%7D-%5Ctextbf%7Bb%7D%5C%7C%5E2%20%7D%7B2%7D%0A%5Cend%7Balign%7D%0A"></p>
<p>From the <a href="https://en.wikipedia.org/wiki/Law_of_cosines">law of cosine</a>, we also have:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5C%7C%5Ctextbf%7Ba%7D-%5Ctextbf%7Bb%7D%5C%7C=%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5E2+%5C%7C%5Ctextbf%7Bb%7D%5C%7C%5E2-2%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5C%7C%5Ctextbf%7Bb%7D%5C%7C%5Ccos%20%5Ctheta%0A"></p>
<p>if we rearrange and combine the above two equations: <img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5C%7C%5Ctextbf%7Bb%7D%5C%7C%5Ccos%20%5Ctheta%20=&amp;%20%5Ctextbf%7Ba%7D%20%5Ccdot%20%5Ctextbf%7Bb%7D=%20%5Csum_%7Bi=1%7D%5En%20a_ib_i%20%20%5C%5C%0A=&amp;%20%5Cfrac%7B%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5E2%20+%20%5C%7C%5Ctextbf%7Bb%7D%5C%7C%5E2%20-%20%5C%7C%5Ctextbf%7Ba%7D-%5Ctextbf%7Bb%7D%5C%7C%5E2%20%7D%7B2%7D%0A%5Cend%7Balign%7D%0A"></p>
</div>
</div>
</div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-4-contents" aria-controls="callout-4" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Alternative Proof 3
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-4" class="callout-4-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>We can use the <a href="https://en.wikipedia.org/wiki/Pythagorean_theorem">Pythagorean theorem</a>:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5E2&amp;=%5C%7C%5Ctextbf%7Bp%7D%5C%7C%5E2%20+%20%5C%7C%5Ctextbf%7Ba%7D-%5Ctextbf%7Bp%7D%5C%7C%5E2%20%5C%5C%0A&amp;=%20%5C%7C%5Ctextbf%7Bp%7D%5C%7C%5E2%20+%20(a_x-p_x)%5E2%20+%20(a_y-p_y)%5E2%20%5C%5C%0A&amp;=%20%5C%7C%5Ctextbf%7Bp%7D%5C%7C%5E2%20+%20(a_x%5E2+a_y%5E2)%20+%20(p_x%5E2+p_y%5E2)%20-%202(a_xp_x%20+%20a_yp_y)%20%5C%5C%0A&amp;=%20%5C%7C%5Ctextbf%7Bp%7D%5C%7C%5E2%20+%20%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5E2%20+%20%5C%7C%5Ctextbf%7Bp%7D%5C%7C%5E2%20-%202(a_xp_x%20+%20a_yp_y)%20%5C%5C%0A&amp;=%20%5C%7C%5Ctextbf%7Bp%7D%5C%7C%5E2%20+%20%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5E2%20+%20%5C%7C%5Ctextbf%7Bp%7D%5C%7C%5E2%20-%202%5Ctextbf%7Ba%7D%5Ccdot%5Ctextbf%7Bp%7D%20%5C%5C%0A%5Cend%7Balign%7D%0A"></p>
<p>This gives us the following:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0Aa_xp_x+a_yp_y=%5Ctextbf%7Ba%7D%5Ccdot%5Ctextbf%7Bp%7D=%5C%7C%5Ctextbf%7Bp%7D%5C%7C%5E2%0A"></p>
<p>if we substitute <img src="https://latex.codecogs.com/png.latex?%5Ctextbf%7Bp%7D"> by <img src="https://latex.codecogs.com/png.latex?(%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5Ccos%5Ctheta)%20%5Ctextbf%7Bb%7D">:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5Ccos%5Ctheta(a_xb_x+a_yb_y)=%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5Ccos%5Ctheta(%5Ctextbf%7Ba%7D%5Ccdot%20%5Ctextbf%7Bb%7D)=(%5C%7C%5Ctextbf%7Ba%7D%5C%7C%5Ccos%5Ctheta)%5E2%0A"></p>
<p>which gives back the both geometric and algebraic dot product.</p>
</div>
</div>
</div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-5-contents" aria-controls="callout-5" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Alternative Proof 4
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-5" class="callout-5-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>You can also find more proofs in <a href="https://proofwiki.org/wiki/Cosine_Formula_for_Dot_Product">proofwiki</a>.</p>
</div>
</div>
</div>
</section>
</section>
<section id="the-end" class="level2">
<h2 class="anchored" data-anchor-id="the-end">The End</h2>
<p>I hope you enjoyed this post. You can ask further questions on <a href="https://t.me/swemanml">my telegram channel</a></p>


</section>
</section>

 ]]></description>
  <category>math</category>
  <guid>https://maitbayev.github.io/posts/dot-product/</guid>
  <pubDate>Mon, 13 Jan 2025 00:00:00 GMT</pubDate>
  <media:content url="https://maitbayev.github.io/posts/dot-product/images/image.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Geometric Intuition for Jensen’s Inequality</title>
  <dc:creator>Madiyar Aitbayev</dc:creator>
  <link>https://maitbayev.github.io/posts/jensens-inequality/</link>
  <description><![CDATA[ 





<section id="geometric-intuition-for-jensens-inequality" class="level1">
<h1>Geometric Intuition for Jensen’s Inequality</h1>
<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>Jensen’s inequality is fundamental in many fields, including machine learning and statistics. For example, it is useful in the <a href="https://maitbayev.github.io/posts/denoising-diffusion-probabilistic-models/">diffusion models paper</a> for understanding the variational lower bound. In this post, I will give a simple geometric intuition for Jensen’s inequality.</p>
<p><a href="https://maitbayev.substack.com/subscribe">Subscribe</a> to get a notification about future posts.</p>
<p>Feel free to leave feedback on my <a href="https://t.me/swemanml">telegram channel</a>.</p>
</section>
<section id="setup" class="level2">
<h2 class="anchored" data-anchor-id="setup">Setup</h2>
<p>The post contains collapsed code sections that are used to produce the visualizations. They’re optional, hence collapsed.</p>
<div id="cell-4" class="cell" data-execution_count="1">
<details class="code-fold">
<summary>code for fig_jensen_inequality</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> itertools</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> typing <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Optional</span>
<span id="cb1-3"></span>
<span id="cb1-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> numpy <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> np</span>
<span id="cb1-5"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> plotly.graph_objects <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> go</span>
<span id="cb1-6"></span>
<span id="cb1-7"></span>
<span id="cb1-8"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> alpha_profiles(n: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>):</span>
<span id="cb1-9">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>:</span>
<span id="cb1-10">        space <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.01</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.99</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>)</span>
<span id="cb1-11">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> np.column_stack((space, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> space))</span>
<span id="cb1-12">    space <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.01</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.99</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, (n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>))</span>
<span id="cb1-13">    space_prod <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> itertools.product(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>[space <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> _ <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)])</span>
<span id="cb1-14">    profiles <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.array(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>(space_prod))</span>
<span id="cb1-15">    profiles <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> profiles[np.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>(profiles, axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>]</span>
<span id="cb1-16">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> np.concatenate([profiles, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> np.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>(profiles, axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>).reshape(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)], axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb1-17"></span>
<span id="cb1-18"></span>
<span id="cb1-19"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> fig_jensen_inequality(f, x_range: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>, x: np.array, y_range: Optional[<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>):</span>
<span id="cb1-20">    x_linspace <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(x_range[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>], x_range[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>], <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>)</span>
<span id="cb1-21">    points <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.column_stack([x, f(x)])</span>
<span id="cb1-22">    n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(points)</span>
<span id="cb1-23">    steps <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb1-24">    hull_points <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb1-25">    titles <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb1-26">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> index, alphas <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">enumerate</span>(alpha_profiles(n)):</span>
<span id="cb1-27">        hp <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.average(points, weights<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alphas, axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb1-28">        hull_points.append(hp)</span>
<span id="cb1-29">        title <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">","</span>.join([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">lambda_"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>i <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>a<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:.2f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i, a <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">enumerate</span>(alphas)])</span>
<span id="cb1-30">        title <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"$</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>title<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">$"</span></span>
<span id="cb1-31">        titles.append(title)</span>
<span id="cb1-32">        step <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>index, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>index, method<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"update"</span>,</span>
<span id="cb1-33">                    args<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[{</span>
<span id="cb1-34">                        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span>: [[hp[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>], hp[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]], [hp[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]], [hp[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]]],</span>
<span id="cb1-35">                        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span>: [[f(hp[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]), hp[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]], [hp[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]], [f(hp[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>])]],</span>
<span id="cb1-36">                    }, {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"title"</span>: title}, [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>]])</span>
<span id="cb1-37">        steps.append(step)</span>
<span id="cb1-38">    active_index <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(steps) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb1-39">    sliders <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(active<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(steps) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, steps<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>steps)]</span>
<span id="cb1-40">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> go.Figure(data<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[</span>
<span id="cb1-41">        go.Scatter(</span>
<span id="cb1-42">            name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"f"</span>, x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>x_linspace, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>f(x_linspace), hoverinfo<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"none"</span></span>
<span id="cb1-43">        ),</span>
<span id="cb1-44">        go.Scatter(</span>
<span id="cb1-45">            name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Convex Hull"</span>, x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>np.append(points[:, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>], points[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]),</span>
<span id="cb1-46">            y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>np.append(points[:, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>], points[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]),</span>
<span id="cb1-47">            fillcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"rgba(239, 85, 59, 0.2)"</span>, fill<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"toself"</span>, mode<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"lines"</span>,</span>
<span id="cb1-48">            line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>), hoverinfo<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"none"</span>,</span>
<span id="cb1-49">            showlegend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span></span>
<span id="cb1-50">        ),</span>
<span id="cb1-51">        go.Scatter(</span>
<span id="cb1-52">            x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[hull_points[active_index][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>], hull_points[active_index][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]],</span>
<span id="cb1-53">            y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[f(hull_points[active_index][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]), hull_points[active_index][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]],</span>
<span id="cb1-54">            mode<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"lines"</span>,</span>
<span id="cb1-55">            textposition<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bottom center"</span>,</span>
<span id="cb1-56">            hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"(%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{x:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">, %</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">)&lt;extra&gt;&lt;/extra&gt;"</span>,</span>
<span id="cb1-57">            line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"color"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dash"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dot"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"width"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>},</span>
<span id="cb1-58">            showlegend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span></span>
<span id="cb1-59">        ),</span>
<span id="cb1-60">        go.Scatter(</span>
<span id="cb1-61">            name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"A"</span>,</span>
<span id="cb1-62">            x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[hull_points[active_index][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]],</span>
<span id="cb1-63">            y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[hull_points[active_index][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]],</span>
<span id="cb1-64">            mode<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"markers+text"</span>,</span>
<span id="cb1-65">            text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$(</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">sum </span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">lambda_i x_i, </span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">sum </span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">lambda_i f(x_i))$"</span>],</span>
<span id="cb1-66">            textposition<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"top center"</span>,</span>
<span id="cb1-67">            hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"(%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{x:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">, %</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">)&lt;extra&gt;&lt;/extra&gt;"</span>,</span>
<span id="cb1-68">            marker<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"size"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"color"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span>},</span>
<span id="cb1-69">        ),</span>
<span id="cb1-70">        go.Scatter(</span>
<span id="cb1-71">            name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"B"</span>,</span>
<span id="cb1-72">            x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[hull_points[active_index][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]],</span>
<span id="cb1-73">            y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[f(hull_points[active_index][<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>])],</span>
<span id="cb1-74">            mode<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"markers"</span>,</span>
<span id="cb1-75">            text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"B"</span>],</span>
<span id="cb1-76">            textposition<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bottom center"</span>,</span>
<span id="cb1-77">            hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"(%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{x:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">, %</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">)&lt;extra&gt;&lt;/extra&gt;"</span>,</span>
<span id="cb1-78">            marker<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"size"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"color"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#00CC96"</span>},</span>
<span id="cb1-79">        ),</span>
<span id="cb1-80">        go.Scatter(</span>
<span id="cb1-81">            name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$(x_i, f(x_i))$"</span>,</span>
<span id="cb1-82">            x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>points[:, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>], y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>points[:, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>],</span>
<span id="cb1-83">            mode<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"markers+text"</span>,</span>
<span id="cb1-84">            marker<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"size"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"color"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#ffa15a"</span>},</span>
<span id="cb1-85">            line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"color"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"rgba(239, 85, 59, 0.2)"</span>},</span>
<span id="cb1-86">            text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"$(x_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>i<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">,f(x_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>i<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">))$"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)],</span>
<span id="cb1-87">            textposition<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"top center"</span>,</span>
<span id="cb1-88">            hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"(%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{x:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">, %</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">)&lt;extra&gt;&lt;/extra&gt;"</span>,</span>
<span id="cb1-89">            showlegend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>,</span>
<span id="cb1-90">        ),</span>
<span id="cb1-91">    ], layout<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>go.Layout(</span>
<span id="cb1-92">        title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>titles[active_index],</span>
<span id="cb1-93">        xaxis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(fixedrange<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>x_range),</span>
<span id="cb1-94">        yaxis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(fixedrange<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, scaleanchor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span>, scaleratio<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>y_range),</span>
<span id="cb1-95">        sliders<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>sliders,</span>
<span id="cb1-96">        legend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(</span>
<span id="cb1-97">            yanchor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"top"</span>,</span>
<span id="cb1-98">            xanchor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"right"</span>,</span>
<span id="cb1-99">            x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,</span>
<span id="cb1-100">            y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb1-101">        ),</span>
<span id="cb1-102">        margin<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(l<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, r<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, b<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>)</span>
<span id="cb1-103">    ))</span>
<span id="cb1-104"></span>
<span id="cb1-105"></span>
<span id="cb1-106"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> sample_parabola(x):</span>
<span id="cb1-107">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.15</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span></span>
<span id="cb1-108"></span></code></pre></div></div>
</details>
</div>
<div id="cell-5" class="cell" data-execution_count="2">
<details class="code-fold">
<summary>code for show_sample_jensen_inequality</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> show_sample_jensen_inequality(x: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>):</span>
<span id="cb2-2">    fig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> fig_jensen_inequality(</span>
<span id="cb2-3">        f<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>sample_parabola,</span>
<span id="cb2-4">        x_range<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>],</span>
<span id="cb2-5">        x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>np.array(x),</span>
<span id="cb2-6">        y_range<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">48</span>]</span>
<span id="cb2-7">    )</span>
<span id="cb2-8">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> fig.show(renderer<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"iframe"</span>)</span></code></pre></div></div>
</details>
</div>
</section>
<section id="convex-function" class="level2">
<h2 class="anchored" data-anchor-id="convex-function">Convex Function</h2>
<p>A function is a <strong>convex function</strong> when the line segment joining any two points on the function graph lies above or on the graph. In the simplest term, a convex function is shaped like <img src="https://latex.codecogs.com/png.latex?%5Ccup"> and a <strong>concave function</strong> is shaped like <img src="https://latex.codecogs.com/png.latex?%5Ccap">. If <code>f</code> is convex, then <code>-f</code> is concave.</p>
<p>A visualization from <a href="https://en.wikipedia.org/wiki/Convex_function">Wikipedia</a>:</p>
<div id="cell-7" class="cell" data-execution_count="3">
<details class="code-fold">
<summary>display image from Wikipedia</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> IPython.display <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Image</span>
<span id="cb3-2">Image(url<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'https://upload.wikimedia.org/wikipedia/commons/c/c7/ConvexFunction.svg'</span>, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>)</span></code></pre></div></div>
</details>
<div class="cell-output cell-output-display" data-execution_count="3">
<img src="https://upload.wikimedia.org/wikipedia/commons/c/c7/ConvexFunction.svg" width="400">
</div>
</div>
<section id="definition" class="level3">
<h3 class="anchored" data-anchor-id="definition">Definition</h3>
<p>A function <img src="https://latex.codecogs.com/png.latex?f:%20X%20%5Crightarrow%20%5Cmathbb%7BR%7D"> is called <strong>convex</strong> if the following holds:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0Af(%5Clambda%20x_1%20+%20(1-%5Clambda)%20x_2)%20%5Cle%20%5Clambda%20f(x_1)%20+%20(1-%5Clambda)%20f(x_2)%0A"></p>
<p>and <strong>concave</strong> when:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0Af(%5Clambda%20x_1%20+%20(1-%5Clambda)%20x_2)%20%5Cge%20%5Clambda%20f(x_1)%20+%20(1-%5Clambda)%20f(x_2)%0A"></p>
<p>for all <img src="https://latex.codecogs.com/png.latex?0%20%5Cle%20%5Clambda%20%5Cle%201"> and for all <img src="https://latex.codecogs.com/png.latex?x_1,%20x_2%20%5Cin%20X">.</p>
<p>We will give geometric intuition for this definition in the next section.</p>
</section>
<section id="geometric-intuition" class="level3">
<h3 class="anchored" data-anchor-id="geometric-intuition">Geometric Intuition</h3>
<div id="cell-10" class="cell" data-execution_count="4">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1">show_sample_jensen_inequality(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">22</span>])</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<iframe scrolling="no" width="100%" height="545px" src="iframe_figures/figure_4.html" frameborder="0" allowfullscreen=""></iframe>
</div>
</div>
<p>An interactive visualization of the convex function: <img src="https://latex.codecogs.com/png.latex?f(x)=0.15(x%20-%2015)%5E2%20+%2015">. We will use the same parabola during this post unless stated otherwise. You can use the slider to try different values of (<img src="https://latex.codecogs.com/png.latex?%5Clambda_1">, <img src="https://latex.codecogs.com/png.latex?%5Clambda_2)">, where <img src="https://latex.codecogs.com/png.latex?%5Clambda_1=%5Clambda"> (from the definition) and <img src="https://latex.codecogs.com/png.latex?%5Clambda_2=1-%5Clambda">.</p>
<p>We have a line segment that joins <img src="https://latex.codecogs.com/png.latex?(x_1,%20f(x_1))"> and <img src="https://latex.codecogs.com/png.latex?(x_2,%20f(x_2))">. We can sample any point along the line segment with <img src="https://latex.codecogs.com/png.latex?(%5Clambda_1%20x_1%20+%20%5Clambda_2%20x_2,%20%5Clambda_1%20f(x_1)%20+%20%5Clambda_2%20f(x_2))"> where <img src="https://latex.codecogs.com/png.latex?0%20%5Cle%20%5Clambda_1%20%5Cle%201"> and <img src="https://latex.codecogs.com/png.latex?%5Clambda_2%20=%201%20-%20%5Clambda_1">. For example:</p>
<ul>
<li>When <img src="https://latex.codecogs.com/png.latex?%5Clambda_1=1">, we get the first point</li>
<li>When <img src="https://latex.codecogs.com/png.latex?%5Clambda_1=0">, we get the second point</li>
<li>And when <img src="https://latex.codecogs.com/png.latex?%5Clambda_1=0.5">, we get the middle point of the line segment</li>
<li>and so on… Try the slider above and notice how <img src="https://latex.codecogs.com/png.latex?%5Clambda_1"> and <img src="https://latex.codecogs.com/png.latex?%5Clambda_2"> are changing!</li>
</ul>
<p>This point is visualized with a black point above. Let’s name it as <strong>A</strong>.</p>
<p>The light green point where the function graph intersects with the dotted line segment is represented by: <img src="https://latex.codecogs.com/png.latex?(%5Clambda_1%20x_1%20+%20%5Clambda_2%20x_2,%20f(%5Clambda_1%20x_1%20+%20%5Clambda_2%20x_2))">. Let’s name it as <strong>B</strong>.</p>
<p>Then, the definition above is just asserting that <img src="https://latex.codecogs.com/png.latex?B_y%20%5Cle%20A_y"> and we also have <img src="https://latex.codecogs.com/png.latex?A_x%20=%20B_x">. Note that we are only showing a single line segment, but this statement should be true for all similar line segments and for all <img src="https://latex.codecogs.com/png.latex?0%20%5Cle%20%5Clambda_1%20%5Cle%201">.</p>
</section>
</section>
<section id="jensens-inequality" class="level2">
<h2 class="anchored" data-anchor-id="jensens-inequality">Jensen’s Inequality</h2>
<p>Jensen’s inequality is a generalization of the above convex function definition for more than 2 points.</p>
<section id="definition-1" class="level3">
<h3 class="anchored" data-anchor-id="definition-1">Definition</h3>
<p>Assume we have a <strong>convex function</strong> <img src="https://latex.codecogs.com/png.latex?f"> and <img src="https://latex.codecogs.com/png.latex?x_1,%20x_2,%20%5Ccdots,%20x_n"> in <img src="https://latex.codecogs.com/png.latex?f">’s domain, and also positive weights <img src="https://latex.codecogs.com/png.latex?%5Clambda_1,%20%5Clambda_2,%20%5Ccdots,%20%5Clambda_n"> where <img src="https://latex.codecogs.com/png.latex?%5Csum_%7Bi=1%7D%5En%20%5Clambda_i%20=%201">. Then Jensen’s inequality can be stated as:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0Af(%5Csum_%7Bi=1%7D%5En%20%5Clambda_i%20x_i)%20%5Cle%20%5Csum_%7Bi=1%7D%5En%20%5Clambda_i%20f(x_i)%0A"></p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-1-contents" aria-controls="callout-1" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Concave Function
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-1" class="callout-1-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>The equation is flipped for a <strong>concave function</strong> g:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0Ag(%5Csum_%7Bi=1%7D%5En%20%5Clambda_i%20x_i)%20%5Cge%20%5Csum_%7Bi=1%7D%5En%20%5Clambda_i%20g(x_i)%0A"></p>
</div>
</div>
</div>
<p>Note that we arrive at the same definition for convex function when <img src="https://latex.codecogs.com/png.latex?n=2">.</p>
</section>
<section id="geometric-intuition-1" class="level3">
<h3 class="anchored" data-anchor-id="geometric-intuition-1">Geometric Intuition</h3>
<p>A numerous proofs are already available by other posts. I encourage you to checkout the following resources:</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Jensen%27s_inequality#Proofs">en.wikipedia.org/wiki/Jensen%27s_inequality#Proofs</a></li>
<li><a href="https://brilliant.org/wiki/jensens-inequality/">brilliant.org/wiki/jensens-inequality</a></li>
<li><a href="https://artofproblemsolving.com/wiki/index.php/Jensen%27s_Inequality">artofproblemsolving.com/wiki/…</a></li>
<li><a href="https://www.researchgate.net/publication/252110049_A_Visual_Explanation_of_Jensen's_Inequality">Physics intuition (1993)</a></li>
</ul>
<p>Here I describe a geometric intuition, which resonates more with me.</p>
<section id="triangle" class="level4">
<h4 class="anchored" data-anchor-id="triangle">Triangle</h4>
<p>Let’s start with a triangle, i.e., <img src="https://latex.codecogs.com/png.latex?n=3">:</p>
<div id="cell-16" class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1">show_sample_jensen_inequality(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">27</span>])</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<iframe scrolling="no" width="100%" height="545px" src="iframe_figures/figure_5.html" frameborder="0" allowfullscreen=""></iframe>
</div>
</div>
<p>As before, you can use the slider to try different values of <img src="https://latex.codecogs.com/png.latex?(%5Clambda_1,%20%5Clambda_2,%20%5Clambda_3)"> where <img src="https://latex.codecogs.com/png.latex?%5Clambda_1+%5Clambda_2+%5Clambda_3=1">.</p>
<p>We have a triangle that connects the points: <img src="https://latex.codecogs.com/png.latex?(x_1,%20f(x_1)),%20(x_2,%20f(x_2)),%20(x_3,%20f(x_3))">.</p>
<p>In the <img src="https://latex.codecogs.com/png.latex?n=2"> case, we used <img src="https://latex.codecogs.com/png.latex?%5Clambda_1"> and <img src="https://latex.codecogs.com/png.latex?%5Clambda_2"> to sample a point along the line segment. In this case, it is similar, but we can sample any point inside or on the boundaries of the triangle with:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cleft(%5Clambda_1x_1+%5Clambda_2x_2+%5Clambda_3x_3,%20%5Clambda_1f(x_1)+%5Clambda_2f(x_2)+%5Clambda_3f(x_3)%5Cright)%0A"></p>
<p>where <img src="https://latex.codecogs.com/png.latex?%5Clambda_1+%5Clambda_2+%5Clambda_3=1">. For example:</p>
<ul>
<li>When <img src="https://latex.codecogs.com/png.latex?%5Clambda_i=1"> where <img src="https://latex.codecogs.com/png.latex?i%20%5Cin%20%5C%7B1,%202,%203%5C%7D">, we get the point <img src="https://latex.codecogs.com/png.latex?(x_i,%20f(x_i))"></li>
<li>When <img src="https://latex.codecogs.com/png.latex?%5Clambda_1=%5Clambda_2=%5Clambda_3=%5Cfrac%7B1%7D%7B3%7D">, we get the center of mass of the triangle</li>
</ul>
<p>The black point (named <strong>A</strong>) in the visualization represents this point.</p>
<p>Note that (<img src="https://latex.codecogs.com/png.latex?%5Clambda_1">, <img src="https://latex.codecogs.com/png.latex?%5Clambda_2">, <img src="https://latex.codecogs.com/png.latex?%5Clambda_3">) describes the <a href="https://en.wikipedia.org/wiki/Barycentric_coordinate_system">barycentric coordinate system</a>. You don’t need to know it in this post, just sharing in case you’re already familiar with it.</p>
<p>The light green point where the parabola meets the dotted line segment is represented by:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A(%5Clambda_1x_1+%5Clambda_2x_2+%5Clambda_3x_3,%20f(%5Clambda_1x_1+%5Clambda_2x_2+%5Clambda_3x_3))%0A"></p>
<p>If we name this point as <strong>B</strong>, then it is not difficult to see that Jensen’s inequality is the same as <img src="https://latex.codecogs.com/png.latex?B_y%20%5Cle%20A_y">.</p>
</section>
<section id="four-points-or-more" class="level4">
<h4 class="anchored" data-anchor-id="four-points-or-more">Four Points or More</h4>
<p>It is easy to generalize for <img src="https://latex.codecogs.com/png.latex?n%3E3">. I am adding it here for the sake of completeness:</p>
<div id="cell-20" class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1">show_sample_jensen_inequality(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">13</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">22</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">25</span>])</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<iframe scrolling="no" width="100%" height="545px" src="iframe_figures/figure_6.html" frameborder="0" allowfullscreen=""></iframe>
</div>
</div>
<p>In the general case, <img src="https://latex.codecogs.com/png.latex?(%5Csum_%7Bi=1%7D%5En%20%5Clambda_ix_i,%20%5Csum_%7Bi=1%7D%5En%20%5Clambda_if(x_i))"> describes a point inside or on the boundary of the <a href="https://en.wikipedia.org/wiki/Convex_hull">convex hull</a> enclosing the points: <img src="https://latex.codecogs.com/png.latex?(x_1,%20f(x_1)),%20(x_2,%20f(x_2)),%20%5Ccdots,%20(x_n,%20f(x_n))">. The convex hull is always above or on the convex function graph, which is why Jensen’s inequality holds true.</p>
<p>A few closing notes:</p>
<ul>
<li>The convex hull may have any number of points, including n → ∞</li>
<li>We closely approximate the convex function in some interval with the convex hull as n approaches infinity</li>
<li>The convexity definitions for functions and polygons are the same once we have enough points, i.e., n → ∞</li>
<li>Jensen’s inequality is useful in a probability theory setting, since <img src="https://latex.codecogs.com/png.latex?%5Csum_%7Bi=1%7D%5En%20%5Clambda_i%20=%201">, including the continuous form with n → ∞.</li>
</ul>
</section>
</section>
</section>
<section id="applications" class="level2">
<h2 class="anchored" data-anchor-id="applications">Applications</h2>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-2-contents" aria-controls="callout-2" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>AM–GM inequality
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-2" class="callout-2-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>The <strong>arithmetic mean-geometric mean</strong> inequality (<a href="https://en.wikipedia.org/wiki/AM%E2%80%93GM_inequality">AM-GM inequality</a>) states that: <img src="https://latex.codecogs.com/png.latex?%0A%5Cfrac%7Bx_1+x_2+%5Ccdots+x_n%7D%7Bn%7D%20%5Cge%20%5Csqrt%5Bn%5D%7Bx_1x_2%5Ccdots%20x_n%7D%0A"></p>
<p>Let’s prove with Jensen’s inequality by rewriting the above with <img src="https://latex.codecogs.com/png.latex?%5Clambda_1=%5Clambda_2=%5Ccdots=%5Clambda_n=%5Cfrac%7B1%7D%7Bn%7D">:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Csum_%7Bi=1%7D%5En%20%5Clambda_i%20x_i%20%5Cge%20%5Cprod_%7Bi=1%7D%5En%20x_i%5E%7B%5Clambda_i%7D%0A"></p>
<p>Since <code>log</code> is a concave and monotonic function, we can apply <code>log</code> to both sides.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Clog(%5Csum_%7Bi=1%7D%5En%20%5Clambda_i%20x_i)%20%5Cge%20%5Clog(%5Cprod_%7Bi=1%7D%5En%20x_i%5E%7B%5Clambda_i%7D)%20=%20%5Csum_%7Bi=1%7D%5En%20%5Clambda_i%20%5Clog(x_i)%0A"></p>
<p>The above equation is valid due to Jensen’s inequality. Note that the same proof works for the weighted version since the proof does not rely on the fact that <img src="https://latex.codecogs.com/png.latex?%5Clambda_i=%5Cfrac%7B1%7D%7Bn%7D"> for all <img src="https://latex.codecogs.com/png.latex?i=1,2,%5Ccdots,n">.</p>
</div>
</div>
</div>
</section>
<section id="the-end" class="level2">
<h2 class="anchored" data-anchor-id="the-end">The End</h2>
<p>I hope you enjoyed this post. You can ask further questions on <a href="https://t.me/swemanml">my telegram channel</a>.</p>
<p><a href="https://maitbayev.substack.com/subscribe">Subscribe</a> to get a notification about future posts.</p>


</section>
</section>

 ]]></description>
  <category>convex function</category>
  <category>jensen</category>
  <guid>https://maitbayev.github.io/posts/jensens-inequality/</guid>
  <pubDate>Sat, 04 Jan 2025 00:00:00 GMT</pubDate>
  <media:content url="https://maitbayev.github.io/posts/jensens-inequality/images/image.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Why does L1 regularization encourage coefficients to shrink to zero?</title>
  <dc:creator>Madiyar Aitbayev</dc:creator>
  <link>https://maitbayev.github.io/posts/why-l1-loss-encourage-coefficients-to-shrink-to-zero/</link>
  <description><![CDATA[ 





<section id="why-does-l1-regularization-encourage-coefficients-to-shrink-to-zero" class="level1">
<h1>Why does L1 regularization encourage coefficients to shrink to zero?</h1>
<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>Regularization is a common method for dealing with overfitting in Machine Learning (ML). The simplest and most widely used methods are L1 (Lasso) and L2 (Ridge). The L1 and L2 regularizations are well covered in numerous tutorials and books. However, I could not find any good geometric or intuitive explanation of why L1 encourages coefficients to shrink to zero. This post tries to address this.</p>
<p>The post contains collapsed code sections that are used to produce the visualizations. They’re optional, hence collapsed.</p>
<p>Feel free to leave feedback on my <a href="https://t.me/swemanml">telegram channel</a>.</p>
<p><a href="https://maitbayev.substack.com/subscribe">Subscribe</a> to get a notification about future posts.</p>
</section>
<section id="recap" class="level2">
<h2 class="anchored" data-anchor-id="recap">Recap</h2>
<section id="the-lasso" class="level3">
<h3 class="anchored" data-anchor-id="the-lasso">The Lasso</h3>
<p>The lasso regression is a linear regression model that shrinks the coefficients by imposing a constraint on their magnitude. Namely, it constrains the sum of absolute values of the coefficients:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%20%20%5Chat%7B%5Cbeta%7D%5E%7Blasso%7D%20=%20%5Cunderset%7B%5Cbeta%7D%7Bargmin%7D%20&amp;%20%5Csum_%7Bi=1%7D%5EN%20%5Cleft(%20y_i-%5Cbeta_0-%5Csum_%7Bj=1%7D%5Ep%7Bx_%7Bij%7D%5Cbeta_j%7D%20%5Cright)%5E2%5C%5C%0A%20%20%20%5Ctext%7B%20subject%20to%20%7D%20&amp;%20%5Csum_%7Bj=1%7D%5Ep%7C%5Cbeta_j%7C%20%5Cle%20t%0A%5Cend%7Balign%7D%0A"></p>
<p>The above equation is the same equation (3.51) from “The Elements of Statistical Learning” (ESL) book by Hastie, Tibshirani, and Friedman.</p>
<p>We can also write the lasso in the equivalent Lagrangian form (3.52), which penalizes the sum of the absolute values of the coefficients:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Chat%7B%5Cbeta%7D%5E%7Blasso%7D%20=%20%5Cunderset%7B%5Cbeta%7D%7Bargmin%7D%0A%5Cleft%5C%7B%0A%20%20%20%20%5Cfrac%7B1%7D%7B2%7D%5Csum_%7Bi=1%7D%5EN%20%5Cleft(%20y_i-%5Cbeta_0-%5Csum_%7Bj=1%7D%5Ep%7Bx_%7Bij%7D%5Cbeta_j%7D%20%5Cright)%5E2%0A%20%20%20%20+%5Clambda%5Csum_%7Bj=1%7D%5Ep%7C%5Cbeta_j%7C%0A%5Cright%5C%7D%0A"></p>
<p>The equations (3.51) and (3.52) are equivalent under the correct <img src="https://latex.codecogs.com/png.latex?%5Clambda"> and <img src="https://latex.codecogs.com/png.latex?t"> hyperparameters. The latter equation (3.52) is more preferred in ML.</p>
<p>Making <img src="https://latex.codecogs.com/png.latex?t"> sufficiently small will shrink some of the coefficients to be exactly zero, which we will give geometric intuition later. Thus, the lasso could be used for feature selection, i.e., for identifying less important features.</p>
</section>
<section id="the-ridge" class="level3">
<h3 class="anchored" data-anchor-id="the-ridge">The Ridge</h3>
<p>The ridge regression is similar to the lasso except it penalizes the sum-of-squares of the coefficients (3.41):</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Chat%7B%5Cbeta%7D%5E%7Bridge%7D%20=%20%5Cunderset%7B%5Cbeta%7D%7Bargmin%7D%0A%5Cleft%5C%7B%0A%20%20%20%20%5Cfrac%7B1%7D%7B2%7D%5Csum_%7Bi=1%7D%5EN%20%5Cleft(%20y_i-%5Cbeta_0-%5Csum_%7Bj=1%7D%5Ep%7Bx_%7Bij%7D%5Cbeta_j%7D%20%5Cright)%5E2%0A%20%20%20%20+%5Clambda%5Csum_%7Bj=1%7D%5Ep%5Cbeta_j%5E2%0A%5Cright%5C%7D%0A"></p>
<p>An equivalent way to write the ridge problem is (3.42):</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%20%20%5Chat%7B%5Cbeta%7D%5E%7Bridge%7D%20=%20%5Cunderset%7B%5Cbeta%7D%7Bargmin%7D%20&amp;%20%5Csum_%7Bi=1%7D%5EN%20%5Cleft(%20y_i-%5Cbeta_0-%5Csum_%7Bj=1%7D%5Ep%7Bx_%7Bij%7D%5Cbeta_j%7D%20%5Cright)%5E2%5C%5C%0A%20%20%20%5Ctext%7B%20subject%20to%20%7D%20&amp;%20%5Csum_%7Bj=1%7D%5Ep%5Cbeta_j%5E2%20%5Cle%20t%0A%5Cend%7Balign%7D%0A"></p>
<p>The ridge regression will shrink the coefficient towards zero when <img src="https://latex.codecogs.com/png.latex?t"> is sufficiently small; however, the coefficients might not be exactly zero.</p>
</section>
</section>
<section id="ridge-vs-lasso" class="level2">
<h2 class="anchored" data-anchor-id="ridge-vs-lasso">Ridge vs Lasso</h2>
<section id="prior-expalanations" class="level3">
<h3 class="anchored" data-anchor-id="prior-expalanations">Prior expalanations</h3>
<p>The best post I found so far is <a href="https://explained.ai/regularization/">https://explained.ai/regularization</a>, which explains the difference between L1 and L2 empirically by simulating random loss functions. I really encourage you to check out the tutorial.</p>
<p>Another explanation is given by the amazing The Elements of Statistical Learning book:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://maitbayev.github.io/posts/why-l1-loss-encourage-coefficients-to-shrink-to-zero/index_files/figure-html/c3cc4461-96b0-4679-9ed4-502e07f77705-1-2a379c1d-06a0-433b-85c1-05d8fc574fe3.png" class="img-fluid figure-img"></p>
<figcaption>Figure 3.11</figcaption>
</figure>
</div>
<p>The constraint region for L2 is the disk <img src="https://latex.codecogs.com/png.latex?%5Cbeta_1%5E2+%5Cbeta_2%5E2%20%5Cle%20t"> (right figure), while it is the diamond <img src="https://latex.codecogs.com/png.latex?%7C%5Cbeta_1%7C+%7C%5Cbeta_2%7C%20%5Cle%20t"> for L1 (left figure). Both methods find the first intersection point between the elliptical contours (loss) and the constrained region. The corners of the diamond have one parameter equal to zero. The diamond becomes a rhomboid in higher dimensional space, and has many corners; there are many more opportunities to intersect at the corners.</p>
<p>There are cool algebraic explanations as well, for example, given here <a href="https://www.reddit.com/r/MachineLearning/comments/1771jhl/d_how_does_l1_regularization_able_to_drive_a/">https://www.reddit.com/r/MachineLearning/…</a>.</p>
<p>The explanations given by the book and other places are well-contained, but I could not fully grasp what’s so special about the corners w.r.t the other points on the edges. There are only 4 corners and unlimited points on the edges, so shouldn’t the probability to touch the other points be higher?</p>
</section>
</section>
<section id="geometric-explanation" class="level2">
<h2 class="anchored" data-anchor-id="geometric-explanation">Geometric Explanation</h2>
<section id="setup" class="level3">
<h3 class="anchored" data-anchor-id="setup">Setup</h3>
<p>We will use a simple loss function that illustrates circle contours instead of elliptical ones.:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0ALoss(%5Cbeta_1,%5Cbeta_2%20%7C%20c_x,%20c_y)=2%7B(%5Cbeta_1%20-%20c_x)%7D%5E2%20+%202%7B(%5Cbeta_2%20-%20c_y)%7D%5E2%20+%20100%0A"></p>
<p>Once we understand the intution for circles, it is easy to extend to other contours such as elliptical ones. We will use <img src="https://latex.codecogs.com/png.latex?c_x=15"> and <img src="https://latex.codecogs.com/png.latex?c_y=5"> most of the time.</p>
<div id="73f5c18b-2e70-4e85-a345-a0ad3ea503aa" class="cell" data-execution_count="1">
<details class="code-fold">
<summary>code for loss setup and helper functions</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> enum <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Enum</span>
<span id="cb1-2"></span>
<span id="cb1-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> mpl_toolkits.mplot3d.art3d <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> art3d</span>
<span id="cb1-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> numpy <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> np</span>
<span id="cb1-5"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> matplotlib <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> animation</span>
<span id="cb1-6"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> matplotlib <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb1-7"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> matplotlib.patches <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Circle, Polygon</span>
<span id="cb1-8"></span>
<span id="cb1-9"></span>
<span id="cb1-10"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> loss(b0, b1, cx, cy, scale<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.0</span>, bias<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>):</span>
<span id="cb1-11">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> scale <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (b0 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> cx) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> scale <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (b1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> cy) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> bias</span>
<span id="cb1-12"></span>
<span id="cb1-13"></span>
<span id="cb1-14"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">class</span> Reg(Enum):</span>
<span id="cb1-15">    L1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb1-16">    L2 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb1-17"></span>
<span id="cb1-18"></span>
<span id="cb1-19"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> make_reg_shape(reg: Reg, t: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"k"</span>):</span>
<span id="cb1-20">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> reg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> Reg.L1:</span>
<span id="cb1-21">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> Polygon(xy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[(t, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>), (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, t), (<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>t, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>), (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>t)], color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>color, fill<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>, linestyle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'--'</span>)</span>
<span id="cb1-22">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb1-23">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> Circle(xy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>), radius<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>color, fill<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>, linestyle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'--'</span>)</span>
<span id="cb1-24"></span>
<span id="cb1-25"></span>
<span id="cb1-26"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> argmin_within_constraint(reg: Reg, t: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>):</span>
<span id="cb1-27">    beta0 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>beta_range, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>)</span>
<span id="cb1-28">    beta1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>beta_range, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>)</span>
<span id="cb1-29">    B0, B1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.meshgrid(beta0, beta1)</span>
<span id="cb1-30">    Z <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> loss(B0, B1, cx<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cx, cy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cy)</span>
<span id="cb1-31">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> reg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> Reg.L1:</span>
<span id="cb1-32">        mask <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">abs</span>(B0) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> np.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">abs</span>(B1) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;=</span> t</span>
<span id="cb1-33">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb1-34">        mask <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> B0 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> B0 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> B1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> B1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;=</span> t <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> t</span>
<span id="cb1-35">    index <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.argmin(Z[mask])</span>
<span id="cb1-36">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> B0[mask][index], B1[mask][index]</span>
<span id="cb1-37"></span>
<span id="cb1-38"></span>
<span id="cb1-39">beta_range <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span></span>
<span id="cb1-40">cx, cy <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span></span>
<span id="cb1-41">vmax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1000</span></span></code></pre></div></div>
</details>
</div>
<div id="f734e558-d263-4eb4-8e00-c84566b2dc92" class="cell" data-execution_count="2">
<details class="code-fold">
<summary>code for plot3d</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> base_fig3():</span>
<span id="cb2-2">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Create a figure and a 3D Axes</span></span>
<span id="cb2-3">    fig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.figure(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>))</span>
<span id="cb2-4">    ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> fig.add_subplot(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">111</span>, projection<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'3d'</span>)</span>
<span id="cb2-5">    ax.set_xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">beta_1$"</span>, labelpad<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb2-6">    ax.set_ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">beta_2$"</span>, labelpad<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb2-7">    ax.set_zlim(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">500</span>)</span>
<span id="cb2-8">    ax.tick_params(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'x'</span>, pad<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb2-9">    ax.tick_params(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'y'</span>, pad<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb2-10">    ax.set_xlim(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>beta_range)</span>
<span id="cb2-11">    ax.set_ylim(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>beta_range)</span>
<span id="cb2-12">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># draw axes</span></span>
<span id="cb2-13">    ax.plot(beta_range, [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>], color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'k'</span>)</span>
<span id="cb2-14">    ax.plot([<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>], beta_range, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'k'</span>)</span>
<span id="cb2-15">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> fig, ax</span>
<span id="cb2-16"></span>
<span id="cb2-17"></span>
<span id="cb2-18"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> plot3d(reg: Reg, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>):</span>
<span id="cb2-19">    fig, ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> base_fig3()</span>
<span id="cb2-20"></span>
<span id="cb2-21">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># surface</span></span>
<span id="cb2-22">    beta0 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>beta_range, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>)</span>
<span id="cb2-23">    beta1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>beta_range, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>)</span>
<span id="cb2-24">    B0, B1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.meshgrid(beta0, beta1)</span>
<span id="cb2-25">    Z <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> loss(B0, B1, cx<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cx, cy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cy)</span>
<span id="cb2-26">    ax.plot_surface(B0, B1, Z, alpha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span>, cmap<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'coolwarm'</span>, vmax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>vmax)</span>
<span id="cb2-27"></span>
<span id="cb2-28">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># contours</span></span>
<span id="cb2-29">    ax.plot([cx], [cy], marker<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'x'</span>, markersize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'black'</span>)</span>
<span id="cb2-30">    ax.contour(B0, B1, Z, levels<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, linewidths<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">.5</span>, cmap<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'coolwarm'</span>, zdir<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'z'</span>, offset<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, vmax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>vmax)</span>
<span id="cb2-31">    </span>
<span id="cb2-32">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># minima within regularization shape</span></span>
<span id="cb2-33">    mx, my <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> argmin_within_constraint(reg, t)</span>
<span id="cb2-34">    ax.plot([mx], [my], marker<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'.'</span>, markersize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'r'</span>)</span>
<span id="cb2-35"></span>
<span id="cb2-36">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># regularization contraints</span></span>
<span id="cb2-37">    reg_shape <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> make_reg_shape(reg, t, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span>)</span>
<span id="cb2-38">    ax.add_patch(reg_shape)</span>
<span id="cb2-39">    art3d.pathpatch_2d_to_3d(reg_shape, z<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb2-40"></span>
<span id="cb2-41">    ax.view_init(elev<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">39</span>, azim<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">106</span>)</span>
<span id="cb2-42">    plt.tight_layout()</span>
<span id="cb2-43">    plt.show()</span></code></pre></div></div>
</details>
</div>
<p>Let’s visualize our loss <img src="https://latex.codecogs.com/png.latex?2%7B(%5Cbeta_1%20-%2015)%7D%5E2%20+%202%7B(%5Cbeta_2%20-%205)%7D%5E2%20+%20100"> with the L1 constaint <img src="https://latex.codecogs.com/png.latex?t=5">, i.e., <img src="https://latex.codecogs.com/png.latex?%7C%5Cbeta_1%7C%20+%20%7C%5Cbeta_2%7C%20%5Cle%205"> in 3D:</p>
<div id="89759d16-a4fd-41e6-bbf2-ec803757e639" class="cell" data-execution_count="3">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1">plot3d(Reg.L1, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://maitbayev.github.io/posts/why-l1-loss-encourage-coefficients-to-shrink-to-zero/index_files/figure-html/cell-4-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
</div>
<p>In Lasso Regression, we’re looking for <img src="https://latex.codecogs.com/png.latex?%5Cbeta_1"> and <img src="https://latex.codecogs.com/png.latex?%5Cbeta_2"> within the diamond that has the lowest loss, which is marked with the red point in the figure above. The global minima without any constraint is marked with “x”.</p>
<p>The same visualization but with the L2 constraint t=5, i.e., <img src="https://latex.codecogs.com/png.latex?%5Cbeta_1%5E2+%5Cbeta_2%5E2%20%5Cle%205%5E2">:</p>
<div id="1d94122b-e005-4fb7-954c-00b424de6af7" class="cell" data-execution_count="4">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1">plot3d(Reg.L2, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://maitbayev.github.io/posts/why-l1-loss-encourage-coefficients-to-shrink-to-zero/index_files/figure-html/cell-5-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
</div>
<p>The corresponding 2D visualizations that are similar to the ones given by the Elements of Statistical Learning book:</p>
<div id="137f4e2a-1089-4378-b1fd-6c9048145602" class="cell" data-execution_count="5">
<details class="code-fold">
<summary>code for plot2d</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> loss_contour(ax):</span>
<span id="cb5-2">    beta0 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>beta_range, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>)</span>
<span id="cb5-3">    beta1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>beta_range, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>)</span>
<span id="cb5-4">    B0, B1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.meshgrid(beta0, beta1)</span>
<span id="cb5-5">    Z <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> loss(B0, B1, cx<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cx, cy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cy)</span>
<span id="cb5-6"></span>
<span id="cb5-7">    ax.contour(B0, B1, Z, levels<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, linewidths<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">.5</span>, cmap<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'coolwarm'</span>, vmax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>vmax)</span>
<span id="cb5-8">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># draw the global minima</span></span>
<span id="cb5-9">    ax.plot([cx], [cy], marker<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'x'</span>, markersize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'black'</span>)</span>
<span id="cb5-10"></span>
<span id="cb5-11"></span>
<span id="cb5-12"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> ax2d_init(ax):</span>
<span id="cb5-13">    ax.set_aspect(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'equal'</span>)</span>
<span id="cb5-14">    ax.set_xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">beta_1$"</span>, labelpad<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb5-15">    ax.set_ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\\</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">beta_2$"</span>, labelpad<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb5-16">    ax.tick_params(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'x'</span>, pad<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb5-17">    ax.tick_params(axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'y'</span>, pad<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb5-18">    ax.set_xlim(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>beta_range)</span>
<span id="cb5-19">    ax.set_ylim(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>beta_range)</span>
<span id="cb5-20"></span>
<span id="cb5-21">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># draw axes</span></span>
<span id="cb5-22">    ax.axhline(y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'k'</span>)</span>
<span id="cb5-23">    ax.axvline(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'k'</span>)</span>
<span id="cb5-24"></span>
<span id="cb5-25"></span>
<span id="cb5-26"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> plot2d(regs: [Reg], t: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>):</span>
<span id="cb5-27">    fig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.figure(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(regs), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>))</span>
<span id="cb5-28">    axes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> fig.subplots(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(regs))</span>
<span id="cb5-29">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> ax <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> axes:</span>
<span id="cb5-30">        ax2d_init(ax)</span>
<span id="cb5-31">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> reg, ax <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">zip</span>(regs, axes):</span>
<span id="cb5-32">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># draw the regularization safe region</span></span>
<span id="cb5-33">        ax.add_patch(make_reg_shape(reg<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>reg, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t))</span>
<span id="cb5-34">        loss_contour(ax)</span>
<span id="cb5-35">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># draw minima within constraint</span></span>
<span id="cb5-36">        mx, my <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> argmin_within_constraint(reg, t)</span>
<span id="cb5-37">        ax.plot([mx], [my], marker<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'.'</span>, markersize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'r'</span>)</span>
<span id="cb5-38">    plt.tight_layout()</span>
<span id="cb5-39">    plt.show()</span></code></pre></div></div>
</details>
</div>
<div id="f86d42f0-b328-4e6d-b36d-093fbe6ee066" class="cell" data-scrolled="true" data-execution_count="6">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1">plot2d([Reg.L1, Reg.L2], t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://maitbayev.github.io/posts/why-l1-loss-encourage-coefficients-to-shrink-to-zero/index_files/figure-html/cell-7-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
</div>
</section>
<section id="explanation" class="level3">
<h3 class="anchored" data-anchor-id="explanation">Explanation</h3>
<p>In both cases (L1, L2), we’re looking for a contour that just touches the constraint region. For example, when we have the following case:</p>
<div id="68b0dd14-9a66-407d-8e63-2cc159e3382a" class="cell" data-execution_count="7">
<details class="code-fold">
<summary>code for plot_reg_and_circle</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb7-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> plot_reg_and_circle(reg: Reg, t: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, cx: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, cy: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, radius: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>):</span>
<span id="cb7-2">    fig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.figure(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>))</span>
<span id="cb7-3">    ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> fig.add_subplot()</span>
<span id="cb7-4">    ax2d_init(ax)</span>
<span id="cb7-5">    ax.add_patch(Circle(xy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(cx, cy), radius<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>radius, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'b'</span>, fill<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>))</span>
<span id="cb7-6">    ax.add_patch(make_reg_shape(reg, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t))</span>
<span id="cb7-7">    plt.tight_layout()</span>
<span id="cb7-8">    plt.show()</span></code></pre></div></div>
</details>
</div>
<div id="a2d824d3-7d59-4b62-ae3d-55181c169527" class="cell" data-execution_count="8">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb8-1">plot_reg_and_circle(Reg.L1, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, cx<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, cy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, radius<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://maitbayev.github.io/posts/why-l1-loss-encourage-coefficients-to-shrink-to-zero/index_files/figure-html/cell-9-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
</div>
<p>Then it is more optimal to reduce the constraint region (i.e., the diamond) until they touch in a single point as shown below. Note that a contour has the same loss along its points.</p>
<div id="3fc2a0e8-cd8f-4373-8346-80f203ee3e2a" class="cell" data-execution_count="9">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb9-1">plot_reg_and_circle(Reg.L1, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(np.sqrt(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.sqrt(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>), cx<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, cy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, radius<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><img src="https://maitbayev.github.io/posts/why-l1-loss-encourage-coefficients-to-shrink-to-zero/index_files/figure-html/cell-10-output-1.png" class="img-fluid figure-img"></p>
</figure>
</div>
</div>
</div>
<p>When does the Lasso pick the corner of the diamond over any other point on the edges? To simplify our problem, let’s fix a specific circle among the contours: a circle with a fixed radius <img src="https://latex.codecogs.com/png.latex?r">. Now, we want to come up with a formula that gives the probability of a random tangent circle with radius <img src="https://latex.codecogs.com/png.latex?r"> touching our diamond at the corners versus at any other points.</p>
<p>The above problem becomes much simpler with a visualization:</p>
<div id="dc8c09ed-6cea-4a39-873b-194e3079409e" class="cell" data-execution_count="10">
<details class="code-fold">
<summary>code for html5_video_l1_tangent_circles</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb10-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> l1_tangent_circle_locations(t: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, radius: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>[np.array]:</span>
<span id="cb10-2">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> is_corner(v):</span>
<span id="cb10-3">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">min</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">abs</span>(v[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]), <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">abs</span>(v[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>])) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;=</span> radius <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> np.sqrt(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1e-3</span></span>
<span id="cb10-4"></span>
<span id="cb10-5">    vertices <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> make_reg_shape(Reg.L1, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> np.sqrt(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> radius).get_path().interpolated(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>).vertices</span>
<span id="cb10-6">    vertices <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> vertices.tolist()</span>
<span id="cb10-7">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">while</span> is_corner(vertices[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]):</span>
<span id="cb10-8">        vertices.insert(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, vertices.pop())</span>
<span id="cb10-9">    vertices.reverse()</span>
<span id="cb10-10">    locations <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb10-11">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>):</span>
<span id="cb10-12">        should_be_corner <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> i <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span></span>
<span id="cb10-13">        group <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb10-14">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">while</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(vertices) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">and</span> is_corner(vertices[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> should_be_corner:</span>
<span id="cb10-15">            v <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> vertices.pop()</span>
<span id="cb10-16">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> should_be_corner:</span>
<span id="cb10-17">                <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">abs</span>(v[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">abs</span>(v[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]):</span>
<span id="cb10-18">                    corner <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, np.sign(v[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> t]</span>
<span id="cb10-19">                <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb10-20">                    corner <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [np.sign(v[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> t, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb10-21"></span>
<span id="cb10-22">                vec <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.array(v) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> np.array(corner)</span>
<span id="cb10-23">                vec <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (vec <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> np.linalg.norm(vec)) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> radius</span>
<span id="cb10-24">                group.append(corner <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> vec)</span>
<span id="cb10-25">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb10-26">                group.append(v)</span>
<span id="cb10-27">        locations.append(np.array(group))</span>
<span id="cb10-28">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> locations</span>
<span id="cb10-29"></span>
<span id="cb10-30"></span>
<span id="cb10-31"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> l2_tangent_circle_locations(t: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, radius: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>[np.array]:</span>
<span id="cb10-32">    angles <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.pi, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span>)</span>
<span id="cb10-33">    vertices <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.column_stack([np.cos(angles), np.sin(angles)]) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (t <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> radius) </span>
<span id="cb10-34">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> [vertices]</span>
<span id="cb10-35"></span>
<span id="cb10-36"></span>
<span id="cb10-37"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> animate_tangent_circle_trajectories(reg: Reg, t: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, radius: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>):</span>
<span id="cb10-38">    fig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.figure(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>))</span>
<span id="cb10-39">    ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> fig.add_subplot()</span>
<span id="cb10-40">    ax2d_init(ax)</span>
<span id="cb10-41">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> reg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> Reg.L1:</span>
<span id="cb10-42">        diamond <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> make_reg_shape(Reg.L1, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t)</span>
<span id="cb10-43">        circle_locations <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> l1_tangent_circle_locations(t, radius)</span>
<span id="cb10-44">        plots <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb10-45">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i, locations <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">enumerate</span>(circle_locations):</span>
<span id="cb10-46">            color <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'g'</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> i <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'b'</span></span>
<span id="cb10-47">            plots.append(ax.plot([], [], color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>color, linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>])</span>
<span id="cb10-48">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb10-49">        circle_locations <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> l2_tangent_circle_locations(t, radius)</span>
<span id="cb10-50">        plots <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [ax.plot([], [], color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'b'</span>, linewidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]]</span>
<span id="cb10-51">    </span>
<span id="cb10-52">    circle <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> Circle(xy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(t <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> radius, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>), radius<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>radius, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'g'</span>, fill<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb10-53">    ax.add_patch(circle)</span>
<span id="cb10-54">    ax.add_patch(make_reg_shape(reg, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t))</span>
<span id="cb10-55"></span>
<span id="cb10-56">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> update(frame):</span>
<span id="cb10-57">        remaining <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> frame</span>
<span id="cb10-58">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> plot, locations <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">zip</span>(plots, circle_locations):</span>
<span id="cb10-59">            need <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">min</span>(remaining, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(locations))</span>
<span id="cb10-60">            remaining <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-=</span> need</span>
<span id="cb10-61">            plot.set_xdata(locations[:need, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>])</span>
<span id="cb10-62">            plot.set_ydata(locations[:need, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>])</span>
<span id="cb10-63">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> remaining <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">and</span> need <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>:</span>
<span id="cb10-64">                last <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> locations[need <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]</span>
<span id="cb10-65">                circle.set_center(last)</span>
<span id="cb10-66">                circle.set_color(plot.get_color())</span>
<span id="cb10-67"></span>
<span id="cb10-68">    num_frames <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>([<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(l) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> l <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> circle_locations])</span>
<span id="cb10-69">    plt.tight_layout()</span>
<span id="cb10-70">    ani <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> animation.FuncAnimation(fig, func<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>update, frames<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, num_frames, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>), interval<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>)</span>
<span id="cb10-71">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> ani</span>
<span id="cb10-72"></span>
<span id="cb10-73"></span>
<span id="cb10-74"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> html5_video_tangent_circle_trajectories(reg: Reg, t: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, radius: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>):</span>
<span id="cb10-75">    ani <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> animate_tangent_circle_trajectories(reg, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t, radius<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>radius)</span>
<span id="cb10-76">    html <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ani.to_html5_video()</span>
<span id="cb10-77">    plt.close()</span>
<span id="cb10-78">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> html</span></code></pre></div></div>
</details>
</div>
<div id="55ee58c2-c141-4c3d-8ff1-fc8dc46ad220" class="cell" data-execution_count="11">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb11-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> IPython.display <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> HTML</span>
<span id="cb11-2">HTML(html5_video_tangent_circle_trajectories(Reg.L1, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, radius<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>))</span></code></pre></div></div>
<div class="cell-output cell-output-display" data-execution_count="11">
<video width="400" height="400" controls="" autoplay="" loop="">
  <source type="video/mp4" src="data:video/mp4;base64,AAAAIGZ0eXBNNFYgAAACAE00ViBpc29taXNvMmF2YzEAAAAIZnJlZQAArJdtZGF0AAACrwYF//+r
3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2NCByMzEwOCAzMWUxOWY5IC0gSC4yNjQvTVBF
Ry00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAyMyAtIGh0dHA6Ly93d3cudmlkZW9sYW4u
b3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFs
eXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVk
X3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBk
ZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEy
IGxvb2thaGVhZF90aHJlYWRzPTIgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50
ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBi
X3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29w
PTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0yNSBzY2VuZWN1dD00MCBpbnRyYV9y
ZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9MSBjcmY9MjMuMCBxY29tcD0w
LjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAA
EH5liIQAM//+9uy+BTX9n9CXESzF2kpwPiqkgIB3NMAAAAMADZX958FGL9QF4pa0gXMUOlMI3oS/
raSUHPbq+8D6W4d6exOsyrAwne0SLGnZgwzIg/ojaXIpk3x6JGfeWxLxJO7P4hGKfy4uQPTq+RFJ
kJiC8VBlx+q+PDqZjnmSyhxE4ED8e5kGOY2Mfm2JN2TK4UTETIzQXglEf/BhP0fGi+nn1LFPiB1d
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
">
  Your browser does not support the video tag.
</video>
</div>
</div>
<p>The animation above illustrates all tangent circle trajectories. The circle is green when it touches the diamond at the corners, and it is blue when it touches at other points. The total length of all blue (touching at other points) trajectories is given by <img src="https://latex.codecogs.com/png.latex?4%5Ctimes%20%5Csqrt%7B2%7D%5Ctimes%20t">, while the total length of all green (touching at the corners) trajectories is given by <img src="https://latex.codecogs.com/png.latex?2%5Cpi%20%5Ctimes%20r">, where <code>t</code> is the constraint and <code>r</code> is the radius of the circle. This means that it is likely to touch at the corners when <code>t</code> is sufficiently small or <code>r</code> is sufficiently high. We illustrate one of the such cases below:</p>
<div id="6baa7f75-89c4-4604-b9b1-5484bf3e3a58" class="cell" data-execution_count="12">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb12-1">HTML(html5_video_tangent_circle_trajectories(Reg.L1, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, radius<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>))</span></code></pre></div></div>
<div class="cell-output cell-output-display" data-execution_count="12">
<video width="400" height="400" controls="" autoplay="" loop="">
  <source type="video/mp4" src="data:video/mp4;base64,AAAAIGZ0eXBNNFYgAAACAE00ViBpc29taXNvMmF2YzEAAAAIZnJlZQAA11dtZGF0AAACrwYF//+r
3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2NCByMzEwOCAzMWUxOWY5IC0gSC4yNjQvTVBF
Ry00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAyMyAtIGh0dHA6Ly93d3cudmlkZW9sYW4u
b3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFs
eXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVk
X3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBk
ZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEy
IGxvb2thaGVhZF90aHJlYWRzPTIgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50
ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBi
X3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29w
PTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0yNSBzY2VuZWN1dD00MCBpbnRyYV9y
ZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9MSBjcmY9MjMuMCBxY29tcD0w
LjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAA
D+tliIQAM//+9uy+BTX9n9CXESzF2kpwPiqkgIB3NMAAAAMADZX958FGL9QF4pa0gXMUOlMI3oS/
raSUHPbq+8D6W4d6exOsyrAwne0SLGnZgwzIg/ojaXIpk3x6JGfeWxLxJO7P4hGKfy4uQPTq+RFJ
kJiC8VBlx+q+PDqZjnmSyhxE4ED8e5kGOY2Mfm2JN2TK4UTETIzQXglEf/BhP0fGi+nn1LFPiB1d
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
">
  Your browser does not support the video tag.
</video>
</div>
</div>
<p>In Ridge (L2), we don’t have special points like corners, and all points along the disk have the same probability of touching a random tangent circle with radius <img src="https://latex.codecogs.com/png.latex?r">:</p>
<div id="de004256" class="cell" data-execution_count="13">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb13" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb13-1">HTML(html5_video_tangent_circle_trajectories(Reg.L2, t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, radius<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>))</span></code></pre></div></div>
<div class="cell-output cell-output-display" data-execution_count="13">
<video width="400" height="400" controls="" autoplay="" loop="">
  <source type="video/mp4" src="data:video/mp4;base64,AAAAIGZ0eXBNNFYgAAACAE00ViBpc29taXNvMmF2YzEAAAAIZnJlZQAAvjVtZGF0AAACrwYF//+r
3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2NCByMzEwOCAzMWUxOWY5IC0gSC4yNjQvTVBF
Ry00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAyMyAtIGh0dHA6Ly93d3cudmlkZW9sYW4u
b3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFs
eXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVk
X3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBk
ZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEy
IGxvb2thaGVhZF90aHJlYWRzPTIgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50
ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBi
X3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29w
PTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0yNSBzY2VuZWN1dD00MCBpbnRyYV9y
ZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9MSBjcmY9MjMuMCBxY29tcD0w
LjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAA
ERtliIQAM//+9uy+BTX9n9CXESzF2kpwPiqkgIB3NMAAAAMADZX958FGL9QF4pa0gXMUOlMI3oS/
raSUHPbq+8D6W4d6exOsyrAwne0SLGnZgwzIg/ojaXIpk3x6JGfeWxLxJO7P4hGKfy4uQPTq+RFJ
kJiC8VBlx+q+PDqZjnmSyhxE4ED8e5kGOY2Mfm2JN2TK4UTETIzQXglEf/BhP0fGi+nn1LFPiB1d
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
dmY2MS4xLjEwMA==
">
  Your browser does not support the video tag.
</video>
</div>
</div>
</section>
</section>
<section id="end" class="level2">
<h2 class="anchored" data-anchor-id="end">End</h2>
<p>I hope you enjoyed this post. You can ask further questions on <a href="https://t.me/swemanml">my telegram channel</a>.</p>
<p><a href="https://maitbayev.substack.com/subscribe">Subscribe</a> to get a notification about future posts.</p>


</section>
</section>

 ]]></description>
  <category>basics</category>
  <category>loss</category>
  <category>l1</category>
  <category>l2</category>
  <category>lasso</category>
  <category>ridge</category>
  <guid>https://maitbayev.github.io/posts/why-l1-loss-encourage-coefficients-to-shrink-to-zero/</guid>
  <pubDate>Fri, 27 Dec 2024 00:00:00 GMT</pubDate>
  <media:content url="https://maitbayev.github.io/posts/why-l1-loss-encourage-coefficients-to-shrink-to-zero/images/image.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>WIP: High-Resolution Image Synthesis with Latent Diffusion Models Notes</title>
  <dc:creator>Madiyar Aitbayev</dc:creator>
  <link>https://maitbayev.github.io/posts/high-resolution-image-synthesis-with-latent-diffusion-models/</link>
  <description><![CDATA[ 





<section id="notes-for-high-resolution-image-synthesis-with-latent-diffusion-models" class="level1">
<h1>Notes for “High-Resolution Image Synthesis with Latent Diffusion Models”</h1>
<p>My notes for the <a href="https://arxiv.org/pdf/2112.10752">“High-Resolution Image Synthesis with Latent Diffusion Models”</a> paper. Feel free to ask questions on <a href="https://t.me/swemanml">my telegram channel</a></p>


</section>

 ]]></description>
  <category>stable</category>
  <category>diffusion</category>
  <category>paper</category>
  <guid>https://maitbayev.github.io/posts/high-resolution-image-synthesis-with-latent-diffusion-models/</guid>
  <pubDate>Sun, 21 Jul 2024 23:00:00 GMT</pubDate>
  <media:content url="https://maitbayev.github.io/posts/high-resolution-image-synthesis-with-latent-diffusion-models/images/image.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Auto-Encoding Variational Bayes Notes</title>
  <dc:creator>Madiyar Aitbayev</dc:creator>
  <link>https://maitbayev.github.io/posts/auto-encoding-variational-bayes/</link>
  <description><![CDATA[ 





<section id="notes-for-auto-encoding-variational-bayes" class="level1">
<h1>Notes for “Auto-Encoding Variational Bayes”</h1>
<p>My notes for the <a href="https://arxiv.org/pdf/1312.6114">“Auto-Encoding Variational Bayes”</a> paper. Feel free to ask questions on <a href="https://t.me/swemanml">my telegram channel</a></p>
<section id="method" class="level2">
<h2 class="anchored" data-anchor-id="method">Method</h2>
<section id="problem-scenario" class="level3">
<h3 class="anchored" data-anchor-id="problem-scenario">Problem scenario</h3>
<p>Let us consider some independently and identically distributed (i.i.d) dataset <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7BX%7D=%5C%7B%5Cmathbf%7Bx%5B1%5D%7D,%20%5Cmathbf%7Bx%5B2%5D%7D,%20...,%20%5Cmathbf%7Bx%5BN%5D%7D%5C%7D">. We assume that the data involves an unobserved random variable <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bz%7D">. Then, the process consists of two steps:</p>
<ol type="1">
<li><p><img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bz%5Bi%5D%7D"> is generated from some prior distribution <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bp_%7B%5Ctheta*%7D(z)%7D"></p></li>
<li><p><img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx%5Bi%5D%7D"> is generated from some conditional distribution <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bp_%7B%5Ctheta*%7D(x%7Cz)%7D"></p></li>
</ol>
<p>Unfortunately, the true parameters <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%20%5Ctheta*%20%7D"> and the latent variables <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bz%5Bi%5D%7D"> are unknown to us. Additionally, <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bp_%5Ctheta(z%7Cx)%7D"> is intractable, so we approximate it with <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%20q_%5Cphi(z%7Cx)%20%7D">. The model <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%20q_%5Cphi(z%7Cx)%20%7D"> is a probabilistic encoder model parameterized by <img src="https://latex.codecogs.com/png.latex?%5Cphi"> . Similarly, <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bp_%5Ctheta(x%7Cz)%7D"> is a probabilistic decoder model parameterized by <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Ctheta%7D">.</p>
</section>
<section id="the-variational-lower-bound" class="level3">
<h3 class="anchored" data-anchor-id="the-variational-lower-bound">The variational lower bound</h3>
<p>Ideally, we would like to optimize the marginal likelihoods of the dataset <strong>X</strong>:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%7B%0A%5Clog%20p_%5Ctheta(x%5B1%5D,%20%5Ccdots,x%5BN%5D)=%5Csum_%7Bi=1%7D%5EN%7B%5Clog%20p_%5Ctheta(x%5Bi%5D)%7D%0A%7D%0A"></p>
<p>Where each term can be rewritten as:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%7B%0A%5Clog%20p_%5Ctheta(x%5Bi%5D)%20=%20D_%7BKL%7D(q_%5Cphi(z%7Cx%5Bi%5D)%7C%7Cp_%5Ctheta(z%7Cx%5Bi%5D))%20+%20%5Cmathcal%7BL%7D(%5Ctheta,%20%5Cphi,%20x%5Bi%5D)%0A%7D%0A"></p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-1-contents" aria-controls="callout-1" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Proof
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-1" class="callout-1-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Baligned%7D%0A%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx%7D)%0A&amp;=%20%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx%7D)%5Cint%7B%20%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7Dd%5Cmathbf%7Bz%7D%7D%0A%5Cqquad%20%5Ctext%7B(Multiplying%20by%201)%7D%5C%5C%0A&amp;=%20%5Cint%7B%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx%7D)%20%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7Dd%5Cmathbf%7Bz%7D%7D%5C%5C%0A&amp;=%20%5Cmathbb%7BE%7D_%7B%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%7D%20%5Cleft%5B%0A%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx%7D)%0A%5Cright%5D%20%5Cqquad%20%5Ctext%7B(Definition%20of%20Expectation)%7D%5C%5C%0A&amp;=%20%5Cmathbb%7BE%7D_%7B%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%7D%20%5Cleft%5B%0A%5Clog%20%5Cfrac%7Bp_%5Ctheta(%5Cmathbf%7Bx,%20z%7D)%7D%7Bp_%5Ctheta(%5Cmathbf%7Bz%7Cx%7D)%7D%0A%5Cright%5D%20%5Cqquad%20%5Ctext%7B(The%20chain%20rule%20of%20probability)%7D%20%5C%5C%0A&amp;=%20%5Cmathbb%7BE%7D_%7B%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%7D%20%5Cleft%5B%0A%5Clog%20%5Cfrac%7Bp_%5Ctheta(%5Cmathbf%7Bx,%20z%7D)%7D%7Bp_%5Ctheta(%5Cmathbf%7Bz%7Cx%7D)%7D%0A%5Ccdot%20%5Cfrac%7B%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%7D%7B%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%7D%0A%5Cright%5D%5C%5C%0A&amp;=%20%5Cmathbb%7BE%7D_%7B%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%7D%20%5Cleft%5B%0A%5Clog%20%5Cfrac%7B%20%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%20%7D%7B%20p_%5Ctheta(%5Cmathbf%7Bz%7Cx%7D)%20%7D%0A%5Cright%5D%20+%20%5Cmathbb%7BE%7D_%7B%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%7D%20%5Cleft%5B%0A%5Clog%20%5Cfrac%7B%20p_%5Ctheta(%5Cmathbf%7Bx,%20z%7D)%20%7D%7B%20%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%20%7D%0A%5Cright%5D%5C%5C%0A&amp;=%20D_%7BKL%7D(%20%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%20%7C%7C%20p_%5Ctheta(%5Cmathbf%7Bz%7Cx%7D)%20)%0A+%20%5Cmathcal%7BL%7D(%5Ctheta,%20%5Cphi,%20%5Cmathbf%7Bx%7D)%0A%5Cend%7Baligned%7D%0A"></p>
<p>We used the chain rule of probability:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0Ap(%5Cmathbf%7Bx%7D)=%5Cfrac%7Bp(%5Cmathbf%7Bx,z%7D)%7D%7Bp(%5Cmathbf%7Bz%7Cx%7D)%7D%0A"></p>
</div>
</div>
</div>
<p>The first term is the KL-divergence between the approximate and the true posterior. Since the KL-divergence is non-negative, the second term is called (<strong>variational) lower bound.</strong> Ideally, we would like to minimize the both terms. However, it is enough to optimize the lower bound w.r.t both parameters θand φ<strong>.</strong> Minimizing the lower bound will minimize the KL-divergence as well, since they sum up to a constant value.</p>
<p><strong>The variational lower bound,</strong> also called as th<strong>e evidence lower bound (</strong>ELBO) can be also rewritten as:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Baligned%7D%0A%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx%5Bi%5D%7D)%20&amp;%5Cge%20%5Cmathcal%7BL%7D(%5Ctheta,%20%5Cphi;%20%5Cmathbf%7Bx%5Bi%5D%7D)%5C%5C%0A&amp;=%20%5Cmathbb%7BE%7D_%7Bq_%5Cphi(%5Cmathbf%7Bz%7Cx%5Bi%5D%7D)%7D%20%5Cleft%5B%0A-%5Clog%20q_%5Cphi(%5Cmathbf%7Bz%7Cx%5Bi%5D%7D)%20+%20%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx%5Bi%5D,%20z%7D)%0A%5Cright%5D%5C%5C%0A&amp;=%20-D_%7BKL%7D(q_%5Cphi(%5Cmathbf%7Bz%7Cx%5Bi%5D%7D)%7C%7Cp_%5Ctheta(%5Cmathbf%7Bz%7D))%0A+%0A%5Cmathbb%7BE%7D_%7Bq_%5Cphi(%5Cmathbf%7Bz%7Cx%5Bi%5D%7D)%7D%20%5Cleft%5B%0A%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx%5Bi%5D%7Cz%7D)%0A%5Cright%5D%0A%5Cend%7Baligned%7D%0A"></p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-2-contents" aria-controls="callout-2" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Proof
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-2" class="callout-2-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Baligned%7D%0A%5Cmathcal%7BL%7D(%5Ctheta,%20%5Cphi;%20%5Cmathbf%7Bx%7D)%0A&amp;=%5Cmathbb%7BE%7D_%7B%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%7D%20%5Cleft%5B%0A%5Clog%20%5Cfrac%7B%20p_%5Ctheta(%5Cmathbf%7Bx,%20z%7D)%20%7D%7B%20%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%20%7D%0A%5Cright%5D%5C%5C%0A&amp;=%20%5Cmathbb%7BE%7D_%7B%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%7D%20%5Cleft%5B%0A%5Clog%20%5Cfrac%7B%20p_%5Ctheta(%5Cmathbf%7Bx%7Cz%7D)p_%5Ctheta(%5Cmathbf%7Bz%7D)%20%7D%7B%20%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%20%7D%0A%5Cright%5D%5C%5C%0A&amp;=%0A%5Cmathbb%7BE%7D_%7B%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%7D%20%5Cleft%5B%0A%5Clog%20%5Cfrac%7B%20p_%5Ctheta(%5Cmathbf%7Bz%7D)%20%7D%7B%20%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%20%7D%0A%5Cright%5D%0A+%0A%5Cmathbb%7BE%7D_%7B%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D%7D%20%5Cleft%5B%0A%5Clog%20%20p_%5Ctheta(%5Cmathbf%7Bx%7Cz%7D)%0A%5Cright%5D%5C%5C%0A&amp;=%0A-D_%7BKL%7D(q_%5Cphi(%5Cmathbf%7Bz%7Cx%7D)%7C%7Cp_%5Ctheta(%5Cmathbf%7Bz%7D))%0A+%0A%5Cmathbb%7BE%7D_%7Bq_%5Cphi(%5Cmathbf%7Bz%7Cx%7D)%7D%20%5Cleft%5B%0A%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx%7Cz%7D)%0A%5Cright%5D%0A%5Cend%7Baligned%7D%0A"></p>
</div>
</div>
</div>
</section>
<section id="the-reparameterization-trick" class="level3">
<h3 class="anchored" data-anchor-id="the-reparameterization-trick">The reparameterization trick</h3>
<p>The sampling from <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D"> is a stochastic process which is not differentiable w.r.t. <img src="https://latex.codecogs.com/png.latex?%5Cphi">. We can use an alternative method for generating sample from <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D">, i.e., the reparameterization trick. We can often express the random variable <strong>z</strong> as a deterministic variable <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bz=g_%5Cphi(%5Cepsilon,%20x)%7D">, where <img src="https://latex.codecogs.com/png.latex?%5Cepsilon"> is an independent variable and <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bg_%5Cphi%7D"> is a function parameterized by <img src="https://latex.codecogs.com/png.latex?%5Cphi">.</p>
<p>The <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bq_%5Cphi(z%7Cx)%7D"> is commonly chosen to model a multivariate Gaussian with diagonal covariance, and the prior often is a standard Gaussian distribution:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%7B%0Aq_%5Cphi(z%7Cx)=%5Cmathcal%7BN%7D(z;%20%5Cmu,%20%5Csigma%5E2)%20=%20%5Cmu+%5Csigma%5Ccdot%5Cepsilon%0A%7D%0A"></p>
<p>where <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%20%5Cepsilon%20%5Csim%20%5Cmathcal%7BN%7D(%5Cepsilon;%200,%20I)%20%7D"> and we can choose <img src="https://latex.codecogs.com/png.latex?g_%5Cphi(%5Cepsilon,%20x)=%5Cmu(x)%20+%20%5Csigma(x)%20%5Ccdot%20%5Cepsilon"></p>
<p>Therefore, by the reparameterization trick, sampling from an arbitrary Gaussian distribution can be performed by sampling from a standard Gaussian, scaling and shifting the result by the target mean and the deviation, which is deterministic and differentiable.</p>
</section>
</section>
<section id="variational-auto-encoder" class="level2">
<h2 class="anchored" data-anchor-id="variational-auto-encoder">Variational Auto-Encoder</h2>
<p>We use a neural network for the probabilistic encoder <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%20q_%5Cphi(z%7Cx)%7D"> and where the parameters <img src="https://latex.codecogs.com/png.latex?%5Cphi"> and <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> are optimized jointly. We also assume that:</p>
<ul>
<li><p><img src="https://latex.codecogs.com/png.latex?p_%5Ctheta(%5Cmathbf%7Bz%7D)=%5Cmathcal%7BN%7D(%5Cmathbf%7Bz;%200,%20I%7D)"> - the prior over the latent variables is a standard Gaussian</p></li>
<li><p><img src="https://latex.codecogs.com/png.latex?p_%5Ctheta(%5Cmathbf%7Bx%7Cz%7D)"> is a multivariate Gaussian (in case of real-valued data) or Bernoulli (in case of binary data)</p></li>
<li><p><img src="https://latex.codecogs.com/png.latex?q_%5Cphi(%5Cmathbf%7Bz%7Cx%7D)"> is approximately Gaussian with an approximately diagonal covariance: <img src="https://latex.codecogs.com/png.latex?%5Clog%20q_%5Cphi(%5Cmathbf%7Bz%7Cx%5Bi%5D%7D)=%5Clog%20%5Cmathcal%7BN%7D(%5Cmathbf%7Bz;%20%5Cmu%5Bi%5D,%20%5Csigma%5Bi%5D%5E2I%7D)"></p></li>
</ul>
<p>We use the reparameterization trick to sample from the posterior using <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bz%5Bi,%20l%5D%7D=g_%5Cphi(%20%5Cmathbf%7Bx%5Bi%5D,%20%5Cepsilon%5Bl%5D%7D%20)=%5Cmathbf%7B%5Cmu%5Bi%5D+%5Csigma%5Bi%5D%5Ccdot%20%5Cepsilon%5Bl%5D%7D">. In this model both <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bp_%5Ctheta(z)%7D"> and <img src="https://latex.codecogs.com/png.latex?q_%5Cphi(%5Cmathbf%7Bz%7Cx%7D)"> are Gaussian; hence we compute the KL divergence in a closed form without estimation:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathcal%7BL%7D(%5Cmathbf%7B%5Ctheta,%20%5Cphi,%20x%5Bi%5D%7D)%0A%5Csimeq%0A%5Cfrac%7B1%7D%7B2%7D%5Csum_%7Bj=1%7D%5EJ%7B%5Cleft(%0A1+%5Clog(%5Csigma%5Bi%5D%5Bj%5D%5E2)%20-%20%5Cmu%5Bi%5D%5Bj%5D%5E2%20-%20%5Csigma%5Bi%5D%5Bj%5D%5E2%0A%5Cright)%7D%0A+%0A%5Cfrac%7B1%7D%7BL%7D%5Csum_%7Bl=1%7D%5EL%7B%0A%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx%7D%5Bi%5D%20%7C%20%5Cmathbf%7Bz%7D%5Bi%5D%5Bl%5D)%0A%7D%0A"></p>
<p>In the above equation , only the reconstruction error <img src="https://latex.codecogs.com/png.latex?E_%7Bq_%5Cphi(%5Cmathbf%7Bz%7Cx%5Bi%5D%7D)%7D%20%5Cleft%5B%20%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx%5Bi%5D%7Cz%7D)%5Cright%5D"> requires estimation by sampling, since the KL-divergence term is integrated analytically.</p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center" data-bs-toggle="collapse" data-bs-target=".callout-3-contents" aria-controls="callout-3" aria-expanded="true" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Proof
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-3" class="callout-3-contents callout-collapse collapse show">
<div class="callout-body-container callout-body">
<p>TODO: for now see the <a href="https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence#Multivariate_normal_distributions">KL divergence between two multivariate normal distributions</a></p>
</div>
</div>
</div>


</section>
</section>

 ]]></description>
  <category>diffusion</category>
  <category>paper</category>
  <category>autoencoder</category>
  <guid>https://maitbayev.github.io/posts/auto-encoding-variational-bayes/</guid>
  <pubDate>Sat, 20 Jul 2024 23:00:00 GMT</pubDate>
  <media:content url="https://maitbayev.github.io/posts/auto-encoding-variational-bayes/images/image.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Denoising Diffusion Probabilistic Models</title>
  <dc:creator>Madiyar Aitbayev</dc:creator>
  <link>https://maitbayev.github.io/posts/denoising-diffusion-probabilistic-models/</link>
  <description><![CDATA[ 





<section id="notes-for-denoising-diffusion-probabilistic-models" class="level1">
<h1>Notes for “Denoising Diffusion Probabilistic Models”</h1>
<p>My notes for the <a href="https://arxiv.org/pdf/2006.11239">“Denoising Diffusion Probabilistic Models”</a> paper. Feel free to ask questions on <a href="https://t.me/swemanml">my telegram channel</a></p>
<section id="background" class="level2">
<h2 class="anchored" data-anchor-id="background">Background</h2>
<p><img src="https://maitbayev.github.io/posts/denoising-diffusion-probabilistic-models/images/figure2.jpg" class="img-fluid" width="490"></p>
<section id="forward-process" class="level3">
<h3 class="anchored" data-anchor-id="forward-process">Forward Process</h3>
<p>We have latent variables <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_1%7D,%5Cmathbf%7Bx_2%7D,%20...,%20%5Cmathbf%7Bx_T%7D"> of the same dimensionality as the image <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_0%7D">. The <em>forward process</em> or <em>diffusion process</em> is fixed to a Markov chain that gradually adds Gaussian noise to the image according to a variance schedule <img src="https://latex.codecogs.com/png.latex?%5Cbeta_1,%20...,%20%5Cbeta_T">:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%7B%0Aq(x_t%7Cx_%7Bt-1%7D)=%20%5Cmathcal%7BN%7D%20(x_t;%20%5Csqrt%7B1-%5Cbeta_t%7Dx_%7Bt-1%7D,%20%5Cbeta_%7Bt%7DI),%0A%5Cquad%0Aq(x_%7B1:T%7D%7Cx_0)=%20%5Cprod_%7Bt=1%7D%5ET%7Bq(x_t%7Cx_%7Bt-1%7D)%7D%0A%7D%0A"></p>
<p>The above equation means that we start with our data <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_0%7D">, then we sample a noisy version of our image <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_1%7D"> with the mean <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_0%7D"> scaled by <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Csqrt%7B1-%5Cbeta_1%7D%7D"> and the variance <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Cbeta_1%7D">. Finally, we repeat this process <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7BT%7D"> times and arrive at pure standard Gaussian noise when small enough <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Cbeta%7D"> and large enough <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7BT%7D"> values are used. This process is fixed and not learned, unlike <a href="https://maitbayev.github.io/posts/auto-encoding-variational-bayes/">variational auto-encoder</a> (VAE) models.</p>
<p>A nice benefit from the forward process is that we can sample <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_t%7D"> at any timestep <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bt%7D"> in closed form without simulating the forward process steps <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bt%7D"> times. Let <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Calpha_t=1-%5Cbeta_t%7D"> and <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%20%5Cbar%7B%5Calpha%7D_t%20=%20%5Cprod_%7Bi=1%7D%5Et%5Calpha_i%20%7D"> :</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%20%7B%0Aq(x_t%7Cx_0)%20=%20%5Cmathcal%7BN%7D(x_t;%20%5Csqrt%7B%5Cbar%7B%5Calpha_t%7D%7Dx_0,%20(1-%5Cbar%7B%5Calpha%7D_t)I)%0A%7D%0A"></p>
<div class="callout callout-style-default callout-note no-icon callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-1-contents" aria-controls="callout-1" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Proof
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-1" class="callout-1-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>Suppose we have access to random noise variables <img src="https://latex.codecogs.com/png.latex?%5C%7B%5Cmathbf%7B%5Cepsilon_t%5E*%7D,%20%5Cmathbf%7B%5Cepsilon_t%7D%5C%7D_%7Bt=0%7D%5ET%20%5Csim%20%5Cmathcal%7BN%7D(%5Cmathbf%7B%5Cepsilon_;%200,%20I%7D)">:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%20%7B%0A%5Cbegin%7Baligned%7D%0Ax_t&amp;=%5Csqrt%7B%5Calpha_t%7Dx_%7Bt-1%7D%20+%20%5Csqrt%7B1-%5Calpha_t%7D%5Cepsilon%5E*_%7Bt-1%7D%5C%5C%0A&amp;=%20%5Csqrt%7B%5Calpha_t%7D(%5Csqrt%7B%5Calpha_%7Bt-1%7D%7Dx_%7Bt-2%7D%20+%20%5Csqrt%7B1-%5Calpha_%7Bt-1%7D%7D%5Cepsilon%5E*_%7Bt-2%7D)%20+%20%5Csqrt%7B1-%5Calpha_t%7D%5Cepsilon%5E*_%7Bt-1%7D%5C%5C%0A&amp;=%20%5Csqrt%7B%5Calpha_t%20%5Calpha_%7Bt-1%7D%7Dx_%7Bt-2%7D%20+%5Csqrt%7B1-%5Calpha_t%20%5Calpha_%7Bt-1%7D%7D%5Cepsilon_%7Bt-2%7D%5C%5C%0A&amp;=%20%5Ccdots%5C%5C%0A&amp;=%20%5Csqrt%7B%5Cprod_%7Bt=1%7D%5Et%7B%5Calpha_i%7D%7Dx_0%20+%20%5Csqrt%7B1-%5Cprod_%7Bt=1%7D%5Et%7B%5Calpha_i%7D%7D%5Cepsilon_0%5C%5C%0A&amp;=%20%5Csqrt%7B%5Cbar%7B%5Calpha_t%7D%7Dx_0%20+%20%5Csqrt%7B1-%5Cbar%7B%5Calpha_t%7D%7D%5Cepsilon_0%5C%5C%0A&amp;%5Csim%20%5Cmathcal%7BN%7D(x_t;%20%5Csqrt%7B%5Cbar%7B%5Calpha_t%7D%7Dx_0,%20(1-%5Cbar%7B%5Calpha%7D_t)I)%5C%5C%0A%5Cend%7Baligned%7D%0A%7D%0A"><br>
Here we used the fact that <a href="https://en.wikipedia.org/wiki/Sum_of_normally_distributed_random_variables">the sum of two independent Gaussian random variables</a> remains a Gaussian with mean being sum of two means, and variance being the sum of two variances.</p>
</div>
</div>
</div>
<p>We can view the forward process as transitioning from our real-life complex distribution (image) to a simpler standard Gaussian distribution.</p>
</section>
<section id="reverse-process" class="level3">
<h3 class="anchored" data-anchor-id="reverse-process">Reverse Process</h3>
<p>The <em>reverse process</em> is a <strong>learned</strong> Gaussian transition starting at a pure standard Gaussian noise <img src="https://latex.codecogs.com/png.latex?p(%5Cmathbf%7Bx%7D_T)=%5Cmathcal%7BN%7D(%5Cmathbf%7Bx%7D_T;%20%5Cmathbf%7B0%7D,%20%5Cmathbf%7BI%7D)">, then:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0Ap_%7B%5Ctheta%7D(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t%7D)%20=%20%5Cmathcal%7BN%7D(%5Cmathbf%7Bx_%7Bt-1%7D%7D;%20%5Cmathbf%7B%5Cmu_%5Ctheta(x_t,%20t),%20%5CSigma_%5Ctheta(x_t,%20t)%7D)%0A%5Cquad%20p_%5Ctheta(%5Cmathbf%7Bx%7D_%7B0:T%7D)%20=%20p(%5Cmathbf%7Bx%7D_T)%5Cprod_%7Bt=1%7D%5ET%7Bp_%5Ctheta(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t%7D)%7D%0A"></p>
<p>The above means that we start with a pure noise <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx%7D_T">, then we gradually remove noises by sampling from learned means <img src="https://latex.codecogs.com/png.latex?%5Cmu_%5Ctheta(%5Cmathbf%7Bx_t;%20t%7D)"> and variances <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5CSigma_%5Ctheta(x_t,%20t)%7D"> parameterized by <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Ctheta%7D">.</p>
<p>We can view the reverse process as transitioning from a simple standard Gaussian distribution to our real-life complex distribution inferred from the dataset. All possible images are reachable from the final standard Gaussian noise; however, fewer and fewer images will be reachable as we go in reverse. See the images below for reachable images from <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx%7D_%7B1000%7D">, <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx%7D_%7B750%7D">, <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx%7D_%7B500%7D">, <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx%7D_%7B250%7D">, <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx%7D_%7B0%7D"></p>
<p><img src="https://maitbayev.github.io/posts/denoising-diffusion-probabilistic-models/images/figure3.jpg" class="img-fluid"></p>
</section>
<section id="loss" class="level3">
<h3 class="anchored" data-anchor-id="loss">Loss</h3>
<p>Training is performed by optimizing the <strong>variational lower bound</strong> (or the evidence lower bound) similar to the <a href="https://maitbayev.github.io/posts/auto-encoding-variational-bayes/">VAE</a>:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbb%7BE%7D%5B-%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx%7D_0)%5D%20%5Cle%0A%5Cmathbb%7BE%7D_q%5Cleft%5B-%5Clog%0A%20%20%5Cfrac%7Bp_%5Ctheta(%5Cmathbf%7Bx_%7B0:T%7D%7D)%7D%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%0A%5Cright%5D=%0A%5Cmathbb%7BE_q%7D%5Cleft%5B%0A-%5Clog%20p(%5Cmathbf%7Bx_T%7D)%20-%20%5Csum_%7Bt%5Cge1%7D%5Clog%7B%5Cfrac%7Bp_%5Ctheta(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t%7D)%7D%7Bq(%5Cmathbf%7Bx_%7Bt%7D%7Cx_%7Bt-1%7D%7D)%7D%7D%0A%5Cright%5D%0A"></p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-2-contents" aria-controls="callout-2" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Proof
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-2" class="callout-2-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p><strong>Proof 1: Using <a href="https://maitbayev.github.io/posts/jensens-inequality/">Jensen’s Inequality</a></strong></p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%20%7B%0A%5Cbegin%7Baligned%7D%0A%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx%7D)&amp;=log%5Cint%7Bp_%5Ctheta(%5Cmathbf%7Bx_%7B0:T%7D%7D)d%5Cmathbf%7Bx_%7B1:T%7D%7D%7D%5C%5C%0A&amp;=log%5Cint%7B%20%5Cfrac%20%7Bp_%5Ctheta(%5Cmathbf%7Bx_%7B0:T%7D%7D)%20q(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%20%7D%20%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%20d%5Cmathbf%7Bx_%7B1:T%7D%7D%20%7D%5C%5C%0A&amp;=%5Clog%20%5Cmathbb%7BE%7D_%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%5Cleft%5B%0A%20%20%5Cfrac%7Bp_%5Ctheta(%5Cmathbf%7Bx_%7B0:T%7D%7D)%7D%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%0A%5Cright%5D%5C%5C%0A&amp;%5Cge%20%5Cmathbb%7BE%7D_%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%5Cleft%5B%20%20%5Clog%0A%20%20%5Cfrac%7Bp_%5Ctheta(%5Cmathbf%7Bx_%7B0:T%7D%7D)%7D%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%0A%5Cright%5D%5C%5C%0A%5Cend%7Baligned%7D%0A%7D%0A"></p>
<p><strong>Proof 2: Using KL Divergence</strong></p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%20%7B%0A%5Cbegin%7Baligned%7D%0A%5Clog%20p(%5Cmathbf%7Bx_0%7D)&amp;=%5Clog%20p(%5Cmathbf%7Bx_0%7D)%20%5Cint%20%7B%0A%20%20q(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%20%20d%5Cmathbf%7Bx_%7B1:T%7D%7D%0A%7D%20%5C%5C%0A&amp;=%20%5Cint%20%7B%0A%20%20q(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%20(%5Clog%20p(%5Cmathbf%7Bx_0%7D))%20d%5Cmathbf%7Bx_%7B1:T%7D%7D%0A%7D%20%5C%5C%0A&amp;=%20%5Cmathbb%7BE%7D_%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%20%5Cleft%5B%0A%5Clog%20p(%5Cmathbf%7Bx_0%7D)%0A%5Cright%5D%5C%5C%0A&amp;=%20%20%5Cmathbb%7BE%7D_%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%20%5Cleft%5B%0A%5Clog%0A%5Cfrac%7Bq(%5Cmathbf%7Bx_%7B0:T%7D%7D)%7D%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%0A%5Cright%5D%5C%5C%0A&amp;=%20%20%5Cmathbb%7BE%7D_%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%20%5Cleft%5B%0A%5Clog%0A%5Cfrac%7B%20q(%5Cmathbf%7Bx_%7B0:T%7D%7D)%20p_%5Ctheta(%5Cmathbf%7Bx_%7B0:T%7D%7D)%20%7D%7B%20q(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%20p_%5Ctheta(%5Cmathbf%7Bx_%7B0:T%7D%7D)%7D%0A%5Cright%5D%5C%5C%0A&amp;=%5Cmathbb%7BE%7D_%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%20%5Cleft%5B%0A%5Clog%0A%5Cfrac%7B%20p_%5Ctheta(%5Cmathbf%7Bx_%7B0:T%7D%7D)%20%7D%7B%20q(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%0A%5Cright%5D%0A+%0A%5Cmathbb%7BE%7D_%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%20%5Cleft%5B%0A%5Clog%0A%5Cfrac%7B%20q(%5Cmathbf%7Bx_%7B1:T%7D%7Cx_0%7D)p(%5Cmathbf%7Bx_0%7D)%20%7D%7B%20p_%5Ctheta(%5Cmathbf%7Bx_%7B1:T%7D%7Cx_0%7D)p(%5Cmathbf%7Bx_0%7D)%20%7D%0A%5Cright%5D%5C%5C%0A&amp;=%5Cmathbb%7BE%7D_%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%20%5Cleft%5B%0A%5Clog%0A%5Cfrac%7B%20p_%5Ctheta(%5Cmathbf%7Bx_%7B0:T%7D%7D)%20%7D%7B%20q(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%0A%5Cright%5D%0A+%0AD_%7BKL%7D(q(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%20%7C%7C%20p_%5Ctheta(%5Cmathbf%7Bx_%7B1:T%7D%7Cx_0%7D))%5C%5C%0A&amp;%5Cge%20%5Cmathbb%7BE%7D_%7Bq(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%20%5Cleft%5B%0A%5Clog%0A%5Cfrac%7B%20p_%5Ctheta(%5Cmathbf%7Bx_%7B0:T%7D%7D)%20%7D%7B%20q(%5Cmathbf%7Bx_%7B1:T%7D%7D%7C%5Cmathbf%7Bx_0%7D)%7D%0A%5Cright%5D%0A%5Cend%7Baligned%7D%0A%7D%0A"></p>
<p>The KL divergence is always non-negative, hence the lower bound approximation</p>
</div>
</div>
</div>
<p>The forward process variances <img src="https://latex.codecogs.com/png.latex?%5Cbeta_t"> are hyperparameters. The reverse process <img src="https://latex.codecogs.com/png.latex?p_%5Ctheta(%5Cmathbf%7Bx_%7Bt-1%7D%20%7C%20x_t%7D)"> is Gaussian, when the forward process is Gaussian and <img src="https://latex.codecogs.com/png.latex?%5Cbeta_t"> are small.</p>
<p>Efficient training is possible by optimizing random terms of the loss, however it requires two random variables for each term, <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_%7Bt-1%7D%7D"> and <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_%7Bt%7D%7D">, which introduces high variance Monte Carlo estimates. We can reduce the variance:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AE_q%20%5Cleft%5B%0AD_%7BKL%7D(q(%5Cmathbf%7Bx_T%7Cx_0%7D%7C%7Cp(%5Cmathbf%7Bx_T%7D))%0A+%0A%5Csum_%7Bt%5Cgt1%7D%7BD_%7BKL%7D(q(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t,x_0%7D)%7C%7Cp_%5Ctheta(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t%7D))%7D%0A-%0A%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx_0%7Cx_1%7D)%0A%5Cright%5D%0A"></p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-3-contents" aria-controls="callout-3" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Proof from Appendix A
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-3" class="callout-3-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Baligned%7D%0AL%20&amp;=%20%5Cmathbb%7BE%7D_%7Bq(%20%5Cmathbf%7Bx_%7B1:T%7D%7Cx0%7D%20)%7D%20%5Cleft%5B%0A-%5Clog%20%5Cfrac%7Bp_%5Ctheta(%5Cmathbf%7Bx_%7B0:T%7D%7D)%20%7D%20%7B%20q(%5Cmathbf%7Bx_%7B1:T%7D%7Cx_0%7D)%20%7D%5C%5C%0A%5Cright%5D%5C%5C%0A&amp;=%20%20%5Cmathbb%7BE%7D_%7Bq(%20%5Cmathbf%7Bx_%7B1:T%7D%7Cx0%7D%20)%7D%20%5Cleft%5B%0A-%5Clog%20p(%5Cmathbf%7Bx_T%7D)%0A-%0A%5Csum_%7Bt%5Cge1%7D%7B%5Clog%20%5Cfrac%7B%20p_%5Ctheta(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t%7D)%20%7D%20%7B%20q(%5Cmathbf%7Bx_t%7Cx_%7Bt-1%7D%7D%20)%20%7D%20%7D%0A%5Cright%5D%5C%5C%0A&amp;=%20%20%5Cmathbb%7BE%7D_%7Bq(%20%5Cmathbf%7Bx_%7B1:T%7D%7Cx0%7D%20)%7D%20%5Cleft%5B%0A-%5Clog%20p(%5Cmathbf%7Bx_T%7D)%0A-%0A%5Csum_%7Bt%3E1%7D%7B%5Clog%20%5Cfrac%7B%20p_%5Ctheta(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t%7D)%20%7D%20%7B%20q(%5Cmathbf%7Bx_t%7Cx_%7Bt-1%7D%7D%20)%20%7D%20%7D%0A-%20%5Clog%20%5Cfrac%7B%20p_%5Ctheta(%5Cmathbf%7Bx_%7B0%7D%7Cx_1%7D)%20%7D%20%7B%20q(%5Cmathbf%7Bx_1%7Cx_0%7D%20)%20%7D%0A%5Cright%5D%5C%5C%0A&amp;=%20%20-%5Cmathbb%7BE%7D_%7Bq(%20%5Cmathbf%7Bx_%7B1:T%7D%7Cx0%7D%20)%7D%20%5Cleft%5B%0A-%5Clog%20p(%5Cmathbf%7Bx_T%7D)%0A-%0A%5Csum_%7Bt%3E1%7D%7B%5Clog%20%5Cfrac%7B%20p_%5Ctheta(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t%7D)%20%7D%20%7B%20q(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t,%20x_0%7D%20)%20%7D%20%7D%0A%5Ccdot%20%5Cfrac%7Bq(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_0%7D)%20%7D%7B%20q(%5Cmathbf%7Bx_t%7Cx_0%7D)%20%7D%0A-%20%5Clog%20%5Cfrac%7B%20p_%5Ctheta(%5Cmathbf%7Bx_%7B0%7D%7Cx_1%7D)%20%7D%20%7B%20q(%5Cmathbf%7Bx_1%7Cx_0%7D%20)%20%7D%0A%5Cright%5D%5C%5C%0A&amp;=%20%20-%5Cmathbb%7BE%7D_%7Bq(%20%5Cmathbf%7Bx_%7B1:T%7D%7Cx0%7D%20)%7D%20%5Cleft%5B%0A-%5Clog%20%5Cfrac%7B%20p(%5Cmathbf%7Bx_T%7D)%20%7D%7Bq(%5Cmathbf%7Bx_T%7Cx_0%7D)%7D%0A-%0A%5Csum_%7Bt%3E1%7D%7B%5Clog%20%5Cfrac%7B%20p_%5Ctheta(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t%7D)%20%7D%20%7B%20q(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t,%20x_0%7D%20)%20%7D%20%7D%0A-%20%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx_%7B0%7D%7Cx_1%7D)%0A%5Cright%5D%5C%5C%0A&amp;=%20%20%5Cmathbb%7BE%7D_%7Bq(%20%5Cmathbf%7Bx_%7B1:T%7D%7Cx0%7D%20)%7D%20%5Cleft%5B%0AD_%7BKL%7D(q(%5Cmathbf%7Bx_T%7Cx_0%7D%20%7C%7C%20p(%5Cmathbf%7Bx%7D_T))%0A+%0A%5Csum_%7Bt%3E1%7D%7B%20D_%7BKL%7D(%20q(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t,%20x_0%7D)%7C%7Cp_%5Ctheta(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t%7D)%20%20)%20%20%7D%0A-%20%5Clog%20p_%5Ctheta(%5Cmathbf%7Bx_%7B0%7D%7Cx_1%7D)%0A%5Cright%5D%0A%5Cend%7Baligned%7D%0A"></p>
</div>
</div>
</div>
<p>The equation above is tractable when conditioned on <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_0%7D">:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0Aq(%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t,%20x_0%7D)=%5Cmathcal%7BN%7D(%5Cmathbf%7Bx_%7Bt-1%7D;%20%5Cmathbf%7B%5Ctilde%7B%5Cmu_t%7D(%0Ax_t,%20x_0),%20%5Ctilde%7B%5Cbeta_t%7D%7DI%7D)%0A"></p>
<p>where:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%7B%5Ctilde%7B%5Cmu_t%7D(%0Ax_t,%20x_0)%20=%0A%5Cfrac%7B%20%5Csqrt%7B%5Cbar%7B%5Calpha%7D_%7Bt-1%7D%7D%20%5Cbeta_t%20%7D%7B%201%20-%20%5Cbar%7B%5Calpha%7D_t%7Dx_0%0A+%0A%5Cfrac%7B%20%5Csqrt%7B%5Calpha_t%7D(1-%5Cbar%7B%5Calpha%7D_%7Bt-1%7D)%20%7D%7B%201%20-%20%5Cbar%7B%5Calpha%7D_t%7D%20x_t%0A%7D%0A"></p>
<p>and</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctilde%7B%5Cbeta%7D_t=%5Cfrac%7B%201-%5Cbar%7B%5Calpha%7D_%7Bt-1%7D%20%7D%7B1-%5Cbar%7B%5Calpha%7D_t%7D%5Cbeta_t%0A"></p>
<p>All KL divergences in the loss are comparisons between Gaussians, which can be calculated in closed form instead of Monte Carlo estimates.</p>
</section>
</section>
<section id="diffusion-models-and-denoising-autoencoders" class="level2">
<h2 class="anchored" data-anchor-id="diffusion-models-and-denoising-autoencoders">Diffusion Models and Denoising Autoencoders</h2>
<section id="reverse-process-and-mathbfl_1t-1" class="level3">
<h3 class="anchored" data-anchor-id="reverse-process-and-mathbfl_1t-1">Reverse Process and <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7BL_%7B1:T-1%7D%7D"></h3>
<p>The forward process variances <img src="https://latex.codecogs.com/png.latex?%5Cbeta_%7Bt%7D"> are constants (hyperparameters), thus <img src="https://latex.codecogs.com/png.latex?L_t"> is a constant during training and can be ignored.</p>
<p>We now discuss <img src="https://latex.codecogs.com/png.latex?p_%5Ctheta(%20%5Cmathbf%7Bx_%7Bt-1%7D%7Cx_t%7D%20)%20=%20%5Cmathcal%7BN%7D(%20%5Cmathbf%7Bx_%7Bt-1%7D;%20%5Cmu_%5Ctheta(x_t,%20t),%20%5Csum_%5Ctheta(x_t,%20t%20)%7D%20)"> . First, we set <img src="https://latex.codecogs.com/png.latex?%5Csum_%5Ctheta(%20%5Cmathbf%7Bx_t,%20t%7D%20)%20=%20%5Csigma_t%5E2%5Cmathbf%7BI%7D"> to untrained constant. Experimentally, <img src="https://latex.codecogs.com/png.latex?%5Csigma_t%5E2=%5Cbeta_t"> and <img src="https://latex.codecogs.com/png.latex?%5Csigma_t%5E2=%5Ctilde%7B%5Cbeta%7D_t=%5Cfrac%7B1-%5Ctilde%7B%5Calpha%7D_%7Bt-1%7D%7D%7B1-%5Ctilde%7B%5Calpha%7D_t%7D%5Cbeta_t"> had similar results.</p>
<p>Second, the mean is parameterized by the following analysis of <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7BL_t%7D">, where <img src="https://latex.codecogs.com/png.latex?p_%5Ctheta(%5Cmathbf%7Bx_%7Bt-1%7D%20%7C%20x_t%7D%20)=%5Cmathcal%7BN%7D(%20%5Cmathbf%7Bx_%7Bt-1%7D%20;%20%5Cmu_%5Ctheta(x_t;t),%20%5Csigma_t%5E2I%20%7D%20)"> :</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AL_%7Bt-1%7D=%5Cmathbb%7BE%7D_q%20%5Cleft%5B%0A%5Cfrac%7B1%7D%7B2%5Csigma_t%5E2%7D%5CVert%0A%5Cmathbf%7B%0A%5Ctilde%7B%5Cmu%7D_t(x_t,%20x_0)%20-%20%5Cmu_%5Ctheta(x_t,%20t)%0A%7D%0A%5CVert%5E2%0A%5Cright%5D%0A+%0AC%0A"></p>
<p>where C is a constant that does not depend on <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Ctheta%7D">. The variance terms disappeared since they are the same between the forward and reverse processes. Hence, the most straightforward parameterization of <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Cmu_%5Ctheta%7D"> is a model that predicts <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Ctilde%7B%5Cmu%7D_t%7D">.</p>
<p>However, we can expand the equation above further by reparameterizing <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_t(x_0,%20%5Cepsilon)=%5Csqrt%7B%5Cbar%7B%5Calpha%7D_t%7Dx_0%20+%20%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%5Cepsilon%7D"> <img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Baligned%7D%0AL_%7Bt-1%7D-C&amp;=E_%7B%5Cmathbf%7Bx_0%7D,%20%5Cepsilon%7D%20%5Cleft%5B%0A%5Cfrac%7B1%7D%7B2%5Csigma_t%5E2%7D%5CVert%0A%5Cmathbf%7B%5Ctilde%7B%5Cmu_t%7D%5Cleft(%0A%20%20x_t(%0A%20%20%20%20x_0,%20%5Cepsilon),%0A%20%20%20%20%5Cfrac%7B1%7D%7B%20%5Csqrt%7B%5Cbar%7B%5Calpha%7D_t%7D%20%7D(x_t(x_0,%20%5Cepsilon)%20-%20%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%5Cepsilon)%0A%5Cright)%7D%0A-%0A%5Cmathbf%7B%0A%5Cmu_%5Ctheta(x_t(x_0,%20%5Cepsilon),%20t)%0A%5CVert%5E2%0A%7D%0A%5Cright%5D%5C%5C%0A&amp;=E_%7B%5Cmathbf%7Bx_0%7D,%20%5Cepsilon%7D%20%5Cleft%5B%0A%5Cmathbf%7B%0A%5Cfrac%7B1%7D%7B2%5Csigma_t%5E2%7D%5CVert%0A%5Cfrac%7B1%7D%7B%5Csqrt%7B%5Calpha_t%7D%7D%20%5Cleft(%0Ax_t(x_0,%20%5Cepsilon)-%5Cfrac%7B%5Cbeta_t%7D%7B%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%7D%5Cepsilon%0A%5Cright)%0A-%0A%5Cmu_%5Ctheta(x_t(x_0,%20%5Cepsilon),%20t)%0A%5CVert%5E2%0A%7D%0A%5Cright%5D%5C%5C%0A%5Cend%7Baligned%7D%0A"></p>
<p>The above equation reveals that <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Cmu_%5Ctheta%7D"> must predict <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%20%5Cfrac%7B1%7D%7B%5Csqrt%7B%5Calpha_t%7D%7D%5Cleft(x_t%20-%20%5Cfrac%7B%5Cbeta_t%7D%7B%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%7D%5Cepsilon%20%5Cright)%20%7D"> given <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_t%7D">. We may choose the following parameterization:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathbf%20%7B%0A%5Cmu_%5Ctheta(x_t,%20t)=%5Ctilde%7B%5Cmu%7D_t%5Cleft(%0Ax_t,%0A%5Cfrac%7B1%7D%7B%5Csqrt%7B%5Cbar%7Ba%7D_t%7D%7D(x_t-%5Csqrt%7B1-%5Calpha_t%7D%5Cepsilon_%5Ctheta(x_t))%0A%5Cright)%0A=%5Cfrac%7B1%7D%7B%5Csqrt%7B%5Calpha_t%7D%7D%20%5Cleft(%0Ax_t-%5Cfrac%7B%5Cbeta_t%7D%7B%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%7D%5Cepsilon_%5Ctheta(x_t,%20t)%0A%5Cright)%0A%7D%0A"></p>
<p>Where <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Cepsilon_%5Ctheta%7D"> is a function approximator to predict <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Cepsilon%7D"> from <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_t%7D">. We choose the above parameterization because it is in the same form as <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Ctilde%7B%5Cmu%7D(x_t,%20x_0)%7D">.</p>
<p>To sample <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_%7Bt-1%7D%20%5Csim%20p_%5Ctheta(x_%7Bt-1%7D%7Cx_t)%7D"> is to compute <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bx_%7Bt-1%7D%7D=%5Cfrac%7B1%7D%7B%5Csqrt%7B%5Calpha_t%7D%7D%5Cleft(%20%5Cmathbf%7Bx_t%7D%20-%20%5Cfrac%7B%5Cbeta_t%7D%7B%5Csqrt%7B1-%5Ctilde%7B%5Calpha%7D_t%7D%7D%5Cmathbf%7B%5Cepsilon%7D_%5Ctheta(x_t,%20t)%20%5Cright)%20+%20%5Csigma_t%5Cmathbf%7Bz%7D"> , where <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7Bz%7D%20%5Csim%20%5Cmathcal%7BN%7D(0,%20I)"> . Furthermore, the loss simplifies to:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AE_%7B%5Cmathbf%7Bx_0%7D,%20%5Cepsilon%7D%20%5Cleft%5B%0A%5Cmathbf%7B%0A%5Cfrac%7B%5Cbeta_t%5E2%7D%7B2%5Csigma_t%5E2%5Calpha_t(1-%5Cbar%7B%5Calpha%7D_t)%7D%0A%5CVert%0A%5Cepsilon%0A-%0A%5Cepsilon_%5Ctheta(%0A%5Csqrt%7B%5Cbar%7B%5Calpha%7D_t%7Dx_0+%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%5Cepsilon,%20t%0A)%0A%5CVert%5E2%0A%7D%0A%5Cright%5D%0A"></p>
<p>To summarize, we can train the reverse process mean function approximator <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Cmu_%5Ctheta%7D"> to predict <img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7B%5Cmu_t%7D">, or we can train <img src="https://latex.codecogs.com/png.latex?%5Cepsilon_%5Ctheta"> to predict <img src="https://latex.codecogs.com/png.latex?%5Cepsilon">.</p>
<p><img src="https://maitbayev.github.io/posts/denoising-diffusion-probabilistic-models/images/figure4.jpg" class="img-fluid"></p>
</section>
<section id="simplified-training-objective" class="level3">
<h3 class="anchored" data-anchor-id="simplified-training-objective">Simplified Training Objective</h3>
<p>It is simpler to implement to train on the following variant of the lower variational bound, which is a <strong>weighted variational bound</strong>:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AE_%7B%5Cmathbf%7Bx_0%7D,%20%5Cepsilon%7D%20%5Cleft%5B%0A%5Cmathbf%7B%0A%5CVert%0A%5Cepsilon%0A-%0A%5Cepsilon_%5Ctheta(%0A%5Csqrt%7B%5Cbar%7B%5Calpha%7D_t%7Dx_0+%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%5Cepsilon,%20t%0A)%0A%5CVert%5E2%0A%7D%0A%5Cright%5D%0A"></p>
<p>This also leads to better sample quality, since it down-weights loss terms corresponding to small <strong>t</strong> so that the network can focus on more difficult denoising tasks at larger <strong>t</strong> terms.</p>


</section>
</section>
</section>

 ]]></description>
  <category>diffusion</category>
  <category>paper</category>
  <guid>https://maitbayev.github.io/posts/denoising-diffusion-probabilistic-models/</guid>
  <pubDate>Sun, 14 Jul 2024 23:00:00 GMT</pubDate>
  <media:content url="https://maitbayev.github.io/posts/denoising-diffusion-probabilistic-models/images/image.jpg" medium="image" type="image/jpeg"/>
</item>
</channel>
</rss>
