mirror of
https://github.com/ION606/COGMOD-HWI.git
synced 2026-05-14 22:16:57 +00:00
276 lines
34 KiB
Plaintext
276 lines
34 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import stan\n",
|
|
"import arviz as az\n",
|
|
"\n",
|
|
"# stan problems\n",
|
|
"import nest_asyncio\n",
|
|
"nest_asyncio.apply()\n",
|
|
"\n",
|
|
"np.random.seed(42)\n",
|
|
"N = 100\n",
|
|
"alpha = 2.3\n",
|
|
"beta = 4.0\n",
|
|
"sigma = 2.0\n",
|
|
"x = np.random.normal(size=N)\n",
|
|
"y = alpha + beta * x + sigma * np.random.normal(size=N)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"mu_0 = 3\n",
|
|
"sigma_0 = 3\n",
|
|
"sample_mean = np.mean(y)\n",
|
|
"n = N\n",
|
|
"\n",
|
|
"# posterior\n",
|
|
"sigma_sq = sigma ** 2\n",
|
|
"sigma_0_sq = sigma_0 ** 2\n",
|
|
"\n",
|
|
"mu_post = ((n / sigma_sq) * sample_mean + (1 / sigma_0_sq) * mu_0) / (n / sigma_sq + 1 / sigma_0_sq)\n",
|
|
"sigma_post_sq = 1 / (n / sigma_sq + 1 / sigma_0_sq)\n",
|
|
"sigma_post = np.sqrt(sigma_post_sq)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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vXo1goOD0bFjR732kpISvPbaazh8+DCys7ORkpKC0aNHw9PTE4GBgS1yTERERNS6GXwOUEhICC5fvox58+ahoKAAvr6+SEpKkiZG5+TkwMhIP6dlZGTgwIED2LNnT5XxjI2N8csvv2DdunUoKiqCi4sLhg8fjrfeeovPAiIiIiIAgEIIIQxdRGuj1WqhUqlQXFzMy2FE7cHemLr3HVr1jDMRtQ31+f02+CUwIiIiopbGAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBEREREssMARERERLLDAERERESywwBERO3b3hhDV0BErRADEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREclOqwhAcXFxcHd3h5mZGfz9/XH06NEa+yYkJEChUOgtZmZmen2EEJg3bx6cnZ1hbm4OjUaDs2fPNvdhEBERURth8AC0efNmREZGYv78+Th58iR8fHwQGBiIS5cu1biNjY0N8vPzpeXChQt66xcvXowPPvgA8fHxOHLkCCwtLREYGIhbt2419+EQERFRG2DwALRs2TJMnDgRERER6NmzJ+Lj42FhYYE1a9bUuI1CoYBarZYWJycnaZ0QArGxsXjzzTcxevRoeHt7IzExEXl5edi+fXsLHBERtWl8cjSRLBg0AJWXl+PEiRPQaDRSm5GRETQaDdLS0mrcrqSkBG5ubnB1dcXo0aNx6tQpaV1WVhYKCgr0xlSpVPD3969xzLKyMmi1Wr2FiIiI2i+DBqArV66gsrJS7wwOADg5OaGgoKDabby8vLBmzRrs2LEDn3/+OXQ6Hfr374+LFy8CgLRdfcaMiYmBSqWSFldX18YeGhEREbViBr8EVl8BAQEIDQ2Fr68vhgwZgm3btsHBwQGrVq1q8JjR0dEoLi6Wltzc3CasmIiIiFobgwagTp06wdjYGIWFhXrthYWFUKvVdRqjQ4cO6NOnDzIzMwFA2q4+YyqVStjY2OgtRERE1H4ZNACZmpqib9++SElJkdp0Oh1SUlIQEBBQpzEqKyvx66+/wtnZGQDg4eEBtVqtN6ZWq8WRI0fqPCYRERG1byaGLiAyMhJhYWHo168f/Pz8EBsbi9LSUkRERAAAQkND0blzZ8TE3LkzY9GiRXjkkUfg6emJoqIiLFmyBBcuXMCECRMA3LlDbObMmXj77bfRvXt3eHh4YO7cuXBxcUFwcLChDpOIiIhaEYMHoJCQEFy+fBnz5s1DQUEBfH19kZSUJE1izsnJgZHR/52ounbtGiZOnIiCggLY2dmhb9++OHToEHr27Cn1ef3111FaWoqXX34ZRUVFGDhwIJKSkqo8MJGIiIjkSSGEEIYuorXRarVQqVQoLi7mfCCitq4hz/UZGt30dRBRs6vP73ebuwuMiIiIqLEYgIiIiEh2GICIiIhIdhiAiIiISHYYgIiIiEh2GICIiIhIdhiAiIiISHYYgIiIiEh2GICIiIhIdhiAiIiISHYYgIiIiEh2GICIiIhIdhiAiIiISHYYgIiIiEh2GICIiIhIdhiAiIiISHYYgIiIiEh2GICIiIhIdhiAiIiISHYYgIiIiEh2GICIiIhIdhiAiIiISHYYgIiI/mlvjKErIKJmxgBERO0XgwwR1YABiIiIiGSHAYiIiIhkhwGIiIiIZIcBiIiIiGSHAYiIiIhkhwGIiIiIZIcBiIiIiGSHAYiIiIhkhwGIiNonPgSRiGrRKgJQXFwc3N3dYWZmBn9/fxw9erTGvp988gkGDRoEOzs72NnZQaPRVOkfHh4OhUKht4wYMaK5D4OIiIjaCIMHoM2bNyMyMhLz58/HyZMn4ePjg8DAQFy6dKna/qmpqRg3bhz27t2LtLQ0uLq6Yvjw4fjzzz/1+o0YMQL5+fnSsnHjxpY4HCIiImoDDB6Ali1bhokTJyIiIgI9e/ZEfHw8LCwssGbNmmr7r1+/Hv/5z3/g6+uL+++/H59++il0Oh1SUlL0+imVSqjVammxs7NricMhIiKiNsCgAai8vBwnTpyARqOR2oyMjKDRaJCWllanMW7cuIHbt2/D3t5erz01NRWOjo7w8vLClClTcPXq1RrHKCsrg1ar1VuIiIio/TJoALpy5QoqKyvh5OSk1+7k5ISCgoI6jfHGG2/AxcVFL0SNGDECiYmJSElJwXvvvYd9+/YhKCgIlZWV1Y4RExMDlUolLa6urg0/KCIiImr1TAxdQGO8++672LRpE1JTU2FmZia1jx07VvrfvXv3hre3N7p164bU1FQ8/vjjVcaJjo5GZGSk9Fmr1TIEERERtWMGPQPUqVMnGBsbo7CwUK+9sLAQarW61m3ff/99vPvuu9izZw+8vb1r7du1a1d06tQJmZmZ1a5XKpWwsbHRW4iIiKj9MmgAMjU1Rd++ffUmMN+d0BwQEFDjdosXL8Zbb72FpKQk9OvX7577uXjxIq5evQpnZ+cmqZuIiIjaNoPfBRYZGYlPPvkE69atw++//44pU6agtLQUERERAIDQ0FBER0dL/d977z3MnTsXa9asgbu7OwoKClBQUICSkhIAQElJCV577TUcPnwY2dnZSElJwejRo+Hp6YnAwECDHCMRERG1LgafAxQSEoLLly9j3rx5KCgogK+vL5KSkqSJ0Tk5OTAy+r+ctnLlSpSXl+O5557TG2f+/PlYsGABjI2N8csvv2DdunUoKiqCi4sLhg8fjrfeegtKpbJFj42I2rC9McDQ6Hv3I6I2SSGEEIYuorXRarVQqVQoLi7mfCCitqopXoXBAETUptTn99vgl8CIiIiIWhoDEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyQ4DEBEREckOAxARERHJDgMQERERyY6JoQsgImqN0s5fxeGKP2rt8+qwHi1UDRE1NQYgIqIGWp5ce0ACGJKIWisGICJqf/bGGLoCSV1CUl0wSBE1LQYgImpXlif/gUdyrhq6jCbHs01ETYuToImIavBIzseGLoGImgkDEBEREckOL4EREbUTvExGVHcMQETUKjTVZGGqHUMS0R28BEZEVAvOAyJqn3gGiIiaHc/utC08S0RywDNAREREJDsMQETUrvCSFRHVBS+BERFRvfEyGbV1DEBE1Cic30NEbREDEBHViOGGGoNniag1YwAikimGGyKSM06CJiIiItnhGSAiIjIYXiYjQ2EAImqHeHmL2hOGJGoODEBE1G401zOAHsn5GIe7vNwsY1PTYEii+moVASguLg5LlixBQUEBfHx88OGHH8LPz6/G/lu3bsXcuXORnZ2N7t2747333sMTTzwhrRdCYP78+fjkk09QVFSEAQMGYOXKlejevXtLHA5Rs+LZHaKGYUiivzN4ANq8eTMiIyMRHx8P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",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"prior_samples = np.random.normal(mu_0, sigma_0, 10000)\n",
|
|
"posterior_samples = np.random.normal(mu_post, sigma_post, 10000)\n",
|
|
"\n",
|
|
"plt.hist(prior_samples, bins=50, density=True, alpha=0.5, label='Prior')\n",
|
|
"plt.hist(posterior_samples, bins=50, density=True, alpha=0.5, label='Posterior')\n",
|
|
"\n",
|
|
"plt.legend()\n",
|
|
"plt.xlabel('Average Height (meters)')\n",
|
|
"plt.ylabel('Density')\n",
|
|
"plt.title('Prior vs Posterior')\n",
|
|
"plt.savefig('Q5.png')\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"stanCode = \"\"\"\n",
|
|
"data {\n",
|
|
" int<lower=0> N; // observations\n",
|
|
" vector[N] x; // predictor\n",
|
|
" vector[N] y; // response\n",
|
|
"}\n",
|
|
"parameters {\n",
|
|
" real alpha; // intercept\n",
|
|
" real beta; // slope\n",
|
|
" real<lower=0> sigma; // noise standard deviation\n",
|
|
"}\n",
|
|
"model {\n",
|
|
" sigma ~ inv_gamma(1, 1); // noise\n",
|
|
" alpha ~ normal(0, 10); // intercept\n",
|
|
" beta ~ normal(0, 10); // slope\n",
|
|
" y ~ normal(alpha + beta * x, sigma);\n",
|
|
"}\n",
|
|
"\"\"\"\n",
|
|
"\n",
|
|
"data = {\n",
|
|
" 'N': N,\n",
|
|
" 'x': x,\n",
|
|
" 'y': y\n",
|
|
"}"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Building...\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"Building: found in cache, done.Sampling: 0%\n",
|
|
"Sampling: 25% (3000/12000)\n",
|
|
"Sampling: 50% (6000/12000)\n",
|
|
"Sampling: 75% (9000/12000)\n",
|
|
"Sampling: 100% (12000/12000)\n",
|
|
"Sampling: 100% (12000/12000), done.\n",
|
|
"Messages received during sampling:\n",
|
|
" Gradient evaluation took 4.2e-05 seconds\n",
|
|
" 1000 transitions using 10 leapfrog steps per transition would take 0.42 seconds.\n",
|
|
" Adjust your expectations accordingly!\n",
|
|
" Informational Message: The current Metropolis proposal is about to be rejected because of the following issue:\n",
|
|
" Exception: normal_lpdf: Scale parameter is 0, but must be positive! (in '/tmp/httpstan_lipc1ba5/model_oj7ef663.stan', line 16, column 2 to column 38)\n",
|
|
" If this warning occurs sporadically, such as for highly constrained variable types like covariance matrices, then the sampler is fine,\n",
|
|
" but if this warning occurs often then your model may be either severely ill-conditioned or misspecified.\n",
|
|
" Gradient evaluation took 2.8e-05 seconds\n",
|
|
" 1000 transitions using 10 leapfrog steps per transition would take 0.28 seconds.\n",
|
|
" Adjust your expectations accordingly!\n",
|
|
" Gradient evaluation took 2.2e-05 seconds\n",
|
|
" 1000 transitions using 10 leapfrog steps per transition would take 0.22 seconds.\n",
|
|
" Adjust your expectations accordingly!\n",
|
|
" Informational Message: The current Metropolis proposal is about to be rejected because of the following issue:\n",
|
|
" Exception: normal_lpdf: Scale parameter is 0, but must be positive! (in '/tmp/httpstan_lipc1ba5/model_oj7ef663.stan', line 16, column 2 to column 38)\n",
|
|
" If this warning occurs sporadically, such as for highly constrained variable types like covariance matrices, then the sampler is fine,\n",
|
|
" but if this warning occurs often then your model may be either severely ill-conditioned or misspecified.\n",
|
|
" Gradient evaluation took 3.8e-05 seconds\n",
|
|
" 1000 transitions using 10 leapfrog steps per transition would take 0.38 seconds.\n",
|
|
" Adjust your expectations accordingly!\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>mean</th>\n",
|
|
" <th>sd</th>\n",
|
|
" <th>hdi_3%</th>\n",
|
|
" <th>hdi_97%</th>\n",
|
|
" <th>mcse_mean</th>\n",
|
|
" <th>mcse_sd</th>\n",
|
|
" <th>ess_bulk</th>\n",
|
|
" <th>ess_tail</th>\n",
|
|
" <th>r_hat</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>alpha</th>\n",
|
|
" <td>2.315</td>\n",
|
|
" <td>0.193</td>\n",
|
|
" <td>1.946</td>\n",
|
|
" <td>2.672</td>\n",
|
|
" <td>0.002</td>\n",
|
|
" <td>0.002</td>\n",
|
|
" <td>7672.0</td>\n",
|
|
" <td>5912.0</td>\n",
|
|
" <td>1.0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>beta</th>\n",
|
|
" <td>3.716</td>\n",
|
|
" <td>0.214</td>\n",
|
|
" <td>3.305</td>\n",
|
|
" <td>4.108</td>\n",
|
|
" <td>0.003</td>\n",
|
|
" <td>0.002</td>\n",
|
|
" <td>6876.0</td>\n",
|
|
" <td>5564.0</td>\n",
|
|
" <td>1.0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>sigma</th>\n",
|
|
" <td>1.910</td>\n",
|
|
" <td>0.140</td>\n",
|
|
" <td>1.662</td>\n",
|
|
" <td>2.175</td>\n",
|
|
" <td>0.002</td>\n",
|
|
" <td>0.002</td>\n",
|
|
" <td>7423.0</td>\n",
|
|
" <td>5615.0</td>\n",
|
|
" <td>1.0</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" mean sd hdi_3% hdi_97% mcse_mean mcse_sd ess_bulk ess_tail \\\n",
|
|
"alpha 2.315 0.193 1.946 2.672 0.002 0.002 7672.0 5912.0 \n",
|
|
"beta 3.716 0.214 3.305 4.108 0.003 0.002 6876.0 5564.0 \n",
|
|
"sigma 1.910 0.140 1.662 2.175 0.002 0.002 7423.0 5615.0 \n",
|
|
"\n",
|
|
" r_hat \n",
|
|
"alpha 1.0 \n",
|
|
"beta 1.0 \n",
|
|
"sigma 1.0 "
|
|
]
|
|
},
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"model = stan.build(stanCode, data=data)\n",
|
|
"fit = model.sample(num_samples=2000, num_chains=4)\n",
|
|
"\n",
|
|
"az.summary(az.from_pystan(fit))"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": ".venv",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.12.9"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|