diff --git a/notes/Machine-Learning-with-Gaussian-elimination.ipynb b/notes/Machine-Learning-with-Gaussian-elimination.ipynb index 37b2e4f..8e45a02 100644 --- a/notes/Machine-Learning-with-Gaussian-elimination.ipynb +++ b/notes/Machine-Learning-with-Gaussian-elimination.ipynb @@ -9,7 +9,7 @@ "We show that a simple linear neuron can be \"learned\" with Gaussian elimination, and indeed is much\n", "faster and more accurate upon doing so. (Much of machine learning is non-linear.)\n", "\n", - "Our model of the universe is that we have an unknow 3-vector\n", + "Our model of the universe is that we have an unknown 3-vector\n", "\n", "$w = \\left[ \\begin{array}{c} w_1 \\\\ w_2 \\\\ w_3 \\end{array} \\right]$\n", "\n", @@ -23,19 +23,19 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "3-element Array{Float64,1}:\n", - " 0.982331\n", - " 0.1774 \n", - " 0.212845" + "3-element Vector{Float64}:\n", + " 0.25180627297687963\n", + " 0.5918222257721607\n", + " 0.641067683043823" ] }, - "execution_count": 76, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -46,19 +46,28 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "using LinearAlgebra" + ] + }, + { + "cell_type": "code", + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "3-element Array{Float64,1}:\n", - " 0.881336\n", - " 1.0557 \n", - " 0.485883" + "3-element Vector{Float64}:\n", + " 1.0689046339958201\n", + " 1.0755410829151852\n", + " 0.8485464788238004" ] }, - "execution_count": 84, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -76,19 +85,19 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "3-element Array{Float64,1}:\n", + "3-element Vector{Float64}:\n", " 0.0\n", " 0.0\n", " 0.0" ] }, - "execution_count": 81, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -100,19 +109,19 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "3-element Array{Float64,1}:\n", - " 0.982331\n", - " 0.1774 \n", - " 0.212845" + "3-element Vector{Float64}:\n", + " 0.2518062729768782\n", + " 0.5918222257721599\n", + " 0.6410676830438242" ] }, - "execution_count": 83, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -124,19 +133,19 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "3-element Array{Float64,1}:\n", - " 0.982331\n", - " 0.1774 \n", - " 0.212845" + "3-element Vector{Float64}:\n", + " 0.25180627297687963\n", + " 0.5918222257721607\n", + " 0.641067683043823" ] }, - "execution_count": 85, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -147,10 +156,8 @@ }, { "cell_type": "code", - "execution_count": 115, - "metadata": { - "collapsed": true - }, + "execution_count": 7, + "metadata": {}, "outputs": [], "source": [ "## Recover w with a machine learning package -- 18.06 students might just want to execute as a black box\n", @@ -168,74 +175,138 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[0.982331 0.1774 0.212845] : <== estimate after training\n" + "Float32[0.060145017 0.4654307 0.5881613] : <== estimate after training\n" ] } ], "source": [ "# t ... a model to be learned to fit the data\n", "t = Dense(3,1)\n", - "loss(x,y) = Flux.mse(t(x),y)\n", - "opt = ADAM(Flux.params(t)[1:1])\n", - "Flux.train!(loss, Iterators.repeated( (X',y'), 20000), opt) # 20000 steps of training\n", - "println((t.W).data, \" : <== estimate after training\")" + "loss(t,x,y) = Flux.mse(t(x),y)\n", + "opt_state = Flux.setup(ADAM(), t)\n", + "Flux.train!(loss, t, Iterators.repeated( (X',y'), 20000), opt_state) # 20000 steps of training\n", + "println((t.weight), \" : <== estimate after training\")" ] }, { "cell_type": "code", - "execution_count": 102, - "metadata": { - "collapsed": true - }, + "execution_count": 9, + "metadata": {}, "outputs": [], "source": [ - "## Adding more data does not help a whole lot" + "using Statistics" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "## Adding more data helps pretty quickly, but many cycles are still important\n", + "\n", + "# sample sizes to test\n", + "ns = collect(1:5)\n", + "\n", + "# how many repeats to test at each sample size\n", + "nrepeats = 50\n", + "nrs = range(start = 1,stop = nrepeats,step = 1)\n", + "\n", + "# initialize matricies to capture results\n", + "mses = zeros(length(ns), nrepeats)\n", + "shortmses = zeros(length(ns), nrepeats)\n", + "\n", + "for (ix, n) in enumerate(ns)\n", + " for (jx, rn) in enumerate(nrs)\n", + " X = randn(n,3)\n", + " y = X*w\n", + " t = Dense(3,1)\n", + " loss(t,x,y) = Flux.mse(t(x),y)\n", + " opt_state = Flux.setup(ADAM(), t)\n", + " Flux.train!(loss, t, Iterators.repeated( (X',y'), 1000), opt_state) # 1000 steps of training\n", + " shortmses[ix, jx] = Flux.mse(t.weight[1,:], w)\n", + " Flux.train!(loss, t, Iterators.repeated( (X',y'), 20000), opt_state) # 20000 steps of training\n", + " mses[ix, jx] = Flux.mse(t.weight[1,:], w)\n", + " end\n", + "end\n" ] }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 11, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0.948837 0.17883 0.218774] : <== estimate after training\n" - ] + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxNElEQVR4nO3dd3RU1d7G8e+k994hhNBLaIIiIBBASqhWuIJgAYTXgghYsKKiWAEVxQ5WimKXYhAIIEV67wRCSQgtvZFk3j9OGIwUMyFhSHg+a+11mTPnnPmN8ZLHfXYxmc1mMyIiIiKVhJ2tCxAREREpSwo3IiIiUqko3IiIiEilonAjIiIilYrCjYiIiFQqCjciIiJSqSjciIiISKXiYOsCrrTCwkKOHj2Kp6cnJpPJ1uWIiIhICZjNZtLT0wkLC8PO7tJ9M9dcuDl69Cjh4eG2LkNERERK4dChQ1StWvWS51xz4cbT0xMw/uF4eXnZuBoREREpibS0NMLDwy2/xy/lmgs3Zx9FeXl5KdyIiIhUMCUZUqIBxSIiIlKpKNyIiIhIpaJwIyIiIpXKNTfmRkRErl0FBQWcOXPG1mXIRTg5Of3nNO+SULgREZFKz2w2k5SUREpKiq1LkUuws7MjMjISJyeny7qPwo2IiFR6Z4NNUFAQbm5uWsT1KnR2kd3ExESqVat2WT8jhRsREanUCgoKLMHG39/f1uXIJQQGBnL06FHy8/NxdHQs9X1sOqB46dKl9OrVi7CwMEwmEz/99NN/XhMXF0fz5s1xcXGhRo0afPjhh+VfqIiIVFhnx9i4ubnZuBL5L2cfRxUUFFzWfWwabjIzM2nSpAlTpkwp0fnx8fF0796dtm3bsmHDBp5++mlGjBjBnDlzyrlSERGp6PQo6upXVj8jmz6WiomJISYmpsTnf/jhh1SrVo3JkycDUL9+fdauXctbb73F7bfffsFrcnNzyc3NtbxOS0u7rJpFRETk6lah1rlZuXIlXbp0KXasa9eurF279qJT+yZMmIC3t7eladNMERGRyq1ChZukpCSCg4OLHQsODiY/P58TJ05c8JqxY8eSmppqaYcOHboSpYqIyDUqOjqakSNHlvj8AwcOYDKZ2LhxY7nVdK2pcLOl/v08zmw2X/D4Wc7Ozjg7O5d7XSIiUrH81/iOe+65h+nTp1t93x9++MGqmT7h4eEkJiYSEBBg9WeVlQMHDhAZGcmGDRto2rSpzeooKxUq3ISEhJCUlFTsWHJyMg4ODpreJyIiVklMTLT8edasWTz//PPs2rXLcszV1bXY+WfOnClRaPHz87OqDnt7e0JCQqy6Ri6tQj2WatWqFbGxscWO/fHHH7Ro0eKy5sOXhay8fKo/9TvVn/qdrLx8m9YiIiL/LSQkxNK8vb0xmUyW1zk5Ofj4+DB79myio6NxcXHh66+/5uTJk9x1111UrVoVNzc3GjVqxIwZM4rd99+PpapXr86rr77K/fffj6enJ9WqVePjjz+2vP/vx1JLlizBZDLx559/0qJFC9zc3GjdunWx4AUwfvx4goKC8PT0ZMiQITz11FOX7HU5ffo0AwYMIDAwEFdXV2rXrs20adMAiIyMBKBZs2aYTCaio6Mt102bNo369evj4uJCvXr1+OCDD86rfebMmbRu3RoXFxcaNmzIkiVLSvS55cWm4SYjI4ONGzdafqDx8fFs3LiRhIQEwBgvM2jQIMv5w4cP5+DBg4waNYodO3bw+eef89lnnzFmzBhblC8iIpXck08+yYgRI9ixYwddu3YlJyeH5s2b89tvv7F161YeeOABBg4cyOrVqy95n7fffpsWLVqwYcMGHnzwQf7v//6PnTt3XvKaZ555hrfffpu1a9fi4ODA/fffb3nvm2++4ZVXXuH1119n3bp1VKtWjalTp17yfs899xzbt29n3rx57Nixg6lTp1oehf39998ALFy4kMTERH744QcAPvnkE5555hleeeUVduzYwauvvspzzz3HF198Uezejz/+OKNHj2bDhg20bt2a3r17c/Lkyf/83HJjtqHFixebgfPaPffcYzabzeZ77rnH3L59+2LXLFmyxNysWTOzk5OTuXr16uapU6da9ZmpqalmwJyamlpG38KQmXvGHPHkb+Z6T35vNr/gZbTcjDL9DBERsV52drZ5+/bt5uzs7IueM23aNLO3t7fldXx8vBkwT548+T/v3717d/Po0aMtr9u3b29+9NFHLa8jIiLMd999t+V1YWGhOSgoyPL76+xnbdiwwWw2n/vduHDhQss1v//+uxmwfIeWLVuaH3rooWJ1tGnTxtykSZOL1tmrVy/zfffdd8H3/l3DWeHh4eZvv/222LGXX37Z3KpVq2LXvfbaa5b3z5w5Y65atar59ddf/8/P/bdL/ays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ltUWERERKEW4KSgoYPr06fz5558kJydTWFhY7P1FixaV+F6jRo1i4MCBtGjRglatWvHxxx+TkJBgecw0duxYjhw5wpdffglAr169GDp0KFOnTqVr164kJiYycuRIbrjhBsLCwqz9KiIiIlIJWR1uHn30UaZPn06PHj2Iioq6rFUE+/Xrx8mTJ3nppZdITEwkKiqKuXPnEhERARgzsxISEizn33vvvaSnpzNlyhRGjx6Nj48PHTt25PXXXy91DSIiIlK5mMxWPs8JCAjgyy+/pHv37uVVU7lKS0vD29ub1NTUMh1cnJWXT4PnF+BKDjtc7jcOPn0UnNzL7DOk/OjnJyJydbPm97fVs6WcnJyoVatWqYsTERERKU9Wh5vRo0fzzjvvaACviIiIXJWsHnOzfPlyFi9ezLx582jYsCGOjo7F3v/hhx/KrDgRERERa1kdbnx8fIpN3RYRERG5mlgdbqZNm1YedYiIiIiUCavH3IiIiIhczUq1QvH333/P7NmzSUhIIC8vr9h769evL5PCRERERErD6p6bd999l/vuu4+goCA2bNjADTfcgL+/P/v37ycmJqY8ahQREREpMavDzQcffMDHH3/MlClTcHJy4oknniA2NpYRI0aQmppaHjWKiIiIlJjV4SYhIYHWrVsD4OrqSnp6OgADBw5kxowZZVudiIiIiJWsDjchISGcPHkSgIiICFatWgVAfHy8FvYTERERm7M63HTs2JFff/0VgMGDB/PYY4/RuXNn+vXrp/VvRERExOasni318ccfU1hYCMDw4cPx8/Nj+fLl9OrVi+HDh5d5gSIiIiLWsDrc2NnZYWd3rsOnb9++9O3bt0yLEhERESktLeInIiIilYrCjYiIiFQqCjciIiJSqSjciIiISKVidbjJzs4mKyvL8vrgwYNMnjyZP/74o0wLExERESkNq8NNnz59+PLLLwFISUmhZcuWvP322/Tp04epU6eWeYEiIiIi1rA63Kxfv562bdsCxu7gwcHBHDx4kC+//JJ33323zAsUERERsYbV4SYrKwtPT08A/vjjD2677Tbs7Oy48cYbOXjwYJkXKCIiImINq8NNrVq1+Omnnzh06BALFiygS5cuACQnJ+Pl5VXmBYqIiIhYw+pw8/zzzzNmzBiqV69Oy5YtadWqFWD04jRr1qzMCxQRERGxhtXbL9xxxx3cdNNNJCYm0qRJE8vxTp06cdttt5VpcSIiIiLWsrrn5v7778fd3Z1mzZoV22OqYcOGvP7662VanIiIiIi1rA43X3zxBdnZ2ecdz87OtkwRFxEREbGVEj+WSktLw2w2YzabSU9Px8XFxfJeQUEBc+fOJSgoqFyKFBERESmpEocbHx8fTCYTJpOJOnXqnPe+yWTixRdfLNPiRERERKxV4nCzePFizGYzHTt2ZM6cOfj5+Vnec3JyIiIigrCwsHIpUkRERKSkShxu2rdvD0B8fDzh4eHFBhOLiIiIXC2sngoeERFBSkoKf//9N8nJyRQWFhZ7f9CgQWVWnIiIiIi1rA43v/76KwMGDCAzMxNPT09MJpPlPZPJpHAjIiIiNmX1s6XRo0dz//33k56eTkpKCqdPn7a0U6dOlUeNIiKXlJWXT/Wnfqf6U7+TlZdv63JExMasDjdHjhxhxIgRuLm5lUc9IiIiIpfF6nDTtWtX1q5dWx61iIiIiFy2Eo25+eWXXyx/7tGjB48//jjbt2+nUaNGODo6Fju3d+/eZVuhiIiIiBVKFG5uueWW84699NJL5x0zmUwUFBRcdlEiIiIipVWicPPv6d4iIiIiVyutxCciIiKVitXr3Lz77rsXPG4ymXBxcaFWrVq0a9cOe3v7yy5ORERExFpWh5tJkyZx/PhxsrKy8PX1xWw2k5KSgpubGx4eHiQnJ1OjRg0WL15MeHh4edQsIiIiclFWP5Z69dVXuf7669mzZw8nT57k1KlT7N69m5YtW/LOO++QkJBASEgIjz32WHnUKyIiInJJVvfcPPvss8yZM4eaNWtajtWqVYu33nqL22+/nf379/PGG29w++23l2mhIiIiIiVhdc9NYmIi+fnnL2+en59PUlISAGFhYaSnp19+dSIiIiJWsjrcdOjQgWHDhrFhwwbLsQ0bNvB///d/dOzYEYAtW7YQGRlZdlWKiJRUXiaM8zZaXqatqxERG7A63Hz22Wf4+fnRvHlznJ2dcXZ2pkWLFvj5+fHZZ58B4OHhwdtvv13mxYqIiIj8F6vH3ISEhBAbG8vOnTvZvXs3ZrOZevXqUbduXcs5HTp0KNMiRURERErK6nBzVr169ahXr15Z1iIiIiJy2UoUbkaNGsXLL7+Mu7s7o0aNuuS5EydOLJPCREREREqjROFmw4YNnDlzxvLnizGZTGVTlYiIiEgplSjcLF68+IJ/FhEREbnalHrjzL1797JgwQKys7MBMJvNZVaUiIiISGlZHW5OnjxJp06dqFOnDt27dycxMRGAIUOGMHr0aKsL+OCDD4iMjMTFxYXmzZuzbNmyS56fm5vLM888Q0REBM7OztSsWZPPP//c6s8VERGRysnqcPPYY4/h6OhIQkICbm5uluP9+vVj/vz5Vt1r1qxZjBw5kmeeeYYNGzbQtm1bYmJiSEhIuOg1ffv25c8//+Szzz5j165dzJgxQ7O2RERExMLqqeB//PEHCxYsoGrVqsWO165dm4MHD1p1r4kTJzJ48GCGDBkCwOTJk1mwYAFTp05lwoQJ550/f/584uLi2L9/P35+fgBUr17d2q8gIiIilZjVPTeZmZnFemzOOnHiBM7OziW+T15eHuvWraNLly7Fjnfp0oUVK1Zc8JpffvmFFi1a8MYbb1ClShXq1KnDmDFjLON+LiQ3N5e0tLRiTURERCovq8NNu3bt+PLLLy2vTSYThYWFvPnmm1atTHzixAkKCgoIDg4udjw4ONiyAee/7d+/n+XLl7N161Z+/PFHJk+ezPfff89DDz100c+ZMGEC3t7elhYeHl7iGkVERKTisfqx1Jtvvkl0dDRr164lLy+PJ554gm3btnHq1Cn++usvqwv499o4ZrP5ouvlFBYWYjKZ+Oabb/D29gaMR1t33HEH77//Pq6uruddM3bs2GILD6alpSngiIiIVGJW99w0aNCAzZs3c8MNN9C5c2cyMzO57bbb2LBhAzVr1izxfQICArC3tz+vlyY5Ofm83pyzQkNDqVKliiXYANSvXx+z2czhw4cveI2zszNeXl7FmoiIiFRepdpbKiQkhBdffPGyPtjJyYnmzZsTGxvLrbfeajkeGxtLnz59LnhNmzZt+O6778jIyMDDwwOA3bt3Y2dnd94AZxEREbk2Wd1z06ZNG55++mliY2PJzMy8rA8fNWoUn376KZ9//jk7duzgscceIyEhgeHDhwPGI6VBgwZZzu/fvz/+/v7cd999bN++naVLl/L4449z//33X/CRlIiIiFx7rO656dmzJ3FxcUyZMoWcnByaN29O+/btiY6O5qabbrL0qJREv379OHnyJC+99BKJiYlERUUxd+5cIiIiAEhMTCy25o2HhwexsbE88sgjtGjRAn9/f/r27cv48eOt/RoiIiJSSVkd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FBREvXr1ALjvvvv466+/mDlzJps3b+bOO++kW7du7Nmz56L/7ESkDJhFRKzw/fffm319fc0uLi7m1q1bm8eOHWvetGnTJa+ZPXu22d/f3/J62rRpZsC8d+9ey7Fhw4aZ3dzczOnp6ZZjXbt2NQ8bNszyOiIiwtytW7di9+7Xr585JibG8how//jjj2az2Wz+7LPPzHXr1jUXFhZa3s/NzTW7urqaFyxYcMFae/XqZb7vvvsu+F58fLwZMG/YsOG89+bMmWN2dnY2L1u2zGw2m8179+41m0wm85EjR4qd16lTJ/PYsWMveH8RKRvquRERq9x+++0cPXqUX375ha5du7JkyRKuu+46pk+fbjln8eLFdO7cmSpVquDp6cmgQYM4efIkmZmZlnPc3NyoWbOm5XVwcDDVq1fHw8Oj2LHk5ORin9+qVavzXu/YseOCta5bt469e/fi6elp6XXy8/MjJyeHffv2XfCa//u//2PmzJk0bdqUJ554ghUrVvznP5MNGzYwaNAg3n//fW666SYA1q9fj9lspk6dOpbP9vDwIC4u7qKfLSJlQwOKRcRqLi4udO7cmc6dO/P8888zZMgQXnjhBe69914OHjxI9+7dGT58OC+//DJ+fn4sX76cwYMHc+bMGcs9HB0di93TZDJd8FhhYeF/1mMymS54vLCwkObNm/PNN9+c915gYOAFr4mJieHgwYP8/vvvLFy4kE6dOvHQQw/x1ltvXfD8pKQkevfuzeDBgxk8eHCxz7a3t2fdunXY29sXu+afAU5Eyp7CjYhctgYNGljWllm7di35+fm8/fbb2NkZncOzZ88us89atWrVea/PjnH5t+uuu45Zs2YRFBSEl5dXiT8jMDCQe++9l3vvvZe2bdvy+OOPXzDc5OTk0KdPH+rVq8fEiROLvdesWTMKCgpITk6mbdu2Jf5sEbl8eiwlIiV28uRJOnbsyNdff83mzZuJj4/nu+++44033qBPnz4A1KxZk/z8fN577z3279/PV199xYcfflhmNfz111+88cYb7N69m/fff5/vvvuORx999ILnDhgwgICAAPr06cOyZcuIj48nLi6ORx99lMOHD1/wmueff56ff/6ZvXv3sm3bNn777Tfq169/wXOHDRvGoUOHePfddzl+/DhJSUkkJSWRl5dHnTp1GDBgAIMGDeKHH34gPj6eNWvW8PrrrzN37twy++chIudTuBGREvPw8KBly5ZMmjSJdu3aERUVxXPPPcfQoUOZMmUKAE2bNmXixIm8/vrrREVF8c033zBhwoQyq2H06NGsW7eOZs2a8fLLL/P222/TtWvXC57r5ubG0qVLqVatGrfddhv169fn/vvvJzs7+6I9OU5OTowdO5bGjRvTrl077O3tmTlz5gXPjYuLIzExkQYNGhAaGmppZ8fpTJs2jUGDBjF69Gjq1q1L7969Wb16NeHh4WXzD0NELshkNpvNti5CRKQkqlevzsiRIxk5cqStSxGRq5h6bkRERKRSUbgRERGRSkWPpURERKRSUc+NiIiIVCoKNyIiIlKpKNyIiIhIpaJwIyIiIpWKwo2IiIhUKgo3IiIiUqko3IiIiEilonAjIiIilcr/AwnfGJb27VGwAAAAAElFTkSuQmCC", + "text/plain": [ + "Figure(PyObject
)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "PyObject " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "n = 3000\n", - "X = randn(n,3)\n", - "y = X*w\n", - "t = Dense(3,1)\n", - "loss(x,y) = Flux.mse(t(x),y)\n", - "opt = ADAM(Flux.params(t)[1:1])\n", - "Flux.train!(loss, Iterators.repeated( (X',y'), 2000), opt) # 2000 steps of training\n", - "println((t.W).data, \" : <== estimate after training\")" + "using PyPlot\n", + "fig, ax = subplots(1)\n", + "ax.errorbar(ns .- 0.01,\n", + " mean(shortmses, dims=2)[:, 1],\n", + " yerr=std(shortmses, dims=2)[:, 1],\n", + " label=\"1000\")\n", + "ax.errorbar(ns .+ 0.01, \n", + " mean(mses, dims=2)[:, 1],\n", + " yerr=std(mses, dims=2)[:, 1],\n", + " label=\"20000\")\n", + "\n", + "\n", + "ax.set_ylabel(\"MSE between network weights and w\")\n", + "ax.set_xlabel(\"Sample size\")\n", + "ax.set_xticks(ns)\n", + "ax.legend(title=\"Training steps\")" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { + "@webio": { + "lastCommId": null, + "lastKernelId": null + }, "anaconda-cloud": {}, "kernelspec": { - "display_name": "Julia 0.6.0", + "display_name": "Julia 1.8.3", "language": "julia", - "name": "julia-0.6" + "name": "julia-1.8" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "0.6.0" + "version": "1.8.3" }, "widgets": { "state": {