Add files via upload

This commit is contained in:
Peter Norvig authored and GitHub committed 2023-05-16 11:26:38 -07:00
1 parent f0ee69001b
commit 2807ac61c1
1 file changed
+112 -49
+112 -49
View File
@@ -9,13 +9,17 @@
" \n",
"# Wei-Hwa's Diamond-Buying Game \n",
"\n",
"Wei-Hwa Huang writes: \"*You are playing a game where you are trying to buy diamonds with coins. You can buy a random bag of diamonds for 12 coins, look in the bag, and [immediately] decide whether to sell it back for 11 coins or keep it. You can also purchase a bag for 1 coin but you __must__ sell it back for 1 coin (i.e., you can basically figure out the distribution [by peeking at multiple bags for free]). What is a general strategy for maximizing the number of diamonds you keep (that is, total number of diamonds in bags not sold back)? Include analysis of end cases (e.g., if you spend your last 12 coins, it is never a good idea to sell the bag back).*\n",
"Wei-Hwa Huang poses this puzzle (slightly reworded by me): *You are playing a game where you are buying bags of diamonds with coins. You can buy a random bag of diamonds for 12 coins, look in the bag to see how many diamonds there are, and immediately decide whether to keep it or sell it back for 11 coins. You can also, for free, peek at as many random bags as you want, to get an idea of the distribution of diamonds. What is a general strategy for maximizing the number of diamonds in the bags you keep?*\n",
"\n",
"## Strategy\n",
"\n",
"A good strategy starts by peeking at enough 1-coin bags to have a good estimate of the probability distribution of bags. The result of the peeking is a discrete probability distribution: a dict of `{number_of_diamonds: probability}`. I'm assuming that \"number of diamonds\" is always a non-negative integer. The number of peeks you take will depend on how heavy-tailed you think the distribution might be, and on how much patience you have. \n",
"A good strategy starts by peeking at multiple bags to form a discrete probability distribution estimate. The number of peeks you take will depend on how heavy-tailed you think the distribution might be, and on how much patience you have. \n",
"\n",
"## Probability Distributions"
"## Probability Distributions\n",
" \n",
"I define `ProbDist` as a class to represent a discrete probability distribution as a dict of `{number_of_diamonds: probability}`. \n",
" \n",
"I also define `normal(mu, sigma, k)` to return a `ProbDist` formed from peeking at `k` random samples from a normal distribution with mean `mu` and standard deviation `sigma` (but limited to non-negative integer values)."
]
},
{
@@ -40,7 +44,7 @@
" \n",
"def normal(mu=100, sigma=10, k=1_000) -> ProbDist: \n",
" \"\"\"Probability distribution formed from k samples from a normal distribution, \n",
" N(mu, sigma); each sample is rounded to a non-negative integer.\"\"\" \n",
" 𝓝(mu, sigma); each sample is a non-negative integer.\"\"\" \n",
" return ProbDist(max(0, round(random.gauss(mu, sigma))) \n",
" for _ in range(k))\n",
"\n",
@@ -54,11 +58,9 @@
"source": [
"## Maximizing Expected Number of Diamonds\n",
"\n",
"Given a discrete probability distribution, and assuming that our goal is to maximize the expected (average) number of diamonds, one suggestion was to establish a **cutoff point**: any bags over the cutoff would be kept; others would be sold back (except that a bag should be kept if selling it back would not result in enough coins to buy another bag). But is that the best strategy? I don't think so, no matter what the cutoff point.\n",
"Given a discrete probability distribution, and assuming that our task is to optimally maximize the expected (average) number of diamonds, we can define a strategy that, in each situation, chooses to keep a bag or sell it back based on which action has the highest expected value, assuming the optimal strategy continues to be played.\n",
"\n",
"Rather than try to impose a strategy such as the cutoff-poiint strategy, it is better to go directly to the optimal strategy: the strategy that, in each situation, chooses to keep or sell back based on which action has the highest expected return, assuming the optimal strategy continues to be played.\n",
"\n",
"The function `expectation` returns a function `E` such that `E(c)` returns the expected number of diamonds you can obtain starting with `c` coins, and applying the optimal strategy."
"The function `expectation_fn` returns a function `E` such that `E(c)` returns the expected number of diamonds you can obtain starting with `c` coins under the optimal strategy."
]
},
{
@@ -69,9 +71,9 @@
"outputs": [],
"source": [
"def expectation_fn(p:ProbDist, buy=12, sell=11) -> Callable:\n",
" \"\"\"Returns a function that will compute the expected number of diamonds, given `coins`.\n",
" This is 0 if you can't afford a bag, or is the weighted average, over all possible bag values, of\n",
" the probability of the bag times the maximum of the expectations of keeping the bag or selling it back.\"\"\"\n",
" \"\"\"Returns a function to compute the optimal expected number of diamonds, given `coins`.\n",
" This is 0 if you can't afford a bag, or is the weighted average, over all bag values, of\n",
" the probability of the bag times the maximum expectation of keeping the bag or selling it back.\"\"\"\n",
" @functools.lru_cache(None)\n",
" def E(coins:int) -> float:\n",
" def keep(bag): return bag + E(coins - buy)\n",
@@ -102,7 +104,7 @@
{
"data": {
"text/plain": [
"1016.9165738912558"
"1010.1308028938253"
]
},
"execution_count": 3,
@@ -132,7 +134,7 @@
{
"data": {
"text/plain": [
"1018.7010335947339"
"1014.2406267797492"
]
},
"execution_count": 4,
@@ -162,7 +164,7 @@
{
"data": {
"text/plain": [
"100.53299999999999"
"100.08699999999996"
]
},
"execution_count": 5,
@@ -213,28 +215,26 @@
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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NZ91Xbp0sdijeOsQnKLiioK6jz/++GOaNWuGs7MzPj4+3H///Rw5ciTfedzd3Tlx4gS9e/fG3d2dkJAQJk+enO9ztLjv4RapYvjkk08UoHbs2KFyc3PNfvLy8szKjh8/Xjk6Oqrdu3crpZTauHGjsrOzUy+88IKpzKlTpxSgQkJCVIcOHdTq1avV119/rVq3bq0cHBzUtm3bTGUPHTqkvLy8VGRkpPrss8/U+vXr1eTJk5WdnZ2aOXOmqVxaWppq3LixcnNzUy+//LL65Zdf1OrVq9XTTz+tNm3apLKystS6desUoB5++GG1fft2tX37dnXixIlinScpKUn5+/urGjVqqE8++UT99NNP6qGHHlK1atVSgPr1118LvZYzZsxQgKpfv7566aWXVFxcnFqwYIFycnJSo0ePzneNPvnkk3zHANSMGTMsHvOVV15RcXFxaurUqQpQTzzxhGrQoIH6z3/+o+Li4tTo0aMVoFavXm3a/9dffzU9HwMGDFA//PCDWrZsmapTp47y9PRUf//9t6nspk2blKOjo+rYsaP68ssv1bp169SoUaPy1dX4mqlRo4YaO3as+vnnn9WqVavyvV6MkpOTVY0aNVT16tXVe++9p9atW6eeeOIJBagJEyYopZRKTU1V27dvV4GBgap9+/am5zArK8viMfV6veratatycnJSr732mlq/fr2aMWOGql27dr5raKzvqVOnTNuWLFmiXn/9dfX999+rzZs3q6VLl6pmzZqp+vXrq5ycnFK7/tY89ltfE2FhYapnz57qu+++U999952KjIxU3t7e6urVq/kez+3PZ0hIiAoNDTWVW7lypQLUk08+qdavX682bNig3nvvPfXUU09ZvKZFPQ/FfSw1atRQXbt2VatWrVLr1683u/6l9VzGx8erhx9+WAFq3bp1avv27erMmTNq+/btqnfv3srFxcX0GJKTk5VSSj366KPKwcFBTZ48Wa1bt06tWLFCNWjQQAUEBKikpCTTuTp37qx8fHxUSEiIWrx4sfr111/V5s2b1fXr11Xz5s2Vn5+fWrBggdqwYYN66623lJeXl7r33nuVXq83HcP4nEZHR6uvvvpK/fTTT6pLly7K3t7e9Ld35swZ9eSTTypAffPNN6b6pqamFvg81a9fX9WpU0d9/vnnavPmzWr16tVq8uTJpveo+Ph4Vbt2bdWiRQvT8eLj45VSSl29elWNGjVKff7552rTpk1q3bp1asqUKcrOzk4tXbrU7DzG57Fp06ZqxYoVatOmTWr//v2Fvt9a+nvr3Lmz8vX1VXXr1lXvvfeeiouLU4899pgCzM55/vx55evrq2rVqqU+/fRT9dNPP6nhw4ersLAwq96D9+/fr9zd3VVYWJh677331MaNG9WyZcvU4MGDVVpamlJKqaNHjyoPDw8VERGhPvvsM/Xjjz+qIUOGKEDNnTvXdCxL79PWvsdv27ZNaTQa9a9//Uv99NNPatOmTeqTTz5Rw4cPL7T+Sin1zDPPqCVLlqh169apTZs2qYULFyo/Pz+z4xfnmt7p59qGDRuUVqtVHTp0UN98843p89y4/61CQ0PVyJEjTbdff/11pdVq1YwZM9TGjRvVunXr1KJFi0yfu0W99kNDQ1VQUJCqXbu2+vjjj9Wvv/6qdu3aZfFcxfms69y5s+rcuXO+xzpy5EjTe2hRcYWl1/ns2bMVoIYMGaJ+/PFH9dlnn6natWsrLy8v9ddff5mdx9HRUTVs2FC9+eabasOGDeqll15SGo1GzZo1y1SuJO/hlpQoKLT0o9VqzcpmZWWpFi1aqPDwcHX48GEVEBCgOnfubBYMGP+QgoODVWZmpml7Wlqa8vHxUd27dzdti42NVTVr1sz35vfEE08oZ2dnlZKSopRS6uWXX1aAiouLK/BxXLx4Md8HSHHPM23aNKXRaNT+/fvNyvXo0aNYQeG8efPMtj/22GPK2dnZ9GFRkqBw/vz5ZuWaN29u+kMyys3NVdWrV1cDBw40bTP+oURFRZl9WJ0+fVo5ODioRx55xLStQYMGqkWLFio3N9fsXH379lVBQUFKp9MppW6+ZkaMGFHo9TCaPn26AtTOnTvNtk+YMEFpNBp17Ngx07bQ0FDVp0+fIo/5888/K0C99dZbZttfe+01q4LCW+n1epWbm6sSEhIUoNasWWO6706vv7WP3fiaiIyMNPt72rVrlwLUypUrlVJK6XQ6FRwcXODzeWtQ+MQTT6hq1apZfMxFsfQ8FPexREREmAXYBbnT59L4HF28eNFs/5EjRyo3Nzezbdu3b7f4fJ45c0a5uLioqVOnmrZ17txZAWrjxo1mZV9//XVlZ2dn+nJstGrVKgWon376ybQNUAEBAaaARCnDh7SdnZ16/fXXTdveeOONQl+jt7p06ZIC1KJFiwot17hxY4sffLfLy8tTubm56uGHH1YtWrQwuw9QXl5epvdIo8LebwsKCi29dho1aqRiY2NNt5999lml0WjUoUOHzMrFxsZa9R587733qmrVqpm+AFjyr3/9Szk5Oal//vnHbHuvXr2Uq6ur6QtYYUFhUe/xb775pgLMvsyVhE6Line truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"def plot(sigmas=(60, 40, 25, 5), coins=range(45, 76)):\n",
"def plot(sigmas=(50, 25, 5), coins=range(45, 76)):\n",
" \"\"\"Plot the expected number of diamonds for different sigma/starting coins combinations.\"\"\"\n",
" for sigma in sigmas:\n",
" E = expectation_fn(normal(100, sigma))\n",
" vals = [E(c) for c in coins]\n",
" plt.plot(coins, vals, 'o:', label=f'sigma={sigma}')\n",
" plt.title('Expected number of diamonds for different starting coins and distributions')\n",
" plt.legend(); plt.xlabel('starting coins'); plt.ylabel('diamonds')\n",
" plt.legend(); plt.xlabel('starting coins'); plt.ylabel('diamonds'); plt.grid(True)\n",
"\n",
"plot()"
]
@@ -273,31 +273,28 @@
"def scatter(p:ProbDist, coins=range(45, 76)):\n",
" \"\"\"Plot (coins, bag value) points for which the optimal action is to sell back.\"\"\"\n",
" fn = decision_fn(p)\n",
" XY = [(c, x) for c in coins for x in range(min(p), max(p) + 1) \n",
" XY = [(c, x) for c in coins for x in range(max(min(p), 60), max(p) + 1) \n",
" if fn(c, x) == 'sellback']\n",
" plt.scatter(*T(XY), marker='.')\n",
" plt.xlabel('coins'); plt.ylabel('bag value'); \n",
" plt.title('Combinations of coins / bag value that should be sold back')\n",
"\n",
"def T(matrix): \"Transpose\"; return zip(*matrix)"
" X, Y = zip(*XY)\n",
" plt.scatter(X, Y, marker='.'); \n",
" plt.xlabel('coins'); plt.ylabel('bag value'); plt.grid(True)\n",
" plt.title('Combinations of coins / bag value that should be sold back')"
]
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 16,
"id": "ea737adf-801a-4eb2-96db-e84abd46c994",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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tLQ0sWHDBtGvXz9hMBjE77//btouMzNTNGrUSFSrVk28/vrrIjU1VXz++efixRdfFDt27DDb75w5c4QQQly/fl107NhRhIWFiZ9++umux2wJm50SLl68KACIAQMGKNr+yJEjAoAYPXq02eX//e9/BQAxefJk02Xt27cXAMzupGvXrgl3d3dhMBjMGpv9+/cLAOLdd981XVZcwGPHjjXb1+rVqwUAsWrVKrN9WfpjGR8fb/Zks3fvXgHA9AfZkoKCAnHz5k1RrVo18e9//9t0+aefflrmSb5Y6SehLVu2CABi9uzZZtslJycLAGLRokWmy6Kjo4W3t7c4deqU6bKcnBwREBAgRo0aZbqscePGol+/fuUed3kGDBggvLy8xOnTp80u79GjhzAajWaNg6U/3pasWLFCABCLFy8udxtrclDZ++/q1asCgJg/f36Fx2xJv379RJ8+fSrcrriWN27caHb5iBEjhJubm9l9V1JhYaHIz88Xr7/+uggMDBRFRUVCiDt/kACIiRMnmm2/du1aAaDCJ+MDBw6UyaEQQrRo0ULcf//95cYVFBSI/Px88c9//lPce++9ZtdVttm5deuWCAgIKJPHwsJC0bRpU9GiRYu7riU9PV0AEEuXLi1z3dChQwUA8cknn5hd3rNnT1GvXr1yb7O8vAshRKNGjSw2Epa8/fbbAoDZY6S04nz07NnT7PJPPvlEADD9o+H69evCYDCU2e706dPCy8tLDBo0yHSZmmbn8ccfFwaDwazZKCgoEPXr11fc7AAwe+4TQojp06cLAGLXrl1CCGH6x9E777xjtt2ZM2eEwWAQL7/88l33U716dTFmzJhyr7cmX6WbneK/U+X97VDa7ERERIicnBzT5ZmZmSIgIEB06dKl3NiCggKRl5cn4uLizPb/+uuvCwBi27ZtFe53zpw54sSJE6Jhw4aiYcOG4uTJk3c93vLwZSwVvv32WwAoc5q9RYsWaNCgQZlTfOHh4bj//vtNvwcEBCAkJATNmjVDRESE6fIGDRoAgNlLR8WeeOIJs98fe+wxeHh4mI7lbnr16gV3d3fT702aNCmzn5s3b2LixIm455574OHhAQ8PD1SvXh23bt1SdLrUkh07dgAom6dHH30U1apVK5OnZs2aISoqyvS7t7c36tata3acLVq0wNdff41XXnkFO3fuRE5OjuJj6dy5MyIjI80uHzZsGLKzs7Fnzx5rlgYA+Prrr+Ht7W3xdH7J/Rbvp6TycmBJRfdfQEAA6tSpgzlz5mDu3Ln45ZdfUFRUpGgNt27dQmpqquKXsHx8fMxezgWAQYMGoaioCN99953psh07dqBLly7w8/ODu7s79Ho9pk6dimvXruHy5csAgLS0NAB3armLine truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"metadata": {},
"output_type": "display_data"
}
],
@@ -310,9 +307,9 @@
"id": "c45ef1a0-6748-46a0-a135-5617d2bcf687",
"metadata": {},
"source": [
"This shows, for example, that with 48 coins there is no bag value that should be sold back; it is always better to get 4 bags than to sell one back and be left with only 3 bags. But with each extra coin, we can afford to be more picky, and the bag value that we sell back increases, until we get up to 60 coins, where again the best azction is to keep all 5 bags.\n",
"This shows, for example, that with 48 coins there is no bag value that should be sold back; it is always better to get 4 bags than to sell one back and be left with only 3 bags. But with each extra coin, we can afford to be more picky, and the bag value that we sell back increases, until we get up to 60 coins, where again the best action is to keep all 5 bags.\n",
"\n",
"However, with a larger standard deviation we get a different scatter plot (there are so many dots they run together to form lines, but that's not important):"
"However, with a larger standard deviation we get a different scatter plot:"
]
},
{
@@ -323,14 +320,12 @@
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"metadata": {},
"output_type": "display_data"
}
],
@@ -343,7 +338,7 @@
"id": "7ee02075-06c2-4c7c-a515-3f18d8ed89d4",
"metadata": {},
"source": [
"Let's investigate this more carefully:"
"Here, even with 48 (or 60) coins, we will sell back a very bad bag. Let's investigate this more carefully:"
]
},
{
@@ -359,7 +354,7 @@
" 79: 'sellback',\n",
" 80: 'sellback',\n",
" 81: 'sellback',\n",
" 82: 'sellback',\n",
" 82: 'keep',\n",
" 83: 'keep',\n",
" 84: 'keep',\n",
" 85: 'keep',\n",
@@ -385,7 +380,7 @@
"id": "f1281db2-373d-4f3e-9406-6f60f751e650",
"metadata": {},
"source": [
"This says that with 48 coins we should sell back a bag of value of 82 or less, even though selling back means we can only get 3 bags instead of 4. The 3 bags will, on average, make up for it, because we can sell back bad ones 11 times. (The exact point at which 'sellback' switches to 'keep' will vary, depending on the samples in the distribution.)\n",
"This says that with 48 coins we should sell back a bag of value of 81 or less, even though selling back means we can only get 3 bags instead of 4. The 3 bags will, on average, make up for it, because we can sell back bad ones 11 times. (The exact point at which 'sellback' switches to 'keep' will vary, depending on the samples in the distribution.)\n",
"\n",
"Here we compare the expected values of keeping versus selling back a bag of value 78:"
]
@@ -399,7 +394,7 @@
{
"data": {
"text/plain": [
"380.0048248123251"
"378.2457353813969"
]
},
"execution_count": 12,
@@ -408,7 +403,7 @@
}
],
"source": [
"78 + E(36) # What if we kept the bag of value 78, and got 3 other bags (about 100 each) for the 36 other coins?"
"78 + E(36) # Keep the 78 bag"
]
},
{
@@ -420,7 +415,7 @@
{
"data": {
"text/plain": [
"384.36968315108277"
"382.1235957586821"
]
},
"execution_count": 13,
@@ -429,7 +424,7 @@
}
],
"source": [
"E(47) # What if we sold back the 78-diamond bag, and selected 3 good bags with the remaining 47 coins?"
"E(47) # Sell back the 78 bag"
]
},
{
@@ -437,7 +432,75 @@
"id": "5c6d203f-19d8-4640-84d6-460635ac8367",
"metadata": {},
"source": [
"We see that selling back is better."
"We see that selling back is better.\n",
"\n",
"## Cutoff Threshold Strategy: Loss Compared to Optimal Strategy\n",
"\n",
"One suggested strategy was to keep all bags that are above a fixed **cutoff threshold** and sell back the rest (except that a bag should be kept if selling it back would not result in enough coins to buy another bag). How much worse is this strategy than the optimal strategy? "
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "aee8dc14-9334-4364-94fd-6fcee0e94594",
"metadata": {},
"outputs": [],
"source": [
"def cutoff_expectation_fn(p:ProbDist, cutoff, buy=12, sell=11) -> Callable:\n",
" \"\"\"Returns a function that will compute the expected number of diamonds, given `coins`\n",
" This is 0 if you can't afford a bag, or is the weighted average, over all possible bag values, of\n",
" the probability of the bag times the maximum of the expectations of keeping the bag or selling it back.\"\"\"\n",
" @functools.lru_cache(None)\n",
" def Ecut(coins:int) -> float:\n",
" def action(bag): \n",
" return (bag + Ecut(coins - buy) if (bag > cutoff or coins + sell < buy) \n",
" else Ecut(coins - buy + sell))\n",
" if coins < buy:\n",
" return 0\n",
" else:\n",
" return sum(p[bag] * action(bag) for bag in p)\n",
" return Ecut\n",
"\n",
"def plot_loss(sigma=25, coins=range(45, 76)):\n",
" \"\"\"Plot the expected number of diamonds for different sigma/starting coins combinations.\"\"\"\n",
" p = normal(100, sigma)\n",
" E = expectation_fn(p)\n",
" plt.plot(coins, [E(c) for c in coins], 'o:', label='optimal')\n",
" for cutoff in range(100, 100 + sigma, 10):\n",
" Ecut = cutoff_expectation_fn(p, cutoff)\n",
" plt.plot(coins, [Ecut(c) for c in coins], 'o:', label=f'cutoff={cutoff}')\n",
" plt.title('Expected number of diamonds for different cutoffs')\n",
" plt.legend(); plt.xlabel('starting coins'); plt.ylabel('diamonds'); plt.grid(True)\n",
" "
]
},
{
"cell_type": "markdown",
"id": "df3d72d3-a88d-4d75-8b64-6b170a7498a8",
"metadata": {},
"source": [
"We see in the plot below that the cutoff strategy is worse, for various cutoffs, and a good cutoff choice can get within about 5% of optimal:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "30910eaf-a964-4056-ab7c-73bee8b58c76",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHFCAYAAAAUpjivAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAADLLUlEQVR4nOydd3xUxRbHvze7m7LpdZNACCGhhd67tNCbooIFqaJYQUCKDVBEQKWoT6yAqIg+KygCCQrIoxNQ6UWakEaAFNJ35/2xyZJNdpNNSGe+fiLZuXNn5s692T07c87vKEIIgUQikUgkEkkNxa6yByCRSCQSiURSnkhjRyKRSCQSSY1GGjsSiUQikUhqNNLYkUgkEolEUqORxo5EIpFIJJIajTR2JBKJRCKR1GiksSORSCQSiaRGI40diUQikUgkNRpp7EgkEolEIqnRSGOnirN69WoURbH6s23btsoeok2kpaUxd+7cchnvtm3bqtVc5Cdv7N9++21lD8Umzp8/z6BBg/Dy8kJRFKZMmVLiNhRFYe7cuabXec/4+fPny2ycVZGxY8dSt27dMmmrLO5DWWDrvXzppZeoU6cOarUaDw8PALKyspg0aRIBAQGoVCpatmxZYeMuKbt27WLu3LncuHGjUvpfsGABP/744221cejQIbp37467uzuKorBs2TIAtm7dStu2bXF2dkZRlNvup6qiruwBSGxj1apVNGrUqFB5eHh4JYym5KSlpTFv3jwAevToUbmDkZSa5557jr1797Jy5Ur8/f0JCAi47TYHDRrE7t27y6StO4XyuA9lgaV7+dNPP/H666/z4osvMmDAABwcHABYsWIFH374Ie+++y5t2rTBxcWlsoZdLLt27WLevHmMHTvWZKxVJAsWLOC+++7j7rvvLnUb48eP5+bNm6xbtw5PT0/q1q2LEIIRI0bQoEED1q9fj7OzMw0bNiy7gVchpLFTTWjatClt27at7GFIqinp6ek4OjqiKMpttXPkyBHat29/W2+6BfH19cXX17fM2rsTKOv7oNfrycnJMRkipcXSvTxy5AgAzz77LH5+fmblTk5OPP3007fVZ37S0tLQarVl1l5N4siRI0ycOJEBAwaYyi5fvsy1a9e455576N27dyWOrvyR21g1hHXr1qEoCu+9955Z+Zw5c1CpVERGRgLG5W9FUVi8eDGvv/46derUwdHRkbZt27J169ZC7Z4+fZqHHnoIPz8/HBwcaNy4Mf/5z38K1btx4wbTpk2jXr16ODg44Ofnx8CBAzlx4gTnz583vQHOmzfPtAU3duzYEvdz4sQJ+vfvj1arxcfHh0mTJpGSkmLTHM2dOxdFUTh69CgPPvgg7u7u6HQ6xo8fT1JSkqle3hytXr26UBsFl+3z2vzrr7+4//77cXd3x8vLi6lTp5KTk8PJkyfp378/rq6u1K1bl8WLF1scW0ZGBlOnTsXf3x8nJye6d+/OoUOHCtU7cOAAQ4cOxcvLC0dHR1q1asU333xjVidvK2HLli2MHz8eX19ftFotmZmZVufm4sWLjBo1ymz+3377bQwGA3Bru+3MmTP8+uuvpntY1NZTcnIyEydOxNvbGxcXF/r378+pU6cK1bO09REZGcmwYcOoXbs2jo6OhIWF8fjjj3P16lWzc8ti/ou7drj1TLz11lssWbKEkJAQXFxc6NSpE3v27LF4TQ0bNjS1t2bNGotztGLFClq0aIGLiwuurq40atSIF154weqcFncfSnItixcvZv78+YSEhODg4MDvv/9utd/S3su6devy0ksvAaDT6Ux/P4qi8Mknn5Cenm66hry/NyEE77//Pi1btsTJyQlPT0/uu+8+/vnnH7O+evToQdOmTdmxYwedO3dGq9Uyfvx403inT59OSEgI9vb21KpViylTpnDz5k2zNhRF4emnn+bzzz+ncePGaLVaWrRowc8//2yqM3fuXJ5//nkAQkJCbHYh2Lt3L0OGDMHb2xtHR0dCQ0PNthutbWvmzU/+Md68eZPPPvvM1Hf+1fEjR44wbNgwPD09cXR0pGXLlnz22WeF7klOTg4rVqwwtTF37lxq164NwMyZM1EUxTSehIQEHnvsMYKCgnBwcMDX15cuXboQFRVV5DVXaYSkSrNq1SoBiD179ojs7Gyzn5ycHLO6kyZNEvb29mL//v1CCCG2bt0q7OzsxEsvvWSqc+7cOQGIoKAg0bVrV/Hdd9+J//73v6Jdu3ZCo9GIXbt2meoePXpUuLu7i2bNmok1a9aILVu2iGnTpgk7Ozsxd+5cU73k5GTRpEkT4ezsLF599VWxefNm8d1334nJkyeL3377TWRkZIhNmzYJQEyYMEHs3r1b7N69W5w5c6ZE/cTGxgo/Pz9Rq1YtsWrVKrFx40bx8MMPizp16ghA/P7770XO5Zw5cwQgGjZsKF555RURGRkplixZIhwcHMS4ceMKzdGqVasKtQGIOXPmWGzztddeE5GRkWLGjBkCEE8//bRo1KiReOedd0RkZKQYN26cAMR3331nOv/333833Y9hw4aJDRs2iC+++EKEhYUJNzc3cfbsWVPd3377Tdjb24tu3bqJr7/+WmzatEmMHTu20FjznplatWqJxx57TPz666/i22+/LfS85BEfHy9q1aolfH19xQcffCA2bdoknn76aQGIJ554QgghRFJSkti9e7fw9/cXXbp0Md3DjIwMi20aDAbRs2dP4eDgIF5//XWxZcsWMWfOHFGvXr1Cc5g33nPnzpnKVqxYId544w2xfv16sX37dvHZZ5+JFi1aiIYNG4qsrKwym39brj3/M1G3bl3Rv39/8eOPP4off/xRNGvWTHh6eoobN24Uup6C9zMoKEgEBweb6n311VcCEM8884zYsmWLiIqKEh988IF49tlnLc5pcfehpNdSq1Yt0bNnT/Htt9+KLVu2mM1/Wd3L6OhoMWHCBAGITZs2id27d4tLly6J3bt3i4EDBwonJyfTNcTHxwshhJg4caLQaDRi2rRpYtOmTWLt2rWiUaNGQqfTidjYWFNf3bt3F15eXiIoKEi8++674vfffxfbt28XN2/eFC1bthQ+Pj5iyZIlIioqSixfvly4u7uLXr16CYPBYGoj7562b99efPPNN2Ljxo2iR48eQq1Wm/72Ll26JJ555hkBiO+//9403qSkJKv3adOmTUKj0YjmzZuL1atXi99++02sXLlSPPDAA6Y6Y8aMMXse8sh7pvPYvXu3cHJyEgMHDjT1ffToUSGEECdOnBCurq4iNDRUrFmzRvzyyy/iwQcfFIBYtGiREML4jO/evVsA4r777jO1cenSJfH999+bnsHdu3eL6OhoIYQQ/fr1E76+vuKjjz4S27ZtEz/++KN45ZVXxLp166xec1VHGjtVnLw3D0s/KpXKrG5GRoZo1aqVCAkJEceOHRM6nU50797d7EMu740uMDBQpKenm8qTk5OFl5eXiIiIMJX169dP1K5du9Af9dNPPy0cHR3FtWvXhBBCvPrqqwIQkZGRVq8jISGh0BtjSfuZOXOmUBRFHD582Kxenz59SmTsLF682Kz8ySefFI6OjqY3wdIYO2+//bZZvZYtW5reHPPIzs4Wvr6+Yvjw4aayPGOndevWZm/C58+fFxqNRjz66KOmskaNGolWrVqJ7Oxss74GDx4sAgIChF6vF0LcemZGjx5d5HzkMWvWLAGIvXv3mpU/8cQTQlEUcfLkSVNZcHCwGDRoULFt/vrrrwIQy5cvNyt//fXXbTJ28mMwGER2dra4cOGCAMRPP/1kOna782/rtec9E82aNTP7e9q3b58AxFdffSWEEEKv14vAwECr9zP/h9vTTz8tPDw8LF5zcVi6DyW9ltDQUDPD0Rq3ey/z7lFCQoLZ+WPGjBHOzs5mZXkfygXv56VLl4STk5OYMWOGqax79+4CEFu3bjWr+8Ybbwg7OzvTl748vv32WwGIjRs3msoAodPpRHJysqksNjZW2NnZiTfeeMNU9uabbxb5jBYkNDRUhIaGmr3HFsRWY0cIIZydncWYMWMK1X3ggQeEg4ODuHjxoln5gAEDhFarNTPCAfHUU0+Z1ct7Ft58802zchcXFzFlyhSrY6+OyG2sasKaNWvYv3+/2c/evXvN6jg4OPDNN9+QmJhI69atEULw1VdfoVKpCrU3fPhwHB0dTa9dXV0ZMmQIO3bsQK/Xk5GRwdatW7nnnnvQarXk5OSYfgYOHEhGRoZp+f7XX3+lQYMGRERElPi6StLP77//TpMmTWjRooVZGw899FCJ+hw6dKjZ6+bNm5ORkUF8fHyJx5/H4MGDzV43btwYRVHM9sfVajVhYWFcuHCh0PkPPfSQ2dJ1cHAwnTt3Nm0tnDlzhhMnTvDwww8DFJqnmJgYTp48adbmvffea9PYf/vtN8LDw2nfvr1Z+dixYxFC8Ntvv9nUTn7yxp033jxsvVfx8fFMmjSJoKAg1Go1Go2G4OBgAI4fP16ofmnnv6TXPmjQILO/p+bNmwOY2jx58iRXrlyxej/z0759e27cuMGDDz7ITz/9VGiLrqSU9FqGDh2KRqMptt3bvZcl4eeff0ZRFEaNGmX2jPv7+9OiRYtCW0eenp706tWrUBtNmzalZcuWZm3069fP4vZTz549cXV1Nb3W6XT4+flZ/Du1hVOnTnH27FkmTJhg9h5bHvz222/07t2boKAgs/KxY8eSlpbG7t27S9Vu+/btWb16NfPnz2fPnj1kZ2eXxXArFWnsVBMaN25M27ZtzX7atGlTqF5YWBjdunUjIyODhx9+2GqUhr+/v8WyrKwsUlNTSUxMJCcnh3fffReNRmP2M3DgQADTm3NCQoJp77eklKSfxMREq+MuCd7e3mav85wy09PTS3MJAHh5eZm9tre3R6vVFnqzs7e3JyMjo9D51q4rMTERgLi4OACmT59eaJ6efPJJgEIflrZG6CQmJlqsGxgYaDpeUhITE1Gr1YXm2pZLine truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_loss()"
]
}
],
@@ -457,7 +520,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.12"
"version": "3.8.15"
}
},
"nbformat": 4,