From d9b05c46a6e35a1c83b2b186fe32a00bf4386370 Mon Sep 17 00:00:00 2001 From: Zeinab Mohammadi <76111159+Zeinab-Mohammadi@users.noreply.github.com> Date: Tue, 3 Oct 2023 11:10:59 -0400 Subject: [PATCH 01/41] Update .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5a050af5..84a25c54 100644 --- a/.gitignore +++ b/.gitignore @@ -26,7 +26,7 @@ wheels/ .installed.cfg *.egg MANIFEST - +# ccomputer # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. From c55c8de7a015fcc440bc22e73e3951be0e94863f Mon Sep 17 00:00:00 2001 From: Zeinab Mohammadi <76111159+Zeinab-Mohammadi@users.noreply.github.com> Date: Tue, 3 Oct 2023 11:37:08 -0400 Subject: [PATCH 02/41] Update README.md kjggy --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5280ca42..0f9f93dc 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This package has fast and flexible code for simulating, learning, and performing inference in a variety of state space models. Currently, it supports: - +lhhj - Hidden Markov Models (HMM) - Auto-regressive HMMs (ARHMM) - Input-output HMMs (IOHMM) From 5498558f7ffc1cb39f77a8f61c75720b1cf5935b Mon Sep 17 00:00:00 2001 From: Zeinab Date: Mon, 11 Dec 2023 18:14:39 -0500 Subject: [PATCH 03/41] Initial commit of glmhmm transitions observations for git pull request --- README.md | 2 +- notebooks/2-Input-Driven-HMM.ipynb | 72 +- ...-Input-Driven-Observations-(GLM-HMM).ipynb | 410 +-- ssm/__init__.py | 1 + ssm/hmm.py | 531 +-- ssm/init_state_distns.py | 3 + ssm/messages.py | 4 +- ssm/observations.py | 2905 ++++++++++++++++- ssm/transitions.py | 1418 +++++++- ssm/util.py | 89 + 10 files changed, 4659 insertions(+), 776 deletions(-) diff --git a/README.md b/README.md index 0f9f93dc..5280ca42 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This package has fast and flexible code for simulating, learning, and performing inference in a variety of state space models. Currently, it supports: -lhhj + - Hidden Markov Models (HMM) - Auto-regressive HMMs (ARHMM) - Input-output HMMs (IOHMM) diff --git a/notebooks/2-Input-Driven-HMM.ipynb b/notebooks/2-Input-Driven-HMM.ipynb index e3a2a8b7..e6a3da7c 100644 --- a/notebooks/2-Input-Driven-HMM.ipynb +++ b/notebooks/2-Input-Driven-HMM.ipynb @@ -123,7 +123,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -189,18 +189,30 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 11, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hmm.transitions= [[0.97373053 0.02626947]\n", + " [0.01082345 0.98917655]]\n", + "hmm.transitions.log= [[-0.02662068 -3.63934768]\n", + " [-4.52604 -0.01088245]]\n", + "hmm.transitions.Ws= [[-0.21647808]\n", + " [ 0.97535949]]\n" + ] + }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "8ebe1c75a58c47f4888a4fefcf35b5a6", + "model_id": "5fcc369b1d134ca1a17526384e1e8bbb", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "HBox(children=(FloatProgress(value=0.0), HTML(value='')))" + " 0%| | 0/100 [00:00" ] @@ -292,7 +318,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -320,6 +346,30 @@ "plt.show()" ] }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hmm.transitions= [[0.27766136 0.01704112]\n", + " [0.0223481 0.79697805]]\n", + "hmm.transitions.log= [[-1.28135303 -4.07212584]\n", + " [-3.80101406 -0.22692814]]\n", + "hmm.transitions.Ws= [[ 3.40151154]\n", + " [-5.75812834]]\n" + ] + } + ], + "source": [ + "print('hmm.transitions=',np.exp(hmm.transitions.log_Ps))\n", + "print('hmm.transitions.log=',hmm.transitions.log_Ps)\n", + "print('hmm.transitions.Ws=',hmm.transitions.Ws)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -332,12 +382,12 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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iYnR008/ra5du+rMmTOaPn26vvzySyUkJMhut6tbt26h/idBuPEjcYu1ykOrrKxMH330kaKiorRw4cJLXpeXl6eOHTtq7ty5crlcmjp1qt544w09/PDDQYwWiGzV1dVq3ry5lixZot27d2vUqFG655579PLLLysjI0NFRUVyOp3KzMxUfn6+OnbsqNOnT+u+++5TcnKyJGnfvn1atWqVkpKSVFpaWuf84MGDmj9/vt566y01b95c+/bt07hx47Ry5Uq9+OKLiomJUXFxsU6cOKFhw4aRuPEjgdpkZPjw4Ro+fPjlhkXivthtt93mV6v5k08+0a5du7R06VJJ0vnz5wMdGtAo9e/fX5LUsWNHVVdX6/vvv69TfvDgQR06dKhOl+L58+e1Z88etWvXTm3atFFSUpKn7OLz2pb8gw8+6Ck3DEOHDh1SSUmJpk2bJsMw1KJFC915550B/JaIVDabIZud3cHCWmxsrOexYRgyTdNz7nA4PI/dbrcWLFigdu3aSZK+++67kOzJCkS6pk2bSvrXyNyL65xUM1CtWbNmKioq8jx39OhRNWvWTNu3b69TZ6W6ddjtdislJUUvvPCC57ny8nIlJCT86LO4lw5vwnVbT1ZOu4TmzZvr888/l2maOnPmjNauXesp69Wrl958802Zpqnq6mo9+uijWrx4cQijBRqnm266STExMZ7EXV5eriFDhmj37t2Wr01JSdGGDRu0f/9+SdK6des0dOhQnT9/Xr1799bSpUvldrt16tQprV69OqDfA5GpdltP30fw46LFfQlDhw7Vp59+qgEDBigxMVG333675y/06dOnKzc3VxkZGXI4HEpNTdX48eNDHDHQ+ERHR+sPf/iDcnNz9eqrr8rpdGrixInq1q2bSktLfb42OTlZs2bN0pNPPinTNBUVFaVFixbp2muvVXZ2tmbOnKlBgwapRYsWat++fZC+ESJKPVZOCybD/GHfFBACHe7O0aHy46EOo8H8pE0L7f1gTqjDABrU2Le2qOL0hVCH0aASmzXVW2N/4bXs/jc+s/y+ic2a6u1xtwcitEuixQ0AgBfhuq0niRsAAC+aRNkUbbFWeROL8kAgcQMA4IXdMGS3aFHbQ3CPOyh/Khw5ckS33HKLMjMzlZmZqYyMDN17773aunVrQD4vPT1du3bt0q5du/T44483yHv+3//9n+6+++46z913333q3bt3nWklDz/8sN5++22f75WZmanvvvvO5zVjxoxRcXGx17KcnBy/RtUC/qKO1kUdhSTZbYZfR7AFrY1fO6WjqKhIy5cv17hx4/Rf//VfAf3Mzp0768UXX2yQ9+rZs6e++uornTx5UpJ0/PhxVVZWqmXLltq1a5ckyel0auvWrerTp4/P9yoqKqqza0x9bdy48UfzXYErRR39F+ooJMlms07etqtpOtjJkyfVqlUrSTULJeTl5WnHjh06e/asTNPUnDlz1K1bN23ZskVz586V2+2WJD3yyCMaOHCgqqurNW/ePG3evFkul0u33nqrcnJydN1113k+o7S0VLNnz9ZHH32kqVOn6rrrrtPevXv17bffqkOHDnr22Wd17bXXav/+/V7XQr5YfHy8OnXqpC1btuiOO+7QJ598ol69eqlly5Zas2aNunTpoh07digpKUlJSUk+1zPv0KGDSkpKdP311ys/P19r1qxRs2bN1KVLF+3fv19//vOfJUmrV6/Wa6+9pqNHjyolJUVz5szRggULVFlZqaeeekr5+fmqqKjQokWLZBiG7Ha7pkyZov/4j/8I0n9FNGbUUero1S7KZijKokVtVR4IQftb4fz5855uuH79+ikvL08TJkyQJO3YsUOVlZV655139PHHH2vYsGF65ZVXJNVs7jFu3DgVFhYqLy9PmzZtkiS9/PLLstvtKiws1IcffqiEhATNmzfPZwy7d+/Wa6+9po8//lhlZWUqLi6W0+nU448/rt/+9rcqLCzU4sWL9frrr2v79u0/en3v3r09c0fXrl2rvn37qm/fvlqzZo0kqaSkxPOXfO165oWFhfrggw904sSJOrvDSDX7s37++ef66KOPtGTJEh0+fLhO+dmzZ7VkyRJ9/PHH+tvf/qZt27Zp0qRJnu/6s5/9TPn5+Zo5c6YKCws1ceJEy7mtwKVQR6mjqKuJvWZwmq+jib0RD067ePUjqaYr6bHHHtOHH36orl276vrrr/dUjNLSUl177bWSpEGDBmnWrFlas2aNUlNT9eSTT0qqWS/89OnT2rhxo6SaJUlbtmzpM4bevXsrOjpaktS+fXudOnXK51rIt912W53Xp6WlKScnR9XV1dqyZYvy8/PVtGlTHT16VEePHlVpaakmTpzoic9qPfN169YpMzPTs+zjfffd5/lLXpIGDx4su92ua665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\n", "text/plain": [ "
" ] @@ -406,7 +456,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/notebooks/2b-Input-Driven-Observations-(GLM-HMM).ipynb b/notebooks/2b-Input-Driven-Observations-(GLM-HMM).ipynb index a3435e64..dc94dd8c 100644 --- a/notebooks/2b-Input-Driven-Observations-(GLM-HMM).ipynb +++ b/notebooks/2b-Input-Driven-Observations-(GLM-HMM).ipynb @@ -159,7 +159,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -238,7 +238,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -252,14 +252,14 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "true ll = -900.7834782398646\n" + "true ll = -917.6224204479988\n" ] } ], @@ -292,55 +292,32 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "fa9b4b47904c470ebacaae25753f3b6e", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HBox(children=(HTML(value=''), FloatProgress(value=0.0, max=200.0), HTML(value='')))" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], + "outputs": [], "source": [ "new_glmhmm = ssm.HMM(num_states, obs_dim, input_dim, observations=\"input_driven_obs\", \n", " observation_kwargs=dict(C=num_categories), transitions=\"standard\")\n", "\n", "N_iters = 200 # maximum number of EM iterations. Fitting with stop earlier if increase in LL is below tolerance specified by tolerance parameter\n", + "print('true_choices.shape=',np.array(true_choices).shape)\n", + "\n", + "###### Zeinab: this is for control analysis######\n", + "print('true_choices[i,:,0]=',true_choices)\n", + "for i in range(num_sess):\n", + " true_choices[i,:,0]=np.random.permutation(true_choices[i,:,0])\n", + "print('true_choices.shape=',np.array(true_choices).shape)\n", + "# inpts=np.random.permutation(inpts)\n", + "#################################################\n", + "\n", "fit_ll = new_glmhmm.fit(true_choices, inputs=inpts, method=\"em\", num_iters=N_iters, tolerance=10**-4)" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Plot the log probabilities of the true and fit models. Fit model final LL should be greater \n", "# than or equal to true LL.\n", @@ -371,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -388,30 +365,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'Weight recovery')" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig = plt.figure(figsize=(4, 3), dpi=80, facecolor='w', edgecolor='k')\n", "cols = ['#ff7f00', '#4daf4a', '#377eb8']\n", @@ -448,20 +404,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig = plt.figure(figsize=(5, 2.5), dpi=80, facecolor='w', edgecolor='k')\n", "plt.subplot(1, 2, 1)\n", @@ -511,7 +456,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -523,30 +468,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0, 0.5, 'p(state)')" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig = plt.figure(figsize=(5, 2.5), dpi=80, facecolor='w', edgecolor='k')\n", "sess_id = 0 #session id; can choose any index between 0 and num_sess-1\n", @@ -568,7 +492,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -583,30 +507,9 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0, 0.5, 'frac. occupancy')" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAALgAAADQCAYAAAC0lKvwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAxOAAAMTgF/d4wjAAAWD0lEQVR4nO3dfVRUZR4H8O8dXgTlxWQw5XVAYTqGBiQk7AKmBBbptspmboh5TCgTVzFbVwWRDNsTjlYbYRhpa63uZiahkMSKqSfRluMKpAWowKg4CIUiYyE8+4dn50QM+Axzhxmuv885c47OMzP3q3y555n7KjDGGAiRKJm5AxBiSlRwImlUcCJpVHAiaVRwImlUcCJpVHAiaRZd8GXLlkGhUEAQBFRVVZk7DhmCLLrg8fHxOHbsGLy9vc0dhQxR1uYO0J/IyEhzRyBDnEWvwQkxlkWvwXmpVCqoVCrd35uamjBmzBgzJiKDqbm5GT/99JPeMWEoHGylUChQWFiIgIAArtd7eHhArVabOBWxFP39vGmKQiTNogv+0ksv6X47o6OjMX78eHNHIkPMkJiiGIqmKPcWmqKQexYVnEgaFZxIGhWcSBoVnEgad8H/85//mDIHISbBXfCQkBCEhYXho48+QmdnpykzESIa7oLv2LED3d3dmD9/Pjw9PZGWlkbbmonF4y54YmIiysvLUV5ejpiYGGRnZ8PX1xdz5sxBWVmZCSMSMnAGf8kMCQnBhx9+iMbGRmRkZOCbb77B9OnTERAQgG3btuHWrVumyEnIgAx4K4qtrS2GDx8OW1tbMMbQ0dGBF198EX5+fjhx4oSYGQkZMIMLfubMGSQnJ8Pd3R1//vOf8cgjj6C8vBznz5/H6dOn4e7ujuTkZFNkJcRwjNPu3btZREQEk8lk7P7772fp6ensypUrvV5XWlrKrK2teT/WJNzd3c26fDK4+vt5c5/RM2/ePAQFBSE/Px/z5s2Dra2t3tcpFAokJCSI9gtIiDG4D5c9duwYfvvb35o6jyjocNl7iyiHyw6VchPyS9wFT01NxbPPPqt3LCEhAatWrRItFCFi4S54QUEBYmJi9I7FxMRg//79ooUiRCzcBb906RIUCoXeMW9vb5rzEovEXfARI0agsbFR71hDQwPs7OxEC0WIWLgLHhYWhs2bN/c6krCzsxNbtmxBeHi46OEIMRb3dvB169YhMjISAQEBWLRoEdzd3aFWq5Gfn4/6+nrk5uaaMichA2PIHqPi4mI2btw4JgiC7jF+/Hj2xRdfGLkvSly0J/PeIsqeTACIjY1FbW0tampq0NzcDFdXV/j5+Znqd48Qow3o4pt+fn5UbDIkGFTwGzduoKioCPX19dBqtT3GBEFAWlqaqOEIMRb3sSjl5eWIi4tDa2ur/g8SBHR1dYkabqDoWJR7iyjHoqxYsQLu7u44efIkbt26he7u7h4PSyk3Ib/EPUWprKzExx9/jMmTJ5syDyGi4l6Du7q6mjIHISbBXfCUlBTk5uaCc8pOiEXgnqJ0d3fj3LlzCAoKQlxcHFxcXHqMC4KAFStWiB6QEGNwb0WRyfpf2dNWFGIu/f28udfgFy5cEC0QIYOFu+B0t2EyFNHlk4mkGbSr/quvvsJbb72Fs2fP6t1VX1dXJ2o4QozFXfBjx45h+vTpmDp1Ks6ePYsZM2bgxo0b+Prrr+Hr64vf/OY3pswpjgzBzMunTayDjXuKsn79eixcuBDFxcUAgI0bN+Lo0aOoqKhAe3s7Zs+ebbKQhAwUd8Grqqrw+9//HoJwZy34/02CkyZNQlpaGjIzM02TkBAjcBe8o6MDDg4OkMlkGDZsGK5du6Ybe+CBB/Dtt9+aJCAhxuAuuJeXF65evQoAmDBhAg4cOKAbO3LkSK89m4RYAu4vmVOnTkVZWRni4+OxePFiLFmyBGfPnsWwYcNw6NAhrFy50pQ5CRkQ7oJv2LBBd7LDCy+8gI6ODnz00UcQBAHr1q3D2rVrTRaSkIHiPhZlKOnz2ATaTChJohyL8kuXL19GS0sLXFxc4ObmZlQ4QkzJoF31n376KZRKJTw9PREYGAhPT0/4+/vjk08+MVU+QozCXfA9e/YgPj4eVlZWSE9PR05ODtLS0mBlZYW5c+diz549psxJyIBwz8EffPBBKBQKfP755z2ODe/u7kZcXBwaGhpQXV1tsqCGoDn4vUWUs+rr6uqwZMmSXic+yGQyLFmyhA60IhaJu+De3t7o6OjQO9bR0QFPT0/RQhEiFu6Cr1y5EpmZmT120QOARqPBxo0b8fLLL4sejhBjcW8mrKqqwvXr16FQKDB9+nSMGTMGTU1NKC0thVwuR3V1NZYtWwbgzrHhb775pslCE8JLtJOOe3yomU9Api+Z9xZRdvR0d3eLFoiQwULnZBJJo4ITSeOeoshkMt3ZPH2xlAv/EPJ/3AVPT0/vVfDm5mYcOnQIXV1dSExMFD0cIcbiLnhGRobe53/++WfExsZi9OjRYmUiRDRGz8FtbW2RkpIClUolRh5CRCXKl0x7e3tcuXJFjI8iRFRGF7y5uRlvvPEGlEqlGHkIERX3HNzHx6fXl8yffvoJGo0GMpkMBQUFoocjxFjcBY+KiupVcDs7OygUCsydOxcKhULsbIQYjbvgO3bsMGEMQkyD9mQSSTPoPpnPPvus3rGEhASsWrWKe6E1NTUIDw+Hv78/QkND9V72raysDMOHD0dgYKDu8etLNhNyN9wF//zzzxETE6N3LCYmBvv37+deaHJyMpKSkvD999/jlVdewaJFi/S+bsKECTh9+rTuYW9vz70MQgADCn7p0qU+v0h6e3tz3/RJo9GgoqICCQkJAIA5c+bgwoULuHjxIm8UQrhxF3zEiBFobGzUO9bQ0AA7Ozuuz2lsbISbmxusre98vxUEAV5eXmhoaOj12u+++w7BwcEICQlBTk5On5+pUqng4eGhe7S3t3NlIdLHXfCwsDBs3rwZnZ2dPZ7v7OzEli1bEB4ezr3QX29u1HdSUXBwMNRqNSoqKrBv3z7k5ubin//8p97PS01NhVqt1j0cHBy4sxBp495MuG7dOkRGRiIgIACLFi2Cu7s71Go18vPzUV9fj9zcXK7P8fT0hFqtxu3bt2FtbQ3GGBobG+Hl5dXjdU5OTro/e3h4YN68eTh69Ciefvpp3siE8K/BH3nkERQUFKCrqwurV6/G/Pnz8Ze//AXd3d0oKChAaGgo1+eMHj0aQUFB2LVrFwBg7969UCgUveb3V65c0Z0md+PGDRQWFiIoKIg3LiEADLz4ZmxsLGpra1FTU4Pm5ma4urrCz8/P4IVu27YNzz33HLKysuDk5ISdO3cCAJ5//nnMmjULs2bNwt69e/Huu+/C2toat2/fxh/+8AcsXLjQ4GWRextdPnkw0Vn1JiHKpdv++te/IiUlRe9YSkoKsrOzB5aOEBPiLvjOnTsREBCgd+yhhx7STTMIsSTcBa+vr4e/v7/esfHjx9OOGmKRuAtuY2MDjUajd+zq1at3PeOeEHPgLvjkyZORl5endywvLw+TJ08WLRQhYuHeTPjyyy8jLi4OU6dOxZIlS3Q7enJzc/HVV1/h4MGDpsxJyIBwF3zGjBl47733sHLlSjzzzDMQBAGMMTg7OyMvLw+xsbGmzEnIgBi0o2fRokV45plncPz4cVy7dg2urq4IDw/HiBEjTJWPEKMYfBvBESNG9HlcOCGWxqCCt7a2YsuWLSgtLUVLSwvkcjmio6OxfPly3HfffabKSMiAGXTCQ3BwMF577TW0tbXBy8sLP/74I1599VUEBwfj8uXLpsxJyIBwF3zNmjXQarUoLy9HdXU1SkpKUF1djfLycmi1WqxZs8aUOQkZEO6CFxcXY+PGjQgJCenxfEhICDIzM1FUVCR6OEKMxV3wtra2Ps/J9PHxQVtbm1iZCBENd8F9fHxw4MABvWNFRUXw8fERLRQhYuHeirJw4UKsXr0a3d3dWLBgAcaOHYsrV65g165dePvtt/H666+bMichA8Jd8FWrVqGurg5/+9vf8M477+ieZ4whKSmJbgRLLBJ3wQVBwLZt25CamorDhw+jpaUFLi4umDZtWp+H0RJibgbvyVQqlXQtcDJk0MU3iaRRwYmkUcGJpFHBiaRRwYmkUcGJpIlS8MWLF/d5EXtCzEmUgn/wwQd0kypikQze0aPP+fPn9V7jmxBzE6Xgv762NyGWgnuK0tnZiZs3b+odu3nzZq87PxBiCbgLvnjxYjz//PN6x5KSkvDiiy+KFooQsXAX/PDhw5g1a5besZkzZ6K0tFS0UISIhbvgV69exdixY/WOjRkzBk1NTaKFIkQs3AUfOXIkamtr9Y7V1tbC0dFRtFCEiIW74I8++ig2bdqE1tbWHs+3trbi9ddfx7Rp00QPR4ixuDcTZmRkICQkBH5+fpg7d67u6rL/+te/0NnZiQ0bNpgyJyEDwl1wpVKJo0ePIjU1FXl5eejq6oKVlRWioqKgUqnoLB9ikQza0fPQQw+htLQUWq0WP/zwA0aNGsV9C29CzGFAezLt7e1hb28vdhZCRGdQwbu6ulBUVISzZ89Cq9X2GBMEAWlpaaKGI8RY3AVvaWlBREQEzp07p7u7A4AeN5+ighNLw72ZcO3atbCzs0N9fT0YYygvL0dNTQ1SU1Ph7++PhoYGU+YkZEC4C15aWorU1FS4ubndeaNMhnHjxuGNN95AdHQ0XdmKWCTugqvVaigUClhZWUEmk/U4snDmzJkoKSkxSUBCjMFdcLlcrrtEspubG6qqqnRjra2tuH37tvjpCDES95fMhx9+GNXV1YiLi8MTTzyBzMxMODk5wdbWFmvWrMGUKVNMmZOQAeEu+NKlS1FXVwcAePXVV3HixAkkJiYCAMaNG4c333zTNAkJMYLABngyJWMMVVVVEAQBDzzwAKytRTn7TRQeHh5Qq9W9BzKE3s8Npgw6b9UU+vx5g3MNrtVqER0djQ0bNiA6OhrAne3fEydOFC8lwazP4sy6/IKn9N/BYyjj+pJpb2+PyspKi1pLE8KDu7FhYWE4efIkpk6dasI4xJJNWf+FWZd/YkOswe/hLvjmzZvxu9/9DmPGjMHs2bPh4OBg8MIIGWzc28HDwsKgVquxcOFCODs7w9HREU5OTrqHs7OzKXMSMiDca/A5c+b0OLCKkKGg34KfOXMG/v7+sLOzo2sPkiGp3ylKUFAQzpw5AwCYNm0azp07NyihCBFLvwUfNmwYfv75ZwBAWVkZrl+/PiihCBFLv1MUX19fbN68WXdRn7Kysj73GAHA7NmzxU1HiJH6LXhaWhoSExOxf/9+CIKA1atX9/laQRDQ1dUlekBCjNFvwefOnYvp06fju+++Q0REBN555x1MmDBhsLIRYrS7biaUy+WQy+VYsGABZsyYAR8fn8HIRYgouLeDf/DBB6bMQYhJ0F3WiKRRwYmkUcGJpFHBiaRZfMFramoQHh4Of39/hIaG4ttvvzV3JDKEWHzBk5OTkZSUhO+//x6vvPIK3VGZGMSiC67RaFBRUYGEhAQAdw7ZvXDhAi5evGjeYGTIsOiCNzY2ws3NTXcuqCAI8PLyousgEm4Wfxbxr0+y0HeVC5VKBZVKpft7U1MTPDw89Hyau1FZ2tvbjTtVb7u+TOIxNp/HUgvP977+55ubm/t8z4CvizIYNBoN/Pz80NLSAmtrazDGMHbsWJw4cQIKhWLQ8/R3/Q1LQPl6s+gpyujRoxEUFIRdu3YBAPbu3QuFQmGWcpOhyeKnKNu2bcNzzz2HrKwsODk5YefOneaORIYQiy+4UqnE119/be4YAIDU1FRzR+gX5evNoufghBjLoufghBiLCk4kjQp+F8uWLYNCoYAgCD3uamEpbt26haeeegr+/v4IDAzEjBkzLG5Pb0xMDCZNmoTAwEBERETg9OnTg7dwRvp15MgR1tjYyLy9vVllZaW54/Si1WrZgQMHWHd3N2OMsbfffps99thjZk7V0w8//KD78759+1hQUNCgLZvW4HcRGRnZx15Ry2BnZ4cnnnhCt8d3ypQpOH/+vJlT9TRy5Ejdn9va2iCTDV7tLH4zITHMW2+9hZkzZ5o7Ri+JiYk4fPgwAKC4uHjQlksFl5CsrCzU1NQgNzfX3FF6+fDDDwEAO3fuxKpVq3Dw4MFBWS5NUSQiOzsbn376KYqKijB8+HBzx+nTggULcPjwYbS0tAzK8qjgEqBSqfCPf/wDJSUlPea7luD69eu4fPmy7u/79u2Di4sLRo0aNSjLpz2Zd/HSSy9h//79aGpqglwuh4ODA2pra80dS0etVsPT0xO+vr5wdHQEcOeiqeXl5WZOdkdjYyPmzJkDrVYLmUwGV1dXZGdnIzAwcFCWTwUnkkZTFCJpVHAiaVRwImlUcCJpVHAiaVRwC/fxxx9j69atRn1GTk7OPXuXPNpMaOGefPJJVFVVGXUIbEBAAORyOcrKykTLNVTQGpxI26AdmEv00mg0bPHixczDw4PZ2toyuVzOwsPDWUlJCYuKimIAej3+LyMjg4WGhrL77ruPOTo6sqCgILZ9+3bdseGMMebt7d3r/d7e3rrxtrY2tnLlSqZQKJiNjQ1zc3Njf/rTn1h7e/tg/jeYDB1NaGbz589HRUUFXnvtNfj7++PHH39ERUUFWlpakJOTg6SkJNTV1WHfvn293nvx4kUkJyfDy8sLAHDixAmkpKTg0qVLSE9PB3Dn2I/4+Hg4OzsjJycHwJ1d+QDQ0dGBqKgoqNVqrFmzBpMmTUJ1dTXS09NRWVmJL7/8cujfvt3cv2H3OgcHB7Z8+fI+x+Pi4nqscfvS1dXFOjs7WWZmJnNxcemxFn/wwQdZVFRUr/ds2rSJyWQydurUqR7Pf/LJJwwAO3jwIPe/w1LRGtzMQkNDsWPHDri4uCA6OhoPP/wwbGxsuN7773//G1lZWTh16lSvu1BrNBrcf//9/b6/sLAQAQEBCAwMxO3bt3XPx8bGQhAElJWV4fHHHzf8H2VB6Eumme3ZswcLFizA9u3bERYWhlGjRiExMVF3d+m+nDx5EjExMQCAvLw8HD9+HKdOncLatWsBAFqt9q7Lvnr1Ks6cOQMbG5seD0dHRzDGcO3aNeP/gWZGa3Azk8vl2Lp1K7Zu3YqGhgYUFBRg9erV0Gg0/Z7atXv3btjY2KCwsBB2dna65z/77DODlm1vb4/8/Pw+x4c6KrgF8fLywtKlS1FaWorjx48DuPOFUN/aWBAEWFtbw8rKSvecVqvF3//+916v7esznnzySWRlZcHFxUWyN/ilKYoZtbW1ITg4GNnZ2SgsLMSRI0eQnZ2N4uJiPPbYYwCAiRMnQqPR4N1338XJkyfxzTffAADi4uLQ3t6OP/7xjygpKcHu3bsRERGh20LySxMnTsR///tf7NmzB6dOnUJlZSUAYPny5VAqlYiMjIRKpcKXX36JQ4cOYfv27Xj66act5qQJo5j7W+697NatW+yFF15gkyZNYk5OTsze3p4plUq2fv16dvPmTcYYY62trSw+Pp6NHDmSCYLQYzt4fn4+UyqVbNiwYczX15dt2rSJvf/++wwAu3Dhgu51Fy9eZDExMczR0bHXdvD29na2bt06plQqma2tLXN2dmYTJ05kK1asYE1NTYP1X2EytKueSBpNUYikUcGJpFHBiaRRwYmkUcGJpFHBiaRRwYmkUcGJpFHBiaRRwYmk/Q8Cp880uUAnywAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig = plt.figure(figsize=(2, 2.5), dpi=80, facecolor='w', edgecolor='k')\n", "for z, occ in enumerate(state_occupancies):\n", @@ -654,7 +557,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -668,31 +571,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "85f1b99f062148dfab5a3e33a59a42b8", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HBox(children=(HTML(value=''), FloatProgress(value=0.0, max=200.0), HTML(value='')))" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], + "outputs": [], "source": [ "# Fit GLM-HMM with MAP estimation:\n", "_ = map_glmhmm.fit(true_choices, inputs=inpts, method=\"em\", num_iters=N_iters, tolerance=10**-4)" @@ -707,7 +588,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -718,30 +599,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0, 0.5, 'loglikelihood')" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Plot these values\n", "fig = plt.figure(figsize=(2, 2.5), dpi=80, facecolor='w', edgecolor='k')\n", @@ -771,7 +631,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -784,7 +644,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -798,7 +658,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -809,30 +669,9 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0, 0.5, 'loglikelihood')" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig = plt.figure(figsize=(2, 2.5), dpi=80, facecolor='w', edgecolor='k')\n", "loglikelihood_vals = [mle_test_ll, map_test_ll]\n", @@ -856,7 +695,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -865,30 +704,9 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'MAP')" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig = plt.figure(figsize=(6, 3), dpi=80, facecolor='w', edgecolor='k')\n", "cols = ['#ff7f00', '#4daf4a', '#377eb8']\n", @@ -931,20 +749,9 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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hIUYERERkUxYiBERERHJhIUYERERkUxYiBERERHJhIUYERERkUxYiBERERHJhIUYERERkUxYiBERERHJhIUYERERkUxYiBERERHJhIUYERERkUxYiBERERHJpJLcHSirpORUfDJhjtzd0Ik5P3wmdxd05quvF8ndBYOWlJyKj8f/IHc3dGL+jxPk7oLOjP9yntxdMGhJyan4+AvD3F/Mmzte7i7ozBdfLZC7CzqheMp6HhEjIiIikkmZCzEjIyOcOHFC67pTp07ByMiowjpFRERE9DIocyEmhChxnUqlgkLxtINvRERERFTcM300WVKxderUKdjY2FRIh4iIiIheFqWerL9w4UIsXLgQQEER1r9/f5iamqq1yczMRHx8PAYPHqy7XhIREREZoFILMQcHBzRq1AgAEB0dDXd3d1SpUkWtjampKby8vPDpp5/qrJNEREREhqjUQmzIkCEYMmQIAKBDhw5YtmwZ6tevr5eOERERERm6Ml9HLDQ0VJf9ICIiInrp8DpiRERERDJhIUZEREQkExZiRERERDJhIUZEREQkExZiRERERDJ55kLsn3/+waRJkzBy5Ejcvn0bAHDy5EkkJCRUeOeIiIiIDFmZL1+RkZGBfv36Yd++fdJPHX344YeoVasW5s6di5o1a2Lu3Lk66ygRERGRoSnzEbH//e9/iIiIwJYtW5CcnKz2I+Bdu3bF3r17ddJBIiIiIkNV5iNimzZtwrRp0zBgwADk5+erratVq5b0MSURERERlU2Zj4glJCRIvzupsRGlEpmZmRXWKSIiIqKXQZkLMWdnZ5w7d07rusjISNSuXbvCOkVERET0MihzITZw4EAEBATg33//lZYpFArcunUL8+fPx2uvvaaTDhIREREZqjIXYt999x2cnJzQokULNGvWDAqFAu+++y4aN24MBwcHfPXVV7rsJxEREZHBKfPJ+tbW1jh69CgWLlyIP//8Ex4eHrCwsMCkSZMwbtw4mJub67Kf/9npEwdw7swR5GRnwblWHfh3HggLS2utbXNzsnE4dDtuXDsPpdIIng2awq9dTyiVRgCAu3euY/vmX9TuY2JqhvfGfK/rYWg1f+5c/LxsGZKTk9G+Qwcs+OknVHd01Nr26pUr+N9XX+HE8eMwMjLC4Ndfx7QZM2BiYgIA2LFtG1auWIHIyEgIIeDr64sp06fDq0kTfQ5J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ERERkaEqcyF25coV+Pr6AgDy8vKwdetWzJ49G3/88QemTp2KdevW6ayTRERERIaozIVYSkqK9I3JU6dOIT09HX379gUAtGjRArdv39ZJB4mIiIgMVZkLMQcHB1y9ehUAsHfvXri6usLFxQUAkJqaCmNjY930kIiIiMhAlflbk927d8fXX3+NqKgorFmzBsOGDZPWXbp0CW5ubrroHxEREZHBKnMhNmPGDNy+fRu//PILWrRogW+++UZat3btWrRu3VonHSQiIiIyVApR2q95l1FKSgrMzMxgYmJSEX3SysraBm+9N0ln2yfd+HH2OLm7oDOeHnUQExMjax+YixfTnFnj5O6CzjSo83zk4u33mYsXzcyAsXJ3QSca1a2Lu3fvlri+zEfESlO5cuWK2AwRERHRS6XMJ+sTERERUcViIUZEREQkExZiRERERDJhIUZEREQkExZiRERERDJhIUZEREQkExZiRERERDJhIUZEREQkExZiRERERDJhIUZEREQkExZiRERERDJhIUZEREQkExZiRERERDJhIUZEREQkExZiRERERDJhIUZEREQkExZiRERERDJhIUZEREQkExZiRERERDJhIUZEREQkk0pyd0Bf/j15AOfPHkVOdhaca9ZBu04DYGFprbVtbk42wg7swM3r56FUKlGvvi9ate0BpdIIAHD75iVEHNuL5KREqIQK1ao5oJlfF9R0rafPIUkMeWw/zpmDZUuXIjkpGR06dsRPSxajuqOj1rZXrlzBpC8n4vixY1AaGeH1N17HjFmzYGJiotF28aJF+OrLifhi4kR8N+V7HY/i+WTI86Yix1Zc5OkwhB/+E02bd0CL1l11PQyt5s2Zg+VLlyI5ORn+HTti0eKSM3H1yhVMmjgRJwoz8drrryOgWCb+2bULM6ZNw43r15GXl4f6DRrgf5Mno3OXLvoc0nPl35MHcO5M4dypVQftyzB3blwrnDsNfOFXwtw5ezoM4Yf+hG8L+eaOIY9t/ty5+HnZMiQnJ6N9hw5Y8NNPpebif199hRPHj8PIyAiDX38d02bMkHKxY9s2rFyxApGRkRBCwNfXF1OmT4dXkyY66ftLcUTsUlQETp8MRRv/vuj3+mjk5GRh79/rSmwfdmAb4mNvo9eAEejS801cvxqJU8f3S+tNTM3h09wf/d/4EIOHfoKabp74Z8evSE5K1Mdw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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig = plt.figure(figsize=(7, 2.5), dpi=80, facecolor='w', edgecolor='k')\n", "plt.subplot(1, 3, 1)\n", @@ -1009,7 +816,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1026,17 +833,9 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(4, 2, 2)\n" - ] - } - ], + "outputs": [], "source": [ "# Set weights of multinomial GLM-HMM\n", "gen_weights = np.array([[[0.6,3], [2,3]], [[6,1], [6,-2]], [[1,1], [3,1]], [[2,2], [0,5]]])\n", @@ -1063,7 +862,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1074,7 +873,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1090,7 +889,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1104,30 +903,9 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0, 0.5, 'observation class')" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# plot example data:\n", "fig = plt.figure(figsize=(8, 3), dpi=80, facecolor='w', edgecolor='k')\n", @@ -1140,17 +918,9 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "true ll = -16835.397370367293\n" - ] - } - ], + "outputs": [], "source": [ "# Calculate true loglikelihood\n", "true_ll = true_glmhmm.log_probability(true_choices, inputs=inpts) \n", @@ -1159,31 +929,9 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "5ef32faf5e4e4870a22f023afe6b3503", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HBox(children=(HTML(value=''), FloatProgress(value=0.0, max=500.0), HTML(value='')))" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], + "outputs": [], "source": [ "# fit GLM-HMM\n", "new_glmhmm = ssm.HMM(num_states, obs_dim, input_dim, observations=\"input_driven_obs\", \n", @@ -1195,20 +943,9 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Plot the log probabilities of the true and fit models. Fit model final LL should be greater \n", "# than or equal to true LL.\n", @@ -1224,7 +961,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1234,30 +971,9 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'Recovered transition matrix')" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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iRMn4vDhw8jOzoaXl5emMJCbm4uPPvoIf/zxB27cuAFzc3N4enqiT58+mDVrFlxcXCo8hspiu9+aNWvwwgsvVLi+xLhx47B27dpy161evRrjxo2r9PX0YFi0ICIiIiIiIiKDxClPiYiIiIiIiMggsWhBRERERERERAaJRQsiIiIiIiIiMkgsWhARERERERGRQWLRgoiIiIiIiIgMEosWRERERERERGSQWLQgIiIiIiIiIoPEogURERERERERGSQWLYiIiIiIiIjIILFoQUREREREREQGiUULIiIiIiIiIjJILFoQERERERERkUFi0YKIiIiIiIiIDBKLFkRERERERERkkFi0ICIiIiIiIiKDxKIFERERERERERkkFi2IiIiIiIiIyCCxaEFEREREREREBolFCyIiIiIiIiIySCxaEBEREREREZFBYtGCiIiIiIiIiAwSixZEREREREREZJBYtCAiIiIiIiIig8SiBREREREREREZJBYtiIiIiIiIiMggsWhBRERERERERAaJRQsiIiIiIiIiMkgsWhARERERERGRQWLRgoiIiIiIiIgMEosWRERERERERGSQWLQgIiIiIiIiIoPEogURERERERERGSQWLYiIiIiIiIjIILFoQUREREREREQGiUULIiIiIiIiIjJILFoQERERERERkUFi0YKIiIiIiIiIDBKLFkRERERERERkkFi0ICIiIiIiIiKDxKIFERERERERERkkFi2IiIiIiIiIyCCxaEFEREREREREBolFCyIiIiIiIiIySCxaEBEREREREZFBYtGCiIiIiIiIiAwSixZEREREREREZJBYtCAiIiIiIiIig8SiBREREREREREZJBYtiIiIiIiIiMggsWhBRERERERERAaJRQsiIiIiIiIiMkgsWhARERERERGRQWLRgoiIiIiIiIgMEosWRERERERERGSQWLQgIiIiIiIiIoPEogURERERERERGSQWLYiIiIiIiIjIINWLosWaNWsgSZLmy8jICG5ubhg5ciSuXLmi7/DqlX379kGSJOzbt0+vcbz77ruQJKlWry15P5w4caLKtsuXL8eaNWtqtR9dM5Rzf7/4+HhMmzYN3bt3h52dHSRJMphzVhXmBt0xlPcnc4PhWL9+PUaNGoVmzZrB3Nwc3t7eePbZZ+vFtcXcoDuG8v5kbjAcERER6Nu3L9zd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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Plot recovered parameters:\n", "recovered_weights = new_glmhmm.observations.params\n", @@ -1361,7 +1077,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/ssm/__init__.py b/ssm/__init__.py index eb52d12d..f2f58de5 100644 --- a/ssm/__init__.py +++ b/ssm/__init__.py @@ -1,4 +1,5 @@ # Default imports for SSM +from .hmm_TO import * #All the functions and constants can be imported using * from .hmm import * from .lds import * \ No newline at end of file diff --git a/ssm/hmm.py b/ssm/hmm.py index 4530572a..57d08d2a 100644 --- a/ssm/hmm.py +++ b/ssm/hmm.py @@ -8,9 +8,9 @@ from ssm.optimizers import adam_step, rmsprop_step, sgd_step, convex_combination from ssm.primitives import hmm_normalizer from ssm.messages import hmm_expected_states, hmm_filter, hmm_sample, viterbi -from ssm.util import ensure_args_are_lists, ensure_args_not_none, \ +from ssm.util import ensure_args_are_lists,ensure_args_not_none_modified, ensure_args_not_none, \ ensure_slds_args_not_none, ensure_variational_args_are_lists, \ - replicate, collapse, ssm_pbar + replicate, collapse, ssm_pbar, ensure_args_are_lists_modified import ssm.observations as obs import ssm.transitions as trans @@ -33,7 +33,7 @@ class HMM(object): In the code we will sometimes refer to the discrete latent state sequence as z and the data as x. """ - def __init__(self, K, D, M=0, init_state_distn=None, + def __init__(self, K, D, M_trans=0, M_obs=0, init_state_distn=None, transitions='standard', transition_kwargs=None, hierarchical_transition_tags=None, @@ -42,7 +42,7 @@ def __init__(self, K, D, M=0, init_state_distn=None, # Make the initial state distribution if init_state_distn is None: - init_state_distn = isd.InitialStateDistribution(K, D, M=M) + init_state_distn = isd.InitialStateDistribution(K, D, M=M_trans) if not isinstance(init_state_distn, isd.InitialStateDistribution): raise TypeError("'init_state_distn' must be a subclass of" " ssm.init_state_distns.InitialStateDistribution.") @@ -54,24 +54,21 @@ def __init__(self, K, D, M=0, init_state_distn=None, constrained=trans.ConstrainedStationaryTransitions, sticky=trans.StickyTransitions, inputdriven=trans.InputDrivenTransitions, + inputdrivenalt=trans.InputDrivenTransitionsAlternativeFormulation, + inputdrivenaltHierarchy=trans.InputDrivenTransitionsAlternativeFormulation_Hierarchy, recurrent=trans.RecurrentTransitions, recurrent_only=trans.RecurrentOnlyTransitions, rbf_recurrent=trans.RBFRecurrentTransitions, nn_recurrent=trans.NeuralNetworkRecurrentTransitions ) - if isinstance(transitions, str): + if isinstance(transitions, str): #zizi: check if the value is in above ones if transitions not in transition_classes: raise Exception("Invalid transition model: {}. Must be one of {}". format(transitions, list(transition_classes.keys()))) - transition_kwargs = transition_kwargs or {} - transitions = \ - hier.HierarchicalTransitions(transition_classes[transitions], K, D, M=M, - tags=hierarchical_transition_tags, - **transition_kwargs) \ - if hierarchical_transition_tags is not None \ - else transition_classes[transitions](K, D, M=M, **transition_kwargs) + transition_kwargs = transition_kwargs or {} #zizi: the keyword we give like c, + transitions = transition_classes[transitions](K, D, M=M_trans, **transition_kwargs) if not isinstance(transitions, trans.Transitions): raise TypeError("'transitions' must be a subclass of" " ssm.transitions.Transitions") @@ -89,6 +86,8 @@ def __init__(self, K, D, M=0, init_state_distn=None, bernoulli=obs.BernoulliObservations, categorical=obs.CategoricalObservations, input_driven_obs=obs.InputDrivenObservations, + input_driven_obs_diff_inputs=obs.InputDrivenObservationsDiffInputs, # zizi: this class is for when we have input_trans + input_driven_obs_diff_inputs_hierarchy=obs.InputDrivenObservationsDiffInputshierarchy, poisson=obs.PoissonObservations, vonmises=obs.VonMisesObservations, ar=obs.AutoRegressiveObservations, @@ -111,23 +110,19 @@ def __init__(self, K, D, M=0, init_state_distn=None, format(observations, list(observation_classes.keys()))) observation_kwargs = observation_kwargs or {} - observations = \ - hier.HierarchicalObservations(observation_classes[observations], K, D, M=M, - tags=hierarchical_observation_tags, - **observation_kwargs) \ - if hierarchical_observation_tags is not None \ - else observation_classes[observations](K, D, M=M, **observation_kwargs) + observations = observation_classes[observations](K, D, M_obs=M_obs, **observation_kwargs) if not isinstance(observations, obs.Observations): raise TypeError("'observations' must be a subclass of" " ssm.observations.Observations") - self.K, self.D, self.M = K, D, M + self.K, self.D, self.M_trans, self.M_obs = K, D, M_trans, M_obs self.init_state_distn = init_state_distn self.transitions = transitions self.observations = observations @property - def params(self): + def params(self): #it comes here + # print('self.transitions.params0==', self.transitions.params) return self.init_state_distn.params, \ self.transitions.params, \ self.observations.params @@ -135,18 +130,10 @@ def params(self): @params.setter def params(self, value): self.init_state_distn.params = value[0] + # print('self.transitions.params==', self.transitions.params) self.transitions.params = value[1] self.observations.params = value[2] - @ensure_args_are_lists - def initialize(self, datas, inputs=None, masks=None, tags=None, init_method="random"): - """ - Initialize parameters given data. - """ - self.init_state_distn.initialize(datas, inputs=inputs, masks=masks, tags=tags) - self.transitions.initialize(datas, inputs=inputs, masks=masks, tags=tags) - self.observations.initialize(datas, inputs=inputs, masks=masks, tags=tags, init_method=init_method) - def permute(self, perm): """ Permute the discrete latent states. @@ -156,7 +143,7 @@ def permute(self, perm): self.transitions.permute(perm) self.observations.permute(perm) - def sample(self, T, prefix=None, input=None, tag=None, with_noise=True): + def sample(self, T, prefix=None, transition_input=None, observation_input=None, tag=None, with_noise=True): """ Sample synthetic data from the model. Optionally, condition on a given prefix (preceding discrete states and data). @@ -182,7 +169,7 @@ def sample(self, T, prefix=None, input=None, tag=None, with_noise=True): Returns ------- - z_sample : array_like of type int + z_sample : array_like of type inte Sequence of sampled discrete states x_sample : (T x observation_dim) array_like @@ -190,17 +177,24 @@ def sample(self, T, prefix=None, input=None, tag=None, with_noise=True): """ K = self.K D = (self.D,) if isinstance(self.D, int) else self.D - M = (self.M,) if isinstance(self.M, int) else self.M + M_trans = (self.M_trans,) if isinstance(self.M_trans, int) else self.M_trans + M_obs = (self.M_obs,) if isinstance(self.M_obs, int) else self.M_obs + assert isinstance(D, tuple) - assert isinstance(M, tuple) + assert isinstance(M_trans, tuple) + assert isinstance(M_obs, tuple) assert T > 0 # Check the inputs - if input is not None: - assert input.shape == (T,) + M + if transition_input is not None: + assert transition_input.shape == (T,) + M_trans + + # Check the inputs + if observation_input is not None: + assert observation_input.shape == (T,) + M_obs # Get the type of the observations - if isinstance(self.observations, obs.InputDrivenObservations): + if isinstance(self.observations, obs.InputDrivenObservationsDiffInputs): dtype = int else: dummy_data = self.observations.sample_x(0, np.empty(0, ) + D) @@ -212,13 +206,16 @@ def sample(self, T, prefix=None, input=None, tag=None, with_noise=True): pad = 1 z = np.zeros(T, dtype=int) data = np.zeros((T,) + D, dtype=dtype) - input = np.zeros((T,) + M) if input is None else input + transition_input = np.zeros((T,) + M_trans) if transition_input is None else transition_input + observation_input = np.zeros((T,) + M_obs) if observation_input is None else observation_input + mask = np.ones((T,) + D, dtype=bool) # Sample the first state from the initial distribution pi0 = self.init_state_distn.initial_state_distn z[0] = npr.choice(self.K, p=pi0) - data[0] = self.observations.sample_x(z[0], data[:0], input=input[0], with_noise=with_noise) + # print('observation_input[0]=', observation_input[0]) + data[0] = self.observations.sample_x(z[0], data[:0], observation_input=observation_input[0], with_noise=with_noise) # We only need to sample T-1 datapoints now T = T - 1 @@ -233,14 +230,19 @@ def sample(self, T, prefix=None, input=None, tag=None, with_noise=True): # Construct the states, data, inputs, and mask arrays z = np.concatenate((zpre, np.zeros(T, dtype=int))) data = np.concatenate((xpre, np.zeros((T,) + D, dtype))) - input = np.zeros((T+pad,) + M) if input is None else np.concatenate((np.zeros((pad,) + M), input)) + transition_input = np.zeros((T+pad,) + M_trans) if transition_input is None else np.concatenate((np.zeros((pad,) + M_trans), transition_input)) + observation_input = np.zeros((T + pad,) + M_obs) if observation_input is None else np.concatenate( + (np.zeros((pad,) + M_obs), observation_input)) + mask = np.ones((T+pad,) + D, dtype=bool) # Fill in the rest of the data for t in range(pad, pad+T): - Pt = self.transitions.transition_matrices(data[t-1:t+1], input[t-1:t+1], mask=mask[t-1:t+1], tag=tag)[0] + # print("t = "+str(t)) + Pt = self.transitions.transition_matrices(data[t-1:t+1], transition_input[t-1:t+1], mask=mask[t-1:t+1], tag=tag)[0] z[t] = npr.choice(self.K, p=Pt[z[t-1]]) - data[t] = self.observations.sample_x(z[t], data[:t], input=input[t], tag=tag, + # print('observation_input[0]=', observation_input[t]) + data[t] = self.observations.sample_x(z[t], data[:t], observation_input=observation_input[t], tag=tag, with_noise=with_noise) # Return the whole data if no prefix is given. @@ -250,35 +252,47 @@ def sample(self, T, prefix=None, input=None, tag=None, with_noise=True): else: return z[pad:], data[pad:] - @ensure_args_not_none - def expected_states(self, data, input=None, mask=None, tag=None): + @ensure_args_not_none_modified + def expected_states(self, data, transition_input=None, observation_input=None, mask=None, tag=None): pi0 = self.init_state_distn.initial_state_distn - Ps = self.transitions.transition_matrices(data, input, mask, tag) - log_likes = self.observations.log_likelihoods(data, input, mask, tag) + # print('transition_input=',transition_input) + # print('data.shape14=',data.shape) + + Ps = self.transitions.transition_matrices(data, transition_input, mask, tag) + log_likes = self.observations.log_likelihoods(data, observation_input, mask, tag) + # print('Ps=', Ps) + # print('Ps.shape=', Ps.shape) + # print('hmm_expected_states(pi0, Ps, log_likes).shape=', np.array(hmm_expected_states(pi0, Ps, log_likes)[0]).shape) + # print('hmm_expected_states(pi0, Ps, log_likes)=', np.array(hmm_expected_states(pi0, Ps, log_likes))) return hmm_expected_states(pi0, Ps, log_likes) - @ensure_args_not_none - def most_likely_states(self, data, input=None, mask=None, tag=None): + def Ps_matrix(self, data, transition_input=None, observation_input=None, mask=None, tag=None): + Ps = self.transitions.transition_matrices(data, transition_input, mask, tag) + return Ps + + @ensure_args_not_none_modified + def most_likely_states(self, data, transition_input=None, observation_input=None, mask=None, tag=None): pi0 = self.init_state_distn.initial_state_distn - Ps = self.transitions.transition_matrices(data, input, mask, tag) - log_likes = self.observations.log_likelihoods(data, input, mask, tag) + Ps = self.transitions.transition_matrices(data, transition_input, mask, tag) + log_likes = self.observations.log_likelihoods(data, observation_input, mask, tag) return viterbi(pi0, Ps, log_likes) - @ensure_args_not_none + @ensure_args_not_none_modified def filter(self, data, input=None, mask=None, tag=None): pi0 = self.init_state_distn.initial_state_distn - Ps = self.transitions.transition_matrices(data, input, mask, tag) - log_likes = self.observations.log_likelihoods(data, input, mask, tag) + Ps = self.transitions.transition_matrices(data, transition_input, mask, tag) + log_likes = self.observations.log_likelihoods(data, observation_input, mask, tag) return hmm_filter(pi0, Ps, log_likes) - @ensure_args_not_none - def smooth(self, data, input=None, mask=None, tag=None): + @ensure_args_not_none_modified + def smooth(self, data, transition_input=None, observation_input=None, mask=None, tag=None): """ Compute the mean observation under the posterior distribution of latent discrete states. """ - Ez, _, _ = self.expected_states(data, input, mask) - return self.observations.smooth(Ez, data, input, tag) + Ez, _, _ = self.expected_states(data, transition_input, observation_input, mask) + return self.observations.smooth(Ez, data, transition_input, observation_input, tag) + def log_prior(self): """ @@ -288,8 +302,8 @@ def log_prior(self): self.transitions.log_prior() + \ self.observations.log_prior() - @ensure_args_are_lists - def log_likelihood(self, datas, inputs=None, masks=None, tags=None): + @ensure_args_are_lists_modified #zizi: this is a decorater which is awrapper function that make the inputs as correct size for below function + def log_likelihood(self, datas, transition_input=None, observation_input=None, masks=None, tags=None): """ Compute the log probability of the data under the current model parameters. @@ -298,17 +312,20 @@ def log_likelihood(self, datas, inputs=None, masks=None, tags=None): :return total log probability of the data. """ ll = 0 - for data, input, mask, tag in zip(datas, inputs, masks, tags): + for data, transition_input, observation_input, mask, tag in zip(datas, transition_input, observation_input, masks, tags): pi0 = self.init_state_distn.initial_state_distn - Ps = self.transitions.transition_matrices(data, input, mask, tag) - log_likes = self.observations.log_likelihoods(data, input, mask, tag) + Ps = self.transitions.transition_matrices(data, transition_input, mask, tag) + log_likes = self.observations.log_likelihoods(data, observation_input, mask, tag) ll += hmm_normalizer(pi0, Ps, log_likes) + # print('pi0=',pi0) + # print('Ps=', Ps) # this is all nan + # print('log_likes=', log_likes) assert np.isfinite(ll) return ll - @ensure_args_are_lists - def log_probability(self, datas, inputs=None, masks=None, tags=None): - return self.log_likelihood(datas, inputs, masks, tags) + self.log_prior() + @ensure_args_are_lists_modified + def log_probability(self, datas, transition_input=None, observation_input=None, masks=None, tags=None): + return self.log_likelihood(datas, transition_input, observation_input, masks, tags) + self.log_prior() def expected_log_likelihood( self, expectations, datas, inputs=None, masks=None, tags=None): @@ -384,22 +401,22 @@ def _get_minibatch(itr): epoch = itr // M m = itr % M i = perm[epoch][m] - return datas[i], inputs[i], masks[i], tags[i][i] + return datas[i], transition_input[i], observation_input[i], masks[i], tags[i][i] # Define the objective (negative ELBO) def _objective(params, itr): # Grab a minibatch of data - data, input, mask, tag = _get_minibatch(itr) + data, transition_input, observation_input, mask, tag = _get_minibatch(itr) Ti = data.shape[0] # E step: compute expected latent states with current parameters - Ez, Ezzp1, _ = self.expected_states(data, input, mask, tag) + Ez, Ezzp1, _ = self.expected_states(data, transition_input, observation_input, mask, tag) # M step: set the parameter and compute the (normalized) objective function self.params = params pi0 = self.init_state_distn.initial_state_distn - log_Ps = self.transitions.log_transition_matrices(data, input, mask, tag) - log_likes = self.observations.log_likelihoods(data, input, mask, tag) + log_Ps = self.transitions.log_transition_matrices(data, transition_input, mask, tag) + log_likes = self.observations.log_likelihoods(data, observation_input, mask, tag) # Compute the expected log probability # (Scale by number of length of this minibatch.) @@ -426,37 +443,62 @@ def _objective(params, itr): if verbose == 2: pbar.set_description("Epoch {} Itr {} LP: {:.1f}".format(epoch, m, lls[-1])) pbar.update(1) - return lls - def _fit_em(self, datas, inputs, masks, tags, verbose = 2, num_iters=100, tolerance=0, + # in below data is obs coming from hmm or hmm_TO and its size is (time_bins, obs_dimension)=(100,1) + def _fit_em(self, datas, transition_input, observation_input, masks, tags, verbose = 2, num_iters=100, tolerance=0, init_state_mstep_kwargs={}, transitions_mstep_kwargs={}, observations_mstep_kwargs={}, **kwargs): + # print('datas.shape0=',np.array(datas).shape) """ Fit the parameters with expectation maximization. E step: compute E[z_t] and E[z_t, z_{t+1}] with message passing; M-step: analytical maximization of E_{p(z | x)} [log p(x, z; theta)]. """ - lls = [self.log_probability(datas, inputs, masks, tags)] - + # print('datas00.shape==', np.array(datas).shape) + # print('datas0.shape==', np.array(datas[0]).shape) + lls = [self.log_probability(datas, transition_input, observation_input, masks, tags)] + #zizi: I dont need below as the test and train are calculated after running the code and in test we have no prior effect pbar = ssm_pbar(num_iters, verbose, "LP: {:.1f}", [lls[-1]]) for itr in pbar: + # print("iter = " + str(itr)) # E step: compute expected latent states with current parameters - expectations = [self.expected_states(data, input, mask, tag) - for data, input, mask, tag, - in zip(datas, inputs, masks, tags)] - + # print('input4=', transition_input) + # print('input_type4=', type(transition_input)) + + # expectations = [print('data.shape11=', np.array(data).shape) + # for data, transition_input, observation_input, mask, tag, + # in zip(datas, transition_input, observation_input, masks, tags)] + + expectations = [self.expected_states(data, transition_input, observation_input, mask, tag) + for data, transition_input, observation_input, mask, tag, + in zip(datas, transition_input, observation_input, masks, tags)] + # print('expectations=', np.array(expectations).shape) + # print('expectations[0]=', np.array(expectations[0]).shape) + # print('datas1.shape==', np.array(datas).shape) #this is 1689 + # print('datas[0].shape==', np.array(datas[0]).shape) #this is 799: first session + # print('data.shape=', data.shape) # M step: maximize expected log joint wrt parameters - self.init_state_distn.m_step(expectations, datas, inputs, masks, tags, **init_state_mstep_kwargs) - self.transitions.m_step(expectations, datas, inputs, masks, tags, **transitions_mstep_kwargs) - self.observations.m_step(expectations, datas, inputs, masks, tags, **observations_mstep_kwargs) + self.init_state_distn.m_step_modified(expectations, datas, transition_input, observation_input, masks, tags, **init_state_mstep_kwargs) + # print('here0') + self.transitions.m_step(expectations, datas, transition_input, masks, tags, **transitions_mstep_kwargs) + # print('log_Ps_all.shape==', np.array(log_Ps_all).shape) + # print('log_Ps_all[1].shape==', np.array(log_Ps_all[1]).shape) + self.observations.m_step(expectations, datas, observation_input, masks, tags, **observations_mstep_kwargs) # Store progress - lls.append(self.log_prior() + sum([ll for (_, _, ll) in expectations])) + # zizi: if I want to remove log_prior effect: + lls.append(self.log_prior() + sum([ll for (_, _, ll) in expectations]))#this was like lls.append(self.log_prior() + sum([ll for (_, _, ll) in expectations])) + # zizi: I dont need below as the test and train are calculated after running the code and in test we have no prior effect + + # print('self.log_prior()1=', self.log_prior()) + # we removed the self.log_prior() for that decreasing in log-likelihood so that we see only the effect of LL plot + # print('expectations=',expectations) + # print('lls2=', lls) if verbose == 2: pbar.set_description("LP: {:.1f}".format(lls[-1])) @@ -467,15 +509,17 @@ def _fit_em(self, datas, inputs, masks, tags, verbose = 2, num_iters=100, tolera pbar.set_description("Converged to LP: {:.1f}".format(lls[-1])) break + # print('ll_no_prior_final=', ll_no_prior_final) + return lls - @ensure_args_are_lists - def fit(self, datas, inputs=None, masks=None, tags=None, + @ensure_args_are_lists_modified + def fit(self, datas, transition_input=None, observation_input=None, masks=None, tags=None, verbose=2, method="em", - initialize=True, init_method="random", **kwargs): + _fitting_methods = \ dict(sgd=partial(self._fit_sgd, "sgd"), adam=partial(self._fit_sgd, "adam"), @@ -488,13 +532,6 @@ def fit(self, datas, inputs=None, masks=None, tags=None, raise Exception("Invalid method: {}. Options are {}". format(method, _fitting_methods.keys())) - if initialize: - self.initialize(datas, - inputs=inputs, - masks=masks, - tags=tags, - init_method=init_method) - if isinstance(self.transitions, trans.ConstrainedStationaryTransitions): if method != "em": @@ -502,315 +539,9 @@ def fit(self, datas, inputs=None, masks=None, tags=None, # print(verbose) return _fitting_methods[method](datas, - inputs=inputs, + transition_input=transition_input, + observation_input=observation_input, masks=masks, tags=tags, verbose=verbose, - **kwargs) - - -class HSMM(HMM): - """ - Hidden semi-Markov model with non-geometric duration distributions. - The trick is to expand the state space with "super states" and "sub states" - that effectively count duration. We rely on the transition model to - specify a "state map," which maps the super states (1, .., K) to - super+sub states ((1,1), ..., (1,r_1), ..., (K,1), ..., (K,r_K)). - Here, r_k denotes the number of sub-states of state k. - """ - - def __init__(self, K, D, *, M=0, init_state_distn=None, - transitions="nb", transition_kwargs=None, - observations="gaussian", observation_kwargs=None, - **kwargs): - - if init_state_distn is None: - init_state_distn = isd.InitialStateDistribution(K, D, M=M) - if not isinstance(init_state_distn, isd.InitialStateDistribution): - raise TypeError("'init_state_distn' must be a subclass of" - " ssm.init_state_distns.InitialStateDistribution") - - # Make the transition model - transition_classes = dict( - nb=trans.NegativeBinomialSemiMarkovTransitions, - ) - if isinstance(transitions, str): - if transitions not in transition_classes: - raise Exception("Invalid transition model: {}. Must be one of {}". - format(transitions, list(transition_classes.keys()))) - - transition_kwargs = transition_kwargs or {} - transitions = transition_classes[transitions](K, D, M=M, **transition_kwargs) - if not isinstance(transitions, trans.Transitions): - raise TypeError("'transitions' must be a subclass of" - " ssm.transitions.Transitions") - - # This is the master list of observation classes. - # When you create a new observation class, add it here. - observation_classes = dict( - gaussian=obs.GaussianObservations, - diagonal_gaussian=obs.DiagonalGaussianObservations, - studentst=obs.MultivariateStudentsTObservations, - t=obs.MultivariateStudentsTObservations, - diagonal_t=obs.StudentsTObservations, - diagonal_studentst=obs.StudentsTObservations, - bernoulli=obs.BernoulliObservations, - categorical=obs.CategoricalObservations, - poisson=obs.PoissonObservations, - vonmises=obs.VonMisesObservations, - ar=obs.AutoRegressiveObservations, - autoregressive=obs.AutoRegressiveObservations, - diagonal_ar=obs.AutoRegressiveDiagonalNoiseObservations, - diagonal_autoregressive=obs.AutoRegressiveDiagonalNoiseObservations, - independent_ar=obs.IndependentAutoRegressiveObservations, - robust_ar=obs.RobustAutoRegressiveObservations, - robust_autoregressive=obs.RobustAutoRegressiveObservations, - diagonal_robust_ar=obs.RobustAutoRegressiveDiagonalNoiseObservations, - diagonal_robust_autoregressive=obs.RobustAutoRegressiveDiagonalNoiseObservations, - ) - - if isinstance(observations, str): - observations = observations.lower() - if observations not in observation_classes: - raise Exception("Invalid observation model: {}. Must be one of {}". - format(observations, list(observation_classes.keys()))) - - observation_kwargs = observation_kwargs or {} - observations = observation_classes[observations](K, D, M=M, **observation_kwargs) - if not isinstance(observations, obs.Observations): - raise TypeError("'observations' must be a subclass of" - " ssm.observations.Observations") - - super().__init__(K, D, M=M, transitions=transitions, - transition_kwargs=transition_kwargs, - observations=observations, - observation_kwargs=observation_kwargs, - **kwargs) - - @property - def state_map(self): - return self.transitions.state_map - - def sample(self, T, prefix=None, input=None, tag=None, with_noise=True): - """ - Sample synthetic data from the model. Optionally, condition on a given - prefix (preceding discrete states and data). - - Parameters - ---------- - T : int - number of time steps to sample - - prefix : (zpre, xpre) - Optional prefix of discrete states (zpre) and continuous states (xpre) - zpre must be an array of integers taking values 0...num_states-1. - xpre must be an array of the same length that has preceding observations. - - input : (T, input_dim) array_like - Optional inputs to specify for sampling - - tag : object - Optional tag indicating which "type" of sampled data - - with_noise : bool - Whether or not to sample data with noise. - - Returns - ------- - z_sample : array_like of type int - Sequence of sampled discrete states - - x_sample : (T x observation_dim) array_like - Array of sampled data - """ - K = self.K - D = (self.D,) if isinstance(self.D, int) else self.D - M = (self.M,) if isinstance(self.M, int) else self.M - assert isinstance(D, tuple) - assert isinstance(M, tuple) - assert T > 0 - - # Check the inputs - if input is not None: - assert input.shape == (T,) + M - - # Get the type of the observations - dummy_data = self.observations.sample_x(0, np.empty(0,) + D) - dtype = dummy_data.dtype - - # Initialize the data array - if prefix is None: - # No prefix is given. Sample the initial state as the prefix. - pad = 1 - z = np.zeros(T, dtype=int) - data = np.zeros((T,) + D, dtype=dtype) - input = np.zeros((T,) + M) if input is None else input - mask = np.ones((T,) + D, dtype=bool) - - # Sample the first state from the initial distribution - pi0 = self.init_state_distn.initial_state_distn - z[0] = npr.choice(self.K, p=pi0) - data[0] = self.observations.sample_x(z[0], data[:0], input=input[0], with_noise=with_noise) - - # We only need to sample T-1 datapoints now - T = T - 1 - - else: - # Check that the prefix is of the right type - zpre, xpre = prefix - pad = len(zpre) - assert zpre.dtype == int and zpre.min() >= 0 and zpre.max() < K - assert xpre.shape == (pad,) + D - - # Construct the states, data, inputs, and mask arrays - z = np.concatenate((zpre, np.zeros(T, dtype=int))) - data = np.concatenate((xpre, np.zeros((T,) + D, dtype))) - input = np.zeros((T+pad,) + M) if input is None else np.concatenate((np.zeros((pad,) + M), input)) - mask = np.ones((T+pad,) + D, dtype=bool) - - # Convert the discrete states to the range (1, ..., K_total) - m = self.state_map - K_total = len(m) - _, starts = np.unique(m, return_index=True) - z = starts[z] - - # Fill in the rest of the data - for t in range(pad, pad+T): - Pt = self.transitions.transition_matrices(data[t-1:t+1], input[t-1:t+1], mask=mask[t-1:t+1], tag=tag)[0] - z[t] = npr.choice(K_total, p=Pt[z[t-1]]) - data[t] = self.observations.sample_x(m[z[t]], data[:t], input=input[t], tag=tag, with_noise=with_noise) - - # Collapse the states - z = m[z] - - # Return the whole data if no prefix is given. - # Otherwise, just return the simulated part. - if prefix is None: - return z, data - else: - return z[pad:], data[pad:] - - @ensure_args_not_none - def expected_states(self, data, input=None, mask=None, tag=None): - m = self.state_map - pi0 = self.init_state_distn.initial_state_distn - Ps = self.transitions.transition_matrices(data, input, mask, tag) - log_likes = self.observations.log_likelihoods(data, input, mask, tag) - Ez, Ezzp1, normalizer = hmm_expected_states(replicate(pi0, m), Ps, replicate(log_likes, m)) - - # Collapse the expected states - Ez = collapse(Ez, m) - Ezzp1 = collapse(collapse(Ezzp1, m, axis=2), m, axis=1) - return Ez, Ezzp1, normalizer - - @ensure_args_not_none - def most_likely_states(self, data, input=None, mask=None, tag=None): - m = self.state_map - pi0 = self.init_state_distn.initial_state_distn - Ps = self.transitions.transition_matrices(data, input, mask, tag) - log_likes = self.observations.log_likelihoods(data, input, mask, tag) - z_star = viterbi(replicate(pi0, m), Ps, replicate(log_likes, m)) - return self.state_map[z_star] - - @ensure_args_not_none - def filter(self, data, input=None, mask=None, tag=None): - m = self.state_map - pi0 = self.init_state_distn.initial_state_distn - Ps = self.transitions.transition_matrices(data, input, mask, tag) - log_likes = self.observations.log_likelihoods(data, input, mask, tag) - pzp1 = hmm_filter(replicate(pi0, m), Ps, replicate(log_likes, m)) - return collapse(pzp1, m) - - @ensure_args_not_none - def posterior_sample(self, data, input=None, mask=None, tag=None): - m = self.state_map - pi0 = self.init_state_distn.initial_state_distn - Ps = self.transitions.transition_matrices(data, input, mask, tag) - log_likes = self.observations.log_likelihoods(data, input, mask, tag) - z_smpl = hmm_sample(replicate(pi0, m), Ps, replicate(log_likes, m)) - return self.state_map[z_smpl] - - @ensure_args_not_none - def smooth(self, data, input=None, mask=None, tag=None): - """ - Compute the mean observation under the posterior distribution - of latent discrete states. - """ - m = self.state_map - Ez, _, _ = self.expected_states(data, input, mask) - return self.observations.smooth(Ez, data, input, tag) - - @ensure_args_are_lists - def log_likelihood(self, datas, inputs=None, masks=None, tags=None): - """ - Compute the log probability of the data under the current - model parameters. - - :param datas: single array or list of arrays of data. - :return total log probability of the data. - """ - m = self.state_map - ll = 0 - for data, input, mask, tag in zip(datas, inputs, masks, tags): - pi0 = self.init_state_distn.initial_state_distn - Ps = self.transitions.transition_matrices(data, input, mask, tag) - log_likes = self.observations.log_likelihoods(data, input, mask, tag) - ll += hmm_normalizer(replicate(pi0, m), Ps, replicate(log_likes, m)) - assert np.isfinite(ll) - return ll - - def expected_log_probability(self, expectations, datas, inputs=None, masks=None, tags=None): - """ - Compute the log probability of the data under the current - model parameters. - - :param datas: single array or list of arrays of data. - :return total log probability of the data. - """ - raise NotImplementedError("Need to get raw expectations for the expected transition probability.") - - def _fit_em(self, datas, inputs, masks, tags, verbose = 2, num_iters=100, **kwargs): - """ - Fit the parameters with expectation maximization. - - E step: compute E[z_t] and E[z_t, z_{t+1}] with message passing; - M-step: analytical maximization of E_{p(z | x)} [log p(x, z; theta)]. - """ - lls = [self.log_probability(datas, inputs, masks, tags)] - - pbar = ssm_pbar(num_iters, verbose, "LP: {:.1f}", [lls[-1]]) - - for itr in pbar: - # E step: compute expected latent states with current parameters - expectations = [self.expected_states(data, input, mask, tag) - for data, input, mask, tag in zip(datas, inputs, masks, tags)] - - # E step: also sample the posterior for stochastic M step of transition model - samples = [self.posterior_sample(data, input, mask, tag) - for data, input, mask, tag in zip(datas, inputs, masks, tags)] - - # M step: maximize expected log joint wrt parameters - self.init_state_distn.m_step(expectations, datas, inputs, masks, tags, **kwargs) - self.transitions.m_step(expectations, datas, inputs, masks, tags, samples, **kwargs) - self.observations.m_step(expectations, datas, inputs, masks, tags, **kwargs) - - # Store progress - lls.append(self.log_prior() + sum([ll for (_, _, ll) in expectations])) - if verbose == 2: - pbar.set_description("LP: {:.1f}".format(lls[-1])) - - return lls - - @ensure_args_are_lists - def fit(self, datas, inputs=None, masks=None, tags=None, verbose = 2, - method="em", initialize=True, **kwargs): - _fitting_methods = dict(em=self._fit_em) - - if method not in _fitting_methods: - raise Exception("Invalid method: {}. Options are {}".\ - format(method, _fitting_methods.keys())) - - if initialize: - self.initialize(datas, inputs=inputs, masks=masks, tags=tags, **kwargs) - - return _fitting_methods[method](datas, inputs=inputs, masks=masks, tags=tags, verbose = verbose, **kwargs) + **kwargs) \ No newline at end of file diff --git a/ssm/init_state_distns.py b/ssm/init_state_distns.py index 21c22c25..e5c40b80 100644 --- a/ssm/init_state_distns.py +++ b/ssm/init_state_distns.py @@ -47,6 +47,9 @@ def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): pi0 = sum([Ez[0] for Ez, _, _ in expectations]) + 1e-8 self.log_pi0 = np.log(pi0 / pi0.sum()) + def m_step_modified(self, expectations, datas, transition_input, observation_input, masks, tags, **kwargs): #this is for hmm_TO + pi0 = sum([Ez[0] for Ez, _, _ in expectations]) + 1e-8 + self.log_pi0 = np.log(pi0 / pi0.sum()) class FixedInitialStateDistribution(InitialStateDistribution): def __init__(self, K, D, pi0=None, M=0): diff --git a/ssm/messages.py b/ssm/messages.py index 93c08ceb..9e2b835a 100644 --- a/ssm/messages.py +++ b/ssm/messages.py @@ -40,8 +40,10 @@ def forward_pass(pi0, Ps, log_likes, alphas): - + # print('log_likes=',log_likes) + # print('log_likes.shape[0]=', log_likes.shape[0]) T = log_likes.shape[0] # number of time steps + K = log_likes.shape[1] # number of discrete states assert Ps.shape[0] == T-1 or Ps.shape[0] == 1 diff --git a/ssm/observations.py b/ssm/observations.py index a27824df..d7ee0da1 100644 --- a/ssm/observations.py +++ b/ssm/observations.py @@ -78,7 +78,8 @@ def m_step(self, expectations, datas, inputs, masks, tags, # expected log joint def _expected_log_joint(expectations): - elbo = self.log_prior() + # zizi: if I want to remove log_prior effect: + elbo = self.log_prior() #elbo =0 for data, input, mask, tag, (expected_states, _, _) \ in zip(datas, inputs, masks, tags, expectations): lls = self.log_likelihoods(data, input, mask, tag) @@ -627,8 +628,15 @@ def smooth(self, expectations, data, input, tag): raise NotImplementedError class InputDrivenObservations(Observations): + # K = number of discrete states + # D = number of observed dimensions + # M = exogenous input dimensions (the inputs modulate the probability of discrete state transitions via a multiclass logistic regression) + + #zizi: my questions are numbered here def __init__(self, K, D, M=0, C=2, prior_mean = 0, prior_sigma=1000): + #1)which one of M=0, C=2, prior_mean = 0, prior_sigma=1000 should I add to Inputdrivenransitions (InT) function? + # 1-1)why M is 0 here? input dimension is not zero? """ @param K: number of states @param D: dimensionality of output @@ -636,13 +644,14 @@ def __init__(self, K, D, M=0, C=2, prior_mean = 0, prior_sigma=1000): @param prior_sigma: parameter governing strength of prior. Prior on GLM weights is multivariate normal distribution with mean 'prior_mean' and diagonal covariance matrix (prior_sigma is on diagonal) """ - super(InputDrivenObservations, self).__init__(K, D, M) + super(InputDrivenObservations, self).__init__(K, D, M) #3)why the below section is not in InT self.C = C self.M = M self.D = D self.K = K self.prior_mean = prior_mean self.prior_sigma = prior_sigma + # Parameters linking input to distribution over output classes self.Wk = npr.randn(K, C - 1, M) @@ -659,6 +668,7 @@ def permute(self, perm): def log_prior(self): lp = 0 + # zizi: if I want to remove log_prior effect: for k in range(self.K): for c in range(self.C - 1): weights = self.Wk[k][c] @@ -675,6 +685,8 @@ def calculate_logits(self, input): :return: array of size TxKxC containing log(pr(yt=c|zt=k, ut)) for all c in {1, ..., C} and k in {1, ..., K} """ # Transpose array dimensions, so that array is now of shape ((C-1)xKx(M+1)) + # print('input.shape=',input.shape) + # print('input=',input) Wk_tranpose = np.transpose(self.Wk, (1, 0, 2)) # Stack column of zeros to transform array from size ((C-1)xKx(M+1)) to ((C)xKx(M+1)) and then transform shape back to (KxCx(M+1)) Wk = np.transpose(np.vstack([Wk_tranpose, np.zeros((1, Wk_tranpose.shape[1], Wk_tranpose.shape[2]))]), @@ -684,7 +696,10 @@ def calculate_logits(self, input): time_dependent_logits = time_dependent_logits - logsumexp(time_dependent_logits, axis=2, keepdims=True) return time_dependent_logits - def log_likelihoods(self, data, input, mask, tag): + def log_likelihoods(self, data, input, mask, tag): #5) please explain the below functions and what they do? + # print('input_log_likelihoods=', input) + if input.ndim == 1 and input.shape == (self.M,): # if input is vector of size self.M (one time point), expand dims to be (1, M) + input = np.expand_dims(input, axis=0) time_dependent_logits = self.calculate_logits(input) assert self.D == 1, "InputDrivenObservations written for D = 1!" mask = np.ones_like(data, dtype=bool) if mask is None else mask @@ -692,8 +707,10 @@ def log_likelihoods(self, data, input, mask, tag): def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): assert self.D == 1, "InputDrivenObservations written for D = 1!" + # print('input1_sample_x=',input) if input.ndim == 1 and input.shape == (self.M,): # if input is vector of size self.M (one time point), expand dims to be (1, M) input = np.expand_dims(input, axis=0) + # print('input2_sample_x=', input) time_dependent_logits = self.calculate_logits(input) # size TxKxC ps = np.exp(time_dependent_logits) T = time_dependent_logits.shape[0] @@ -706,6 +723,7 @@ def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): def m_step(self, expectations, datas, inputs, masks, tags, optimizer = "bfgs", **kwargs): T = sum([data.shape[0] for data in datas]) #total number of datapoints + # print('inputs.shape=', np.array(inputs).shape) def _multisoftplus(X): ''' @@ -713,6 +731,8 @@ def _multisoftplus(X): :param X: array of size Tx(C-1) :return f(X) of size T and df of size (Tx(C-1)) ''' + # print('X.shape=', X.shape) + # print('X=', X) X_augmented = np.append(X, np.zeros((X.shape[0], 1)), 1) # append a column of zeros to X for rowmax calculation rowmax = np.max(X_augmented, axis = 1, keepdims=1) #get max along column for log-sum-exp trick, rowmax is size T # compute f: @@ -802,6 +822,10 @@ def _hess(params, k): from scipy.optimize import minimize # Optimize weights for each state separately: + + #TODO: add timing + import time + start = time.time() for k in range(self.K): def _objective_k(params): return _objective(params, k) @@ -809,8 +833,12 @@ def _gradient_k(params): return _gradient(params, k) def _hess_k(params): return _hess(params, k) + sol = minimize(_objective_k, self.params[k].reshape(((self.C-1) * self.M)), hess=_hess_k, jac=_gradient_k, method="trust-ncg") - self.params[k] = np.reshape(sol.x, (self.C-1, self.M)) + self.params[k] = np.reshape(sol.x, (self.C-1, self.M)) # InputDrivenObservations: comment out if you want to stop observation weights being updated + end = time.time() + # print("M_step observations time InputDrivenObservations = " + str(end-end)) + def smooth(self, expectations, data, input, tag): """ @@ -819,6 +847,227 @@ def smooth(self, expectations, data, input, tag): """ raise NotImplementedError +class InputDrivenObservationsDiffInputs(Observations): #zizi: I defined this for when size of inputs for transition and observations are different + # K = number of discrete states + # D = number of observed dimensions + # M = exogenous input dimensions (the inputs modulate the probability of discrete state transitions via a multiclass logistic regression) + + #zizi: my questions are numbered here + + def __init__(self, K, D, M_obs=0, C=2, prior_mean = 0, prior_sigma=1000): + #1)which one of M=0, C=2, prior_mean = 0, prior_sigma=1000 should I add to Inputdrivenransitions (InT) function? + # 1-1)why M is 0 here? input dimension is not zero? + """ + @param K: number of states + @param D: dimensionality of output + @param C: number of distinct classes for each dimension of output + @param prior_sigma: parameter governing strength of prior. Prior on GLM weights is multivariate + normal distribution with mean 'prior_mean' and diagonal covariance matrix (prior_sigma is on diagonal) + """ + super(InputDrivenObservationsDiffInputs, self).__init__(K, D, M_obs) #3)why the below section is not in InT + self.C = C + self.M_obs = M_obs + self.D = D + self.K = K + self.prior_mean = prior_mean + self.prior_sigma = prior_sigma + # print('prior_sigmaa=', prior_sigma) + # Parameters linking input to distribution over output classes + self.Wk = npr.randn(K, C - 1, M_obs) + + @property + def params(self): + return self.Wk + + @params.setter + def params(self, value): + self.Wk = value + + def permute(self, perm): + self.Wk = self.Wk[perm] + + def log_prior(self): + lp = 0 + # zizi: if I want to remove log_prior effect: + for k in range(self.K): + for c in range(self.C - 1): + weights = self.Wk[k][c] + lp += stats.multivariate_normal_logpdf(weights, mus=np.repeat(self.prior_mean, (self.M_obs)), + Sigmas=((self.prior_sigma) ** 2) * np.identity(self.M_obs)) + # print('np.repeat(self.prior_mean, (self.M_obs))=', np.repeat(self.prior_mean, (self.M_obs))) + return lp + + + # Calculate time dependent logits - output is matrix of size TxKxC + # Input is size TxM + def calculate_logits(self, observation_input): + """ + Return array of size TxKxC containing log(pr(yt=C|zt=k)) + :param observation_input: observation_input array of covariates of size TxM_obs + :return: array of size TxKxC containing log(pr(yt=c|zt=k, ut)) for all c in {1, ..., C} and k in {1, ..., K} + """ + # Transpose array dimensions, so that array is now of shape ((C-1)xKx(M+1)) + # print('observation_input.shape=',observation_input.shape) + # print('observation_input=',observation_input) + Wk_tranpose = np.transpose(self.Wk, (1, 0, 2)) + # Stack column of zeros to transform array from size ((C-1)xKx(M_obs+1)) to ((C)xKx(M_obs+1)) and then transform shape back to (KxCx(M_obs+1)) + Wk = np.transpose(np.vstack([Wk_tranpose, np.zeros((1, Wk_tranpose.shape[1], Wk_tranpose.shape[2]))]), + (1, 0, 2)) + # Input effect; transpose so that output has dims TxKxC + time_dependent_logits = np.transpose(np.dot(Wk, observation_input.T), (2, 0, 1)) #Note: this has an unexpected effect when both input (and thus Wk) are empty arrays and returns an array of zeros + time_dependent_logits = time_dependent_logits - logsumexp(time_dependent_logits, axis=2, keepdims=True) + return time_dependent_logits + + def log_likelihoods(self, data, observation_input, mask, tag): #5) please explain the below functions and what they do? + # print('input_log_likelihoods=', observation_input) + if observation_input.ndim == 1 and observation_input.shape == (self.M_obs,): # if input is vector of size self.M_obs (one time point), expand dims to be (1, M_obs) + observation_input = np.expand_dims(observation_input, axis=0) + time_dependent_logits = self.calculate_logits(observation_input) + assert self.D == 1, "InputDrivenObservationsDiffInputs written for D = 1!" + mask = np.ones_like(data, dtype=bool) if mask is None else mask + return stats.categorical_logpdf(data[:, None, :], time_dependent_logits[:, :, None, :], mask=mask[:, None, :]) + + def sample_x(self, z, xhist, observation_input=None, tag=None, with_noise=True): + assert self.D == 1, "InputDrivenObservationsDiffInputs written for D = 1!" + # print('input1_sample_x=',observation_input) + if observation_input.ndim == 1 and observation_input.shape == (self.M_obs,): # if input is vector of size self.M (one time point), expand dims to be (1, M_obs) + observation_input = np.expand_dims(observation_input, axis=0) + # print('input2_sample_x=', observation_input) + time_dependent_logits = self.calculate_logits(observation_input) # size TxKxC + ps = np.exp(time_dependent_logits) + T = time_dependent_logits.shape[0] + + if T == 1: + sample = np.array([npr.choice(self.C, p=ps[t, z]) for t in range(T)]) + elif T > 1: + sample = np.array([npr.choice(self.C, p=ps[t, z[t]]) for t in range(T)]) + return sample + + def m_step(self, expectations, datas, observation_input, masks, tags, optimizer = "bfgs", **kwargs): + + T = sum([data.shape[0] for data in datas]) #total number of datapoints: time_bins + def _multisoftplus(X): + ''' + computes f(X) = log(1+sum(exp(X), axis =1)) and its first derivative + :param X: array of size Tx(C-1) + :return f(X) of size T and df of size (Tx(C-1)) + ''' + # print('X.shape=',X.shape) + # print('X=', X) + X_augmented = np.append(X, np.zeros((X.shape[0], 1)), 1) # append a column of zeros to X for rowmax calculation + rowmax = np.max(X_augmented, axis = 1, keepdims=1) #get max along column for log-sum-exp trick, rowmax is size T + # compute f: + f = np.log(np.exp(-rowmax[:,0]) + np.sum(np.exp(X - rowmax), axis = 1)) + rowmax[:,0] + # compute df + df = np.exp(X - rowmax)/np.expand_dims((np.exp(-rowmax[:,0]) + np.sum(np.exp(X - rowmax), axis = 1)), axis = 1) + return f, df + + def _objective(params, k): + ''' + computes term in negative expected complete loglikelihood that depends on weights for state k + :param params: vector of size (C-1)xM_obs + :return term in negative expected complete LL that depends on weights for state k; scalar value + ''' + W = np.reshape(params, (self.C - 1, self.M_obs)) + obj = 0 + # zizi: in some belwo lines input is not observation_input as it is variable + for data, input, mask, tag, (expected_states, _, _) \ + in zip(datas, observation_input, masks, tags, expectations): + xproj = input @ W.T # projection of input onto weight matrix for particular state, size is Tx(C-1) + f, _ = _multisoftplus(xproj) + assert data.shape[1] == 1, "InputDrivenObservationsDiffInputs written for D = 1!" + data_one_hot = one_hot(data[:, 0], self.C) # convert to one-hot representation of size TxC + temp_obj = (-np.sum(data_one_hot[:,:-1]*xproj, axis = 1) + f)@expected_states[:,k] + obj += temp_obj + + # add contribution of prior: + if self.prior_sigma != 0: + obj += 1/(2*self.prior_sigma**2)*np.sum(W**2) + return obj / T + + def _gradient(params, k): + ''' + Explicit calculation of gradient of _objective w.r.t weight matrix for state k, W_{k} + :param params: vector of size (C-1)xM_obs + :param k: state whose parameters we are currently optimizing + :return gradient of objective with respect to parameters; vector of size (C-1)xM_obs + ''' + W = np.reshape(params, (self.C-1, self.M_obs)) + grad = np.zeros((self.C-1, self.M_obs)) + # zizi: in some belwo lines input is not observation_input as it is variable + for data, input, mask, tag, (expected_states, _, _) \ + in zip(datas, observation_input, masks, tags, expectations): + xproj = input@W.T #projection of input onto weight matrix for particular state, size is Tx(C-1) + _, df = _multisoftplus(xproj) + assert data.shape[1] == 1, "InputDrivenObservationsDiffInputs written for D = 1!" + data_one_hot = one_hot(data[:, 0], self.C) #convert to one-hot representation of size TxC + grad += (df - data_one_hot[:,:-1]).T@(expected_states[:, [k]]*input) #gradient is shape (C-1,M_obs) + # Add contribution to gradient from prior: + if self.prior_sigma != 0: + grad += (1/(self.prior_sigma)**2)*W + # print('grad_no_hire=', grad) + # Now flatten grad into a vector: + grad = grad.flatten() + return grad/T + + def _hess(params, k): + ''' + Explicit calculation of hessian of _objective w.r.t weight matrix for state k, W_{k} + :param params: vector of size (C-1)xM_obs + :param k: state whose parameters we are currently optimizing + :return hessian of objective with respect to parameters; matrix of size ((C-1)xM_obs) x ((C-1)xM_obs) + ''' + W = np.reshape(params, (self.C - 1, self.M_obs)) + hess = np.zeros(((self.C - 1)*self.M_obs, (self.C - 1)*self.M_obs)) + # zizi: in some belwo lines input is not observation_input as it is variable + for data, input, mask, tag, (expected_states, _, _) \ + in zip(datas, observation_input, masks, tags, expectations): + xproj = input @ W.T # projection of input onto weight matrix for particular state + _, df = _multisoftplus(xproj) + # center blocks: + dftensor = np.expand_dims(df, axis = 2) # dims are now (T, (C-1), 1) + Xdf = np.expand_dims(input, axis = 1) * dftensor # multiply every input covariate term with every class derivative term for a given time step; dims are now (T, (C-1), M) + # reshape Xdf to (T, (C-1)*M_obs) + Xdf = np.reshape(Xdf, (Xdf.shape[0], -1)) + # weight Xdf by posterior state probabilities + pXdf = expected_states[:, [k]]*Xdf # output is size (T, (C-1)*M_obs) + # outer product with input vector, size (M_obs, (C-1)*M_obs) + XXdf = input.T @ pXdf + # center blocks of hessian: + temp_hess = np.zeros(((self.C - 1) * self.M_obs, (self.C - 1) * self.M_obs)) + for c in range(1, self.C): + inds = range((c - 1)*self.M_obs,c*self.M_obs) + temp_hess[np.ix_(inds, inds)] = XXdf[:, inds] + # off diagonal entries: + hess += temp_hess - Xdf.T@pXdf + # add contribution of prior to hessian + if self.prior_sigma != 0: + hess += (1 / (self.prior_sigma) ** 2) + return hess/T + + from scipy.optimize import minimize + # Optimize weights for each state separately: + import time + start = time.time() + for k in range(self.K): + def _objective_k(params): + return _objective(params, k) + def _gradient_k(params): + return _gradient(params, k) + def _hess_k(params): + return _hess(params, k) + sol = minimize(_objective_k, self.params[k].reshape(((self.C-1) * self.M_obs)), hess=_hess_k, jac=_gradient_k, method="trust-ncg") + self.params[k] = np.reshape(sol.x, (self.C-1, self.M_obs)) #for InputDrivenObservationsDiffInputs class: comment out if you want to stop observation weights being updated + # print('self.paramssss=', self.params) + end = time.time() + # print("M_step observations time InputDrivenObservationsDiffInputs = " + str(end - start)) + def smooth(self, expectations, data, observation_input, tag): + """ + Compute the mean observation under the posterior distribution + of latent discrete states. + """ + raise NotImplementedError + class _AutoRegressiveObservationsBase(Observations): """ @@ -1908,3 +2157,2651 @@ def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): def smooth(self, expectations, data, input, tag): mus = self.mus return expectations.dot(mus) + +''''###################################################### Hierarchical section for GLM-T observations #############################################################''' + +class InputDrivenObservationsDiffInputshierarchy(Observations): #zizi: I defined this for when size of inputs for transition and observations are different + # K = number of discrete states + # D = number of observed dimensions + # M = exogenous input dimensions (the inputs modulate the probability of discrete state transitions via a multiclass logistic regression) + + #zizi: my questions are numbered here + def __init__(self, K, D, Wk_glob, prior_sigma, M_obs=0, C=2): + # def __init__(self, K, D, Wk_glob, M_obs=0, C=2, prior_mean = 0, prior_sigma=1000): + + #1) which one of M=0, C=2, prior_mean = 0, prior_sigma=1000 should I add to Inputdrivenransitions (InT) function? + # 1-1)why M is 0 here? input dimension is not zero? + """ + @param K: number of states + @param D: dimensionality of output + @param C: number of distinct classes for each dimension of output + @param prior_sigma: parameter governing strength of prior. Prior on GLM weights is multivariate + normal distribution with mean 'prior_mean' and diagonal covariance matrix (prior_sigma is on diagonal) + """ + super(InputDrivenObservationsDiffInputshierarchy, self).__init__(K, D, M_obs) #3)why the below section is not in InT + self.C = C + self.M_obs = M_obs + self.D = D + self.K = K + # self.prior_mean = prior_mean + self.prior_sigma = prior_sigma + # print('prior_sigma==', prior_sigma) + + # Parameters linking input to distribution over output classes + self.Wk = npr.randn(K, C - 1, M_obs) + self.Wk_glob = np.copy(Wk_glob) + + @property + def params(self): + return self.Wk + + @params.setter + def params(self, value): + + self.Wk = value + + def permute(self, perm): + self.Wk = self.Wk[perm] + + def log_prior(self): + lp = 0 + for k in range(self.K): + for c in range(self.C - 1): + weights = self.Wk[k][c] + # mean_i = self.Wk_glob[k][c] + # print('self.prior_sigma1=', self.prior_sigma) + ####### for no hire below two lines + # prior_mean = 0 # this is when I want to be like the case without hirearchical (before) and see the effect + # pri_mean = np.repeat(prior_mean, (self.M)) # this has size 4: [self.prior_mean,, self.prior_mean,, self.prior_mean, self.prior_mean] + + ###below for hire + pri_mean = np.copy(self.Wk_glob[k][c]) # this is with hirearchical case + # print('pri_mean0=', pri_mean) + # pri_mean = np.repeat(self.prior_mean, (self.M)) # this has size 4: [self.prior_mean,, self.prior_mean,, self.prior_mean, self.prior_mean] + lp += stats.multivariate_normal_logpdf(weights, mus= (pri_mean), #(weights-mean_i) #mus=np.repeat(self.prior_mean, (self.M_obs)), + Sigmas=((self.prior_sigma) ** 2) * np.identity(self.M_obs)) + # print('lpp0=', lp) + # print('weights=', weights) + # print('self.prior_sigma=', self.prior_sigma) + # print('mean_i=', mean_i) + # print('pri_mean=', pri_mean) + # print('lpp=', lp) + + return lp + # def log_prior(self): + # lp = 0 + # # zizi: if I want to remove log_prior effect: + # lp = super(InputDrivenObservationsDiffInputshierarchy, self).log_prior() + # # print('lp_trans0=', lp) + # ## below no hire + # # lp = lp + np.sum(-0.5 * (1 / (self.prior_sigma ** 2)) * self.Ws ** 2) # lp = lp + np.sum(-0.5 * self.l2_penalty * self.Ws**2) + # lp = lp + np.sum(-0.5 * (1 / (self.prior_sigma ** 2)) * (self.Wk - self.Wk_glob) ** 2) + # + # print('lp_t=', lp) + # + return lp + + # Calculate time dependent logits - output is matrix of size TxKxC + # Input is size TxM + def calculate_logits(self, observation_input): + """ + Return array of size TxKxC containing log(pr(yt=C|zt=k)) + :param observation_input: observation_input array of covariates of size TxM_obs + :return: array of size TxKxC containing log(pr(yt=c|zt=k, ut)) for all c in {1, ..., C} and k in {1, ..., K} + """ + # Transpose array dimensions, so that array is now of shape ((C-1)xKx(M+1)) + # print('observation_input.shape=',observation_input.shape) + # print('observation_input=',observation_input) + Wk_tranpose = np.transpose(self.Wk, (1, 0, 2)) + # Stack column of zeros to transform array from size ((C-1)xKx(M_obs+1)) to ((C)xKx(M_obs+1)) and then transform shape back to (KxCx(M_obs+1)) + Wk = np.transpose(np.vstack([Wk_tranpose, np.zeros((1, Wk_tranpose.shape[1], Wk_tranpose.shape[2]))]), + (1, 0, 2)) + # Input effect; transpose so that output has dims TxKxC + time_dependent_logits = np.transpose(np.dot(Wk, observation_input.T), (2, 0, 1)) #Note: this has an unexpected effect when both input (and thus Wk) are empty arrays and returns an array of zeros + time_dependent_logits = time_dependent_logits - logsumexp(time_dependent_logits, axis=2, keepdims=True) + return time_dependent_logits + + def log_likelihoods(self, data, observation_input, mask, tag): #5) please explain the below functions and what they do? + # print('input_log_likelihoods=', observation_input) + if observation_input.ndim == 1 and observation_input.shape == (self.M_obs,): # if input is vector of size self.M_obs (one time point), expand dims to be (1, M_obs) + observation_input = np.expand_dims(observation_input, axis=0) + time_dependent_logits = self.calculate_logits(observation_input) + assert self.D == 1, "InputDrivenObservationsDiffInputshierarchy written for D = 1!" + mask = np.ones_like(data, dtype=bool) if mask is None else mask + return stats.categorical_logpdf(data[:, None, :], time_dependent_logits[:, :, None, :], mask=mask[:, None, :]) + + def sample_x(self, z, xhist, observation_input=None, tag=None, with_noise=True): + assert self.D == 1, "InputDrivenObservationsDiffInputshierarchy written for D = 1!" + # print('input1_sample_x=',observation_input) + if observation_input.ndim == 1 and observation_input.shape == (self.M_obs,): # if input is vector of size self.M (one time point), expand dims to be (1, M_obs) + observation_input = np.expand_dims(observation_input, axis=0) + # print('input2_sample_x=', observation_input) + time_dependent_logits = self.calculate_logits(observation_input) # size TxKxC + ps = np.exp(time_dependent_logits) + T = time_dependent_logits.shape[0] + if T == 1: + sample = np.array([npr.choice(self.C, p=ps[t, z]) for t in range(T)]) + elif T > 1: + sample = np.array([npr.choice(self.C, p=ps[t, z[t]]) for t in range(T)]) + return sample + + def m_step(self, expectations, datas, observation_input, masks, tags, optimizer = "bfgs", **kwargs): + + T = sum([data.shape[0] for data in datas]) #total number of datapoints: time_bins + def _multisoftplus(X): + ''' + computes f(X) = log(1+sum(exp(X), axis =1)) and its first derivative + :param X: array of size Tx(C-1) + :return f(X) of size T and df of size (Tx(C-1)) + ''' + # print('X.shape=',X.shape) + # print('X=', X) + X_augmented = np.append(X, np.zeros((X.shape[0], 1)), 1) # append a column of zeros to X for rowmax calculation + rowmax = np.max(X_augmented, axis = 1, keepdims=1) #get max along column for log-sum-exp trick, rowmax is size T + # compute f: + f = np.log(np.exp(-rowmax[:,0]) + np.sum(np.exp(X - rowmax), axis = 1)) + rowmax[:,0] + # compute df + df = np.exp(X - rowmax)/np.expand_dims((np.exp(-rowmax[:,0]) + np.sum(np.exp(X - rowmax), axis = 1)), axis = 1) + return f, df + + def _objective(params, k): + # print('pramss-1=', params) + ''' + computes term in negative expected complete loglikelihood that depends on weights for state k + :param params: vector of size (C-1)xM_obs + :return term in negative expected complete LL that depends on weights for state k; scalar value + ''' + W = np.reshape(params, (self.C - 1, self.M_obs)) + obj = 0 + # zizi: in some belwo lines input is not observation_input as it is variable + for data, input, mask, tag, (expected_states, _, _) \ + in zip(datas, observation_input, masks, tags, expectations): + xproj = input @ W.T # projection of input onto weight matrix for particular state, size is Tx(C-1) + f, _ = _multisoftplus(xproj) + assert data.shape[1] == 1, "InputDrivenObservationsDiffInputshierarchy written for D = 1!" + data_one_hot = one_hot(data[:, 0], self.C) # convert to one-hot representation of size TxC + temp_obj = (-np.sum(data_one_hot[:,:-1]*xproj, axis = 1) + f)@expected_states[:,k] + obj += temp_obj + + # add contribution of prior: + if self.prior_sigma != 0: + # print('self.Wk_glob0==', self.Wk_glob) + # print('W==', W) + # obj += 1 / (2 * self.prior_sigma ** 2) * np.sum((W** 2) # was like this for synthetic data + ## below: for real and synthetic data np.sum(W**2) is better + obj += 1 / (2 * self.prior_sigma ** 2) * np.sum((W**2) ** 2) #np.sum(W**2) #np.sum((W-self.Wk_glob)**2) # print('pramss0=', params) + return obj / T + + def _gradient(params, k): + # print('pramss1=', params) + ''' + Explicit calculation of gradient of _objective w.r.t weight matrix for state k, W_{k} + :param params: vector of size (C-1)xM_obs + :param k: state whose parameters we are currently optimizing + :return gradient of objective with respect to parameters; vector of size (C-1)xM_obs + ''' + W = np.reshape(params, (self.C-1, self.M_obs)) + W_global = np.reshape(self.Wk_glob[k], (self.C-1, self.M_obs)) + grad = np.zeros((self.C-1, self.M_obs)) + # zizi: in some belwo lines input is not observation_input as it is variable + for data, input, mask, tag, (expected_states, _, _) \ + in zip(datas, observation_input, masks, tags, expectations): + xproj = input@W.T #projection of input onto weight matrix for particular state, size is Tx(C-1) + _, df = _multisoftplus(xproj) + assert data.shape[1] == 1, "InputDrivenObservationsDiffInputshierarchy written for D = 1!" + data_one_hot = one_hot(data[:, 0], self.C) #convert to one-hot representation of size TxC + grad += (df - data_one_hot[:,:-1]).T@(expected_states[:, [k]]*input) #gradient is shape (C-1,M_obs) + # Add contribution to gradient from prior: + if self.prior_sigma != 0: + # grad += (1/(self.prior_sigma)**2)* (W-W_global) #was like this for synthetic data + grad += (1/(self.prior_sigma)**2)* (W-W_global) #(W-self.Wk_glob) #it was W, but I changed for hirearchical + # Now flatten grad into a vector: + grad = grad.flatten() + # print('grad0=', grad) + return grad/T + + def _hess(params, k): + # print('pramss3=', params) + ''' + Explicit calculation of hessian of _objective w.r.t weight matrix for state k, W_{k} + :param params: vector of size (C-1)xM_obs + :param k: state whose parameters we are currently optimizing + :return hessian of objective with respect to parameters; matrix of size ((C-1)xM_obs) x ((C-1)xM_obs) + ''' + W = np.reshape(params, (self.C - 1, self.M_obs)) + W_global = np.reshape(self.Wk_glob[k], (self.C - 1, self.M_obs)) + hess = np.zeros(((self.C - 1)*self.M_obs, (self.C - 1)*self.M_obs)) + # zizi: in some belwo lines input is not observation_input as it is variable + for data, input, mask, tag, (expected_states, _, _) \ + in zip(datas, observation_input, masks, tags, expectations): + xproj = input @ W.T # projection of input onto weight matrix for particular state + _, df = _multisoftplus(xproj) + # center blocks: + dftensor = np.expand_dims(df, axis = 2) # dims are now (T, (C-1), 1) + Xdf = np.expand_dims(input, axis = 1) * dftensor # multiply every input covariate term with every class derivative term for a given time step; dims are now (T, (C-1), M) + # reshape Xdf to (T, (C-1)*M_obs) + Xdf = np.reshape(Xdf, (Xdf.shape[0], -1)) + # weight Xdf by posterior state probabilities + pXdf = expected_states[:, [k]]*Xdf # output is size (T, (C-1)*M_obs) + # outer product with input vector, size (M_obs, (C-1)*M_obs) + XXdf = input.T @ pXdf + # center blocks of hessian: + temp_hess = np.zeros(((self.C - 1) * self.M_obs, (self.C - 1) * self.M_obs)) + for c in range(1, self.C): + inds = range((c - 1)*self.M_obs,c*self.M_obs) + temp_hess[np.ix_(inds, inds)] = XXdf[:, inds] + # off diagonal entries: + hess += temp_hess - Xdf.T@pXdf + # add contribution of prior to hessian + if self.prior_sigma != 0: + hess += (1/(self.prior_sigma)**2) #(1 / (self.prior_sigma) ** 2) + # print('pramss4=', params) + return hess/T + + from scipy.optimize import minimize + # Optimize weights for each state separately: + import time + start = time.time() + for k in range(self.K): + #below 6 lines are only defining the new functions + def _objective_k(params): + return _objective(params, k) + def _gradient_k(params): + return _gradient(params, k) + def _hess_k(params): + return _hess(params, k) + #scipy.optimize.minimize(fun, x0,...) #here fun is the func to be minimized and x0 is the initial guess + sol = minimize(_objective_k, self.params[k].reshape(((self.C-1) * self.M_obs)), hess=_hess_k, jac=_gradient_k, method="trust-ncg") + # print('self.params01=', self.params) + self.params[k] = np.reshape(sol.x, (self.C-1, self.M_obs)) #for InputDrivenObservationsDiffInputshierarchy class: comment out if you want to stop observation weights being updated + # print('self.params02=', self.params) + end = time.time() + # print("M_step observations time InputDrivenObservationsDiffInputshierarchy = " + str(end - start)) + def smooth(self, expectations, data, observation_input, tag): + """ + Compute the mean observation under the posterior distribution + of latent discrete states. + """ + raise NotImplementedError + +''''###################################################### Hierarchical section for GLM only #############################################################''' + +class InputDrivenObservations_hierarchy(Observations): + # K = number of discrete states + # D = number of observed dimensions + # M = exogenous input dimensions (the inputs modulate the probability of discrete state transitions via a multiclass logistic regression) + + #zizi: my questions are numbered here + + def __init__(self, K, D, Wk_glob, M_obs=0, C=2, prior_mean=0, prior_sigma=1000): + # print('K=', K) + # print('D=', D) + # print('Wk_glob2=', Wk_glob) + #1)which one of M=0, C=2, prior_mean = 0, prior_sigma=1000 should I add to Inputdrivenransitions (InT) function? + # 1-1)why M is 0 here? input dimension is not zero? + """ + @param K: number of states + @param D: dimensionality of output + @param C: number of distinct classes for each dimension of output + @param prior_sigma: parameter governing strength of prior. Prior on GLM weights is multivariate + normal distribution with mean 'prior_mean == Wk_glob' and diagonal covariance matrix (prior_sigma is on diagonal) + """ + super(InputDrivenObservations_hierarchy, self).__init__(K, D, M) #3)why the below section is not in InT + self.C = C + self.M = M + self.D = D + self.K = K + self.prior_mean = prior_mean + self.prior_sigma = prior_sigma + + # Parameters linking input to distribution over output classes + self.Wk = npr.randn(K, C - 1, M) + self.Wk_glob = Wk_glob + # print('Wk_glob3=', Wk_glob) + # print('self.Wk=', self.Wk) + + @property + def params(self): + return self.Wk + + @params.setter + def params(self, value): + self.Wk = value + + + def permute(self, perm): + self.Wk = self.Wk[perm] + + def log_prior(self): + lp = 0 + # zizi: if I want to remove log_prior effect: + # print('self.Wk.shape=', self.Wk.shape) + # print('self.Wk_glob.shape=', self.Wk_glob.shape) + # print('self.K2=', self.K) + # print('self.Wk=', self.Wk) + # print('self.Wk_glob=', self.Wk_glob) + + for k in range(self.K): + for c in range(self.C - 1): + weights = self.Wk[k][c] + pri_mean = weights-mean_i # this is with hirearchical case + # pri_mean = weights # this is when I want to be like the case without hirearchical (before) and see the effect + # pri_mean = np.repeat(self.prior_mean, (self.M)) # this has size 4: [self.prior_mean,, self.prior_mean,, self.prior_mean, self.prior_mean] + lp += stats.multivariate_normal_logpdf(weights, mus= (pri_mean), #(weights-mean_i) #mus=np.repeat(self.prior_mean, (self.M)), + Sigmas=((self.prior_sigma) ** 2) * np.identity(self.M)) + # print('pri_mean=', pri_mean) + # print('lpppp=', lp) + return lp + + # Calculate time dependent logits - output is matrix of size TxKxC + # Input is size TxM + def calculate_logits(self, input): + """ + Return array of size TxKxC containing log(pr(yt=C|zt=k)) + :param input: input array of covariates of size TxM + :return: array of size TxKxC containing log(pr(yt=c|zt=k, ut)) for all c in {1, ..., C} and k in {1, ..., K} + """ + # Transpose array dimensions, so that array is now of shape ((C-1)xKx(M+1)) + # print('input.shape=',input.shape) + # print('input=',input) + Wk_tranpose = np.transpose(self.Wk, (1, 0, 2)) + # Stack column of zeros to transform array from size ((C-1)xKx(M+1)) to ((C)xKx(M+1)) and then transform shape back to (KxCx(M+1)) + Wk = np.transpose(np.vstack([Wk_tranpose, np.zeros((1, Wk_tranpose.shape[1], Wk_tranpose.shape[2]))]), + (1, 0, 2)) + # Input effect; transpose so that output has dims TxKxC + time_dependent_logits = np.transpose(np.dot(Wk, input.T), (2, 0, 1)) #Note: this has an unexpected effect when both input (and thus Wk) are empty arrays and returns an array of zeros + time_dependent_logits = time_dependent_logits - logsumexp(time_dependent_logits, axis=2, keepdims=True) + return time_dependent_logits + + def log_likelihoods(self, data, input, mask, tag): #5) please explain the below functions and what they do? + # print('input_log_likelihoods=', input) + if input.ndim == 1 and input.shape == (self.M,): # if input is vector of size self.M (one time point), expand dims to be (1, M) + input = np.expand_dims(input, axis=0) + time_dependent_logits = self.calculate_logits(input) + assert self.D == 1, "InputDrivenObservations_hierarchy written for D = 1!" + mask = np.ones_like(data, dtype=bool) if mask is None else mask + return stats.categorical_logpdf(data[:, None, :], time_dependent_logits[:, :, None, :], mask=mask[:, None, :]) + + def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): + assert self.D == 1, "InputDrivenObservations_hierarchy written for D = 1!" + # print('input1_sample_x=',input) + if input.ndim == 1 and input.shape == (self.M,): # if input is vector of size self.M (one time point), expand dims to be (1, M) + input = np.expand_dims(input, axis=0) + # print('input2_sample_x=', input) + time_dependent_logits = self.calculate_logits(input) # size TxKxC + ps = np.exp(time_dependent_logits) + T = time_dependent_logits.shape[0] + if T == 1: + sample = np.array([npr.choice(self.C, p=ps[t, z]) for t in range(T)]) + elif T > 1: + sample = np.array([npr.choice(self.C, p=ps[t, z[t]]) for t in range(T)]) + return sample + + def m_step(self, expectations, datas, inputs, masks, tags, optimizer = "bfgs", **kwargs): + + T = sum([data.shape[0] for data in datas]) #total number of datapoints + # print('inputs.shape=', np.array(inputs).shape) + + def _multisoftplus(X): + + ''' + computes f(X) = log(1+sum(exp(X), axis =1)) and its first derivative + :param X: array of size Tx(C-1) + :return f(X) of size T and df of size (Tx(C-1)) + ''' + # print('X.shape=', X.shape) + # print('X=', X) + X_augmented = np.append(X, np.zeros((X.shape[0], 1)), 1) # append a column of zeros to X for rowmax calculation + rowmax = np.max(X_augmented, axis = 1, keepdims=1) #get max along column for log-sum-exp trick, rowmax is size T + # compute f: + f = np.log(np.exp(-rowmax[:,0]) + np.sum(np.exp(X - rowmax), axis = 1)) + rowmax[:,0] + # compute df + df = np.exp(X - rowmax)/np.expand_dims((np.exp(-rowmax[:,0]) + np.sum(np.exp(X - rowmax), axis = 1)), axis = 1) + + return f, df + + def _objective(params, k): + ''' + computes term in negative expected complete loglikelihood that depends on weights for state k + :param params: vector of size (C-1)xM + :return term in negative expected complete LL that depends on weights for state k; scalar value + ''' + W = np.reshape(params, (self.C - 1, self.M)) + + obj = 0 + for data, input, mask, tag, (expected_states, _, _) \ + in zip(datas, inputs, masks, tags, expectations): + xproj = input @ W.T # projection of input onto weight matrix for particular state, size is Tx(C-1) + f, _ = _multisoftplus(xproj) + assert data.shape[1] == 1, "InputDrivenObservations_hierarchy written for D = 1!" + data_one_hot = one_hot(data[:, 0], self.C) # convert to one-hot representation of size TxC + temp_obj = (-np.sum(data_one_hot[:,:-1]*xproj, axis = 1) + f)@expected_states[:,k] + obj += temp_obj + + # add contribution of prior: + if self.prior_sigma != 0: + # print('W-mu_mean=', W-mu_mean) + obj += 1/(2*self.prior_sigma**2)*np.sum((W)**2) #((W-mu_mean)**2) + return obj / T + + def _gradient(params, k): + ''' + Explicit calculation of gradient of _objective w.r.t weight matrix for state k, W_{k} + :param params: vector of size (C-1)xM + :param k: state whose parameters we are currently optimizing + :return gradient of objective with respect to parameters; vector of size (C-1)xM + ''' + + W = np.reshape(params, (self.C-1, self.M)) + # mu_mean = self.Wk_glob # TODO CHECK THE SIZE + # print('mu_mean=', mu_mean) + grad = np.zeros((self.C-1, self.M)) + for data, input, mask, tag, (expected_states, _, _) \ + in zip(datas, inputs, masks, tags, expectations): + xproj = input@W.T #projection of input onto weight matrix for particular state, size is Tx(C-1) + _, df = _multisoftplus(xproj) + assert data.shape[1] == 1, "InputDrivenObservations_hierarchy written for D = 1!" + data_one_hot = one_hot(data[:, 0], self.C) #convert to one-hot representation of size TxC + grad += (df - data_one_hot[:,:-1]).T@(expected_states[:, [k]]*input) #gradient is shape (C-1,M) + # Add contribution to gradient from prior: + if self.prior_sigma != 0: + # print('np.array(W).shape=', W.shape) + # print('self.Wk_glob=', self.Wk_glob) + # print('np.array(mu_mean).shape=', mu_mean.shape) + grad += (1/(self.prior_sigma)**2)*(W) #W-mu_mean + # Now flatten grad into a vector: + grad = grad.flatten() + return grad/T + + def _hess(params, k): + ''' + Explicit calculation of hessian of _objective w.r.t weight matrix for state k, W_{k} + :param params: vector of size (C-1)xM + :param k: state whose parameters we are currently optimizing + :return hessian of objective with respect to parameters; matrix of size ((C-1)xM) x ((C-1)xM) + ''' + W = np.reshape(params, (self.C - 1, self.M)) + hess = np.zeros(((self.C - 1)*self.M, (self.C - 1)*self.M)) + for data, input, mask, tag, (expected_states, _, _) \ + in zip(datas, inputs, masks, tags, expectations): + xproj = input @ W.T # projection of input onto weight matrix for particular state + _, df = _multisoftplus(xproj) + # center blocks: + dftensor = np.expand_dims(df, axis = 2) # dims are now (T, (C-1), 1) + Xdf = np.expand_dims(input, axis = 1) * dftensor # multiply every input covariate term with every class derivative term for a given time step; dims are now (T, (C-1), M) + # reshape Xdf to (T, (C-1)*M) + Xdf = np.reshape(Xdf, (Xdf.shape[0], -1)) + # weight Xdf by posterior state probabilities + pXdf = expected_states[:, [k]]*Xdf # output is size (T, (C-1)*M) + # outer product with input vector, size (M, (C-1)*M) + XXdf = input.T @ pXdf + # center blocks of hessian: + temp_hess = np.zeros(((self.C - 1) * self.M, (self.C - 1) * self.M)) + for c in range(1, self.C): + inds = range((c - 1)*self.M,c*self.M) + temp_hess[np.ix_(inds, inds)] = XXdf[:, inds] + # off diagonal entries: + hess += temp_hess - Xdf.T@pXdf + # add contribution of prior to hessian + if self.prior_sigma != 0: + hess += (1 / (self.prior_sigma) ** 2) + + return hess/T + + from scipy.optimize import minimize + # Optimize weights for each state separately: + + #TODO: add timing + import time + start = time.time() + for k in range(self.K): + def _objective_k(params): + return _objective(params, k) + def _gradient_k(params): + return _gradient(params, k) + def _hess_k(params): + return _hess(params, k) + + sol = minimize(_objective_k, self.params[k].reshape(((self.C-1) * self.M)), hess=_hess_k, jac=_gradient_k, method="trust-ncg") + self.params[k] = np.reshape(sol.x, (self.C-1, self.M)) # InputDrivenObservations_hierarchy: comment out if you want to stop observation weights being updated + end = time.time() + # print("M_step observations time InputDrivenObservations_hierarchy = " + str(end-end)) + + + def smooth(self, expectations, data, input, tag): + """ + Compute the mean observation under the posterior distribution + of latent discrete states. + """ + raise NotImplementedError + + + + + +#################### + +# class Observations(object): +# # K = number of discrete states +# # D = number of observed dimensions +# # M = exogenous input dimensions (the inputs modulate the probability of discrete state transitions via a multiclass logistic regression) +# +# def __init__(self, K, D, M=0): +# self.K, self.D, self.M = K, D, M +# +# @property +# def params(self): +# raise NotImplementedError +# +# @params.setter +# def params(self, value): +# raise NotImplementedError +# +# def permute(self, perm): +# pass +# +# @ensure_args_are_lists +# def initialize(self, datas, inputs=None, masks=None, tags=None, init_method="random"): +# Ts = [data.shape[0] for data in datas] +# +# # Get initial discrete states +# if init_method.lower() == 'kmeans': +# # KMeans clustering +# from sklearn.cluster import KMeans +# km = KMeans(self.K) +# km.fit(np.vstack(datas)) +# zs = np.split(km.labels_, np.cumsum(Ts)[:-1]) +# +# elif init_method.lower() =='random': +# # Random assignment +# zs = [npr.choice(self.K, size=T) for T in Ts] +# +# else: +# raise Exception('Not an accepted initialization type: {}'.format(init_method)) +# +# # Make a one-hot encoding of z and treat it as HMM expectations +# Ezs = [one_hot(z, self.K) for z in zs] +# expectations = [(Ez, None, None) for Ez in Ezs] +# +# # Set the variances all at once to use the setter +# self.m_step(expectations, datas, inputs, masks, tags) +# +# def log_prior(self): +# return 0 +# +# def log_likelihoods(self, data, input, mask, tag): +# raise NotImplementedError +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# raise NotImplementedError +# +# def m_step(self, expectations, datas, inputs, masks, tags, +# optimizer="bfgs", **kwargs): +# """ +# If M-step cannot be done in closed form for the observations, default to SGD. +# """ +# optimizer = dict(adam=adam, bfgs=bfgs, lbfgs=lbfgs, rmsprop=rmsprop, sgd=sgd)[optimizer] +# +# # expected log joint +# def _expected_log_joint(expectations): +# elbo =0 # self.log_prior() #elbo =0 +# for data, input, mask, tag, (expected_states, _, _) \ +# in zip(datas, inputs, masks, tags, expectations): +# lls = self.log_likelihoods(data, input, mask, tag) +# elbo += np.sum(expected_states * lls) +# return elbo +# +# # define optimization target +# T = sum([data.shape[0] for data in datas]) +# def _objective(params, itr): +# self.params = params +# obj = _expected_log_joint(expectations) +# return -obj / T +# +# self.params = optimizer(_objective, self.params, **kwargs) +# +# def smooth(self, expectations, data, input, tag): +# raise NotImplementedError +# +# def neg_hessian_expected_log_dynamics_prob(self, Ez, data, input, mask, tag=None): +# raise NotImplementedError +# +# +# class GaussianObservations(Observations): +# def __init__(self, K, D, M=0): +# super(GaussianObservations, self).__init__(K, D, M) +# self.mus = npr.randn(K, D) +# self._sqrt_Sigmas = npr.randn(K, D, D) +# +# @property +# def params(self): +# return self.mus, self._sqrt_Sigmas +# +# @params.setter +# def params(self, value): +# self.mus, self._sqrt_Sigmas = value +# +# def permute(self, perm): +# self.mus = self.mus[perm] +# self._sqrt_Sigmas = self._sqrt_Sigmas[perm] +# +# @property +# def Sigmas(self): +# return np.matmul(self._sqrt_Sigmas, np.swapaxes(self._sqrt_Sigmas, -1, -2)) +# +# def log_likelihoods(self, data, input, mask, tag): +# mus, Sigmas = self.mus, self.Sigmas +# if mask is not None and np.any(~mask) and not isinstance(mus, np.ndarray): +# raise Exception("Current implementation of multivariate_normal_logpdf for masked data" +# "does not work with autograd because it writes to an array. " +# "Use DiagonalGaussian instead if you need to support missing data.") +# +# # stats.multivariate_normal_logpdf supports broadcasting, but we get +# # significant performance benefit if we call it with (TxD), (D,), and (D,D) +# # arrays as inputs +# return np.column_stack([stats.multivariate_normal_logpdf(data, mu, Sigma) +# for mu, Sigma in zip(mus, Sigmas)]) +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# D, mus = self.D, self.mus +# sqrt_Sigmas = self._sqrt_Sigmas if with_noise else np.zeros((self.K, self.D, self.D)) +# return mus[z] + np.dot(sqrt_Sigmas[z], npr.randn(D)) +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# K, D = self.K, self.D +# J = np.zeros((K, D)) +# h = np.zeros((K, D)) +# for (Ez, _, _), y in zip(expectations, datas): +# J += np.sum(Ez[:, :, None], axis=0) +# h += np.sum(Ez[:, :, None] * y[:, None, :], axis=0) +# self.mus = h / J +# +# # Update the variance +# sqerr = np.zeros((K, D, D)) +# weight = np.zeros((K,)) +# for (Ez, _, _), y in zip(expectations, datas): +# resid = y[:, None, :] - self.mus +# sqerr += np.sum(Ez[:, :, None, None] * resid[:, :, None, :] * resid[:, :, :, None], axis=0) +# weight += np.sum(Ez, axis=0) +# self._sqrt_Sigmas = np.linalg.cholesky(sqerr / weight[:, None, None] + 1e-8 * np.eye(self.D)) +# +# def smooth(self, expectations, data, input, tag): +# """ +# Compute the mean observation under the posterior distribution +# of latent discrete states. +# """ +# return expectations.dot(self.mus) +# +# class ExponentialObservations(Observations): +# def __init__(self, K, D, M=0): +# super(ExponentialObservations, self).__init__(K, D, M) +# self.log_lambdas = npr.randn(K, D) +# +# @property +# def params(self): +# return self.log_lambdas +# +# @params.setter +# def params(self, value): +# self.log_lambdas = value +# +# def permute(self, perm): +# self.log_lambdas = self.log_lambdas[perm] +# +# def log_likelihoods(self, data, input, mask, tag): +# lambdas = np.exp(self.log_lambdas) +# mask = np.ones_like(data, dtype=bool) if mask is None else mask +# return stats.exponential_logpdf(data[:, None, :], lambdas, mask=mask[:, None, :]) +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# lambdas = np.exp(self.log_lambdas) +# return npr.exponential(1/lambdas[z]) +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# x = np.concatenate(datas) +# weights = np.concatenate([Ez for Ez, _, _ in expectations]) +# for k in range(self.K): +# self.log_lambdas[k] = -np.log(np.average(x, axis=0, weights=weights[:,k]) + 1e-16) +# +# def smooth(self, expectations, data, input, tag): +# """ +# Compute the mean observation under the posterior distribution +# of latent discrete states. +# """ +# return expectations.dot(1/np.exp(self.log_lambdas)) +# +# class DiagonalGaussianObservations(Observations): +# def __init__(self, K, D, M=0): +# super(DiagonalGaussianObservations, self).__init__(K, D, M) +# self.mus = npr.randn(K, D) +# self._log_sigmasq = -2 + npr.randn(K, D) +# +# @property +# def sigmasq(self): +# return np.exp(self._log_sigmasq) +# +# @sigmasq.setter +# def sigmasq(self, value): +# assert np.all(value > 0) and value.shape == (self.K, self.D) +# self._log_sigmasq = np.log(value) +# +# @property +# def params(self): +# return self.mus, self._log_sigmasq +# +# @params.setter +# def params(self, value): +# self.mus, self._log_sigmasq = value +# +# def permute(self, perm): +# self.mus = self.mus[perm] +# self._log_sigmasq = self._log_sigmasq[perm] +# +# def log_likelihoods(self, data, input, mask, tag): +# mus, sigmas = self.mus, np.exp(self._log_sigmasq) + 1e-16 +# mask = np.ones_like(data, dtype=bool) if mask is None else mask +# return stats.diagonal_gaussian_logpdf(data[:, None, :], mus, sigmas, mask=mask[:, None, :]) +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# D, mus = self.D, self.mus +# sigmas = np.exp(self._log_sigmasq) if with_noise else np.zeros((self.K, self.D)) +# return mus[z] + np.sqrt(sigmas[z]) * npr.randn(D) +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# x = np.concatenate(datas) +# weights = np.concatenate([Ez for Ez, _, _ in expectations]) +# for k in range(self.K): +# self.mus[k] = np.average(x, axis=0, weights=weights[:, k]) +# sqerr = (x - self.mus[k])**2 +# self._log_sigmasq[k] = np.log(np.average(sqerr, weights=weights[:, k], axis=0)) +# +# def smooth(self, expectations, data, input, tag): +# """ +# Compute the mean observation under the posterior distribution +# of latent discrete states. +# """ +# return expectations.dot(self.mus) +# +# +# class StudentsTObservations(Observations): +# def __init__(self, K, D, M=0): +# super(StudentsTObservations, self).__init__(K, D, M) +# self.mus = npr.randn(K, D) +# self._log_sigmasq = -2 + npr.randn(K, D) +# # Student's t distribution also has a degrees of freedom parameter +# self._log_nus = np.log(4) * np.ones((K, D)) +# +# @property +# def sigmasq(self): +# return np.exp(self._log_sigmasq) +# +# @property +# def nus(self): +# return np.exp(self._log_nus) +# +# @property +# def params(self): +# return self.mus, self._log_sigmasq, self._log_nus +# +# @params.setter +# def params(self, value): +# self.mus, self._log_sigmasq, self._log_nus = value +# +# def permute(self, perm): +# self.mus = self.mus[perm] +# self._log_sigmasq = self._log_sigmasq[perm] +# self._log_nus = self._log_nus[perm] +# +# def log_likelihoods(self, data, input, mask, tag): +# D, mus, sigmas, nus = self.D, self.mus, self.sigmasq, self.nus +# mask = np.ones_like(data, dtype=bool) if mask is None else mask +# return stats.independent_studentst_logpdf(data[:, None, :], mus, sigmas, nus, mask=mask[:, None, :]) +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# D, mus, sigmas, nus = self.D, self.mus, self.sigmasq, self.nus +# tau = npr.gamma(nus[z] / 2.0, 2.0 / nus[z]) +# sigma = sigmas[z] / tau if with_noise else 0 +# return mus[z] + np.sqrt(sigma) * npr.randn(D) +# +# def smooth(self, expectations, data, input, tag): +# """ +# Compute the mean observation under the posterior distribution +# of latent discrete states. +# """ +# return expectations.dot(self.mus) +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# """ +# Student's t is a scale mixture of Gaussians. We can estimate its +# parameters using the EM algorithm. See the notebook in doc/students_t for +# complete details. +# """ +# self._m_step_mu_sigma(expectations, datas, inputs, masks, tags) +# self._m_step_nu(expectations, datas, inputs, masks, tags) +# +# def _m_step_mu_sigma(self, expectations, datas, inputs, masks, tags): +# K, D = self.K, self.D +# +# # Estimate the precisions w for each data point +# E_taus = [] +# for y in datas: +# # nu: (K,D) mus: (K, D) sigmas: (K, D) y: (T, D) -> tau: (T, K, D) +# alpha = self.nus/2 + 1/2 +# beta = self.nus/2 + 1/2 * (y[:, None, :] - self.mus)**2 / self.sigmasq +# E_taus.append(alpha / beta) +# +# # Update the mean (notation from natural params of Gaussian) +# J = np.zeros((K, D)) +# h = np.zeros((K, D)) +# for E_tau, (Ez, _, _), y in zip(E_taus, expectations, datas): +# J += np.sum(Ez[:, :, None] * E_tau, axis=0) +# h += np.sum(Ez[:, :, None] * E_tau * y[:, None, :], axis=0) +# self.mus = h / J +# +# # Update the variance +# sqerr = np.zeros((K, D)) +# weight = np.zeros((K, D)) +# for E_tau, (Ez, _, _), y in zip(E_taus, expectations, datas): +# sqerr += np.sum(Ez[:, :, None] * E_tau * (y[:, None, :] - self.mus)**2, axis=0) +# weight += np.sum(Ez[:, :, None], axis=0) +# self._log_sigmasq = np.log(sqerr / weight + 1e-16) +# +# def _m_step_nu(self, expectations, datas, inputs, masks, tags): +# """ +# The shape parameter nu determines a gamma prior. We have +# +# tau_n ~ Gamma(nu/2, nu/2) +# y_n ~ N(mu, sigma^2 / tau_n) +# +# To update nu, we do EM and optimize the expected log likelihood using +# a generalized Newton's method. See the notebook in doc/students_t for +# complete details. +# """ +# K, D = self.K, self.D +# +# # Compute the precisions w for each data point +# E_taus = np.zeros((K, D)) +# E_logtaus = np.zeros((K, D)) +# weights = np.zeros(K) +# for y, (Ez, _, _) in zip(datas, expectations): +# # nu: (K,D) mus: (K, D) sigmas: (K, D) y: (T, D) -> alpha/beta: (T, K, D) +# alpha = self.nus/2 + 1/2 +# beta = self.nus/2 + 1/2 * (y[:, None, :] - self.mus)**2 / self.sigmasq +# +# E_taus += np.sum(Ez[:, :, None] * (alpha / beta), axis=0) +# E_logtaus += np.sum(Ez[:, :, None] * (digamma(alpha) - np.log(beta)), axis=0) +# weights += np.sum(Ez, axis=0) +# +# E_taus /= weights[:, None] +# E_logtaus /= weights[:, None] +# +# for k in range(K): +# for d in range(D): +# self._log_nus[k, d] = np.log(generalized_newton_studentst_dof(E_taus[k, d], E_logtaus[k, d])) +# +# +# class MultivariateStudentsTObservations(Observations): +# def __init__(self, K, D, M=0): +# super(MultivariateStudentsTObservations, self).__init__(K, D, M) +# self.mus = npr.randn(K, D) +# self._sqrt_Sigmas = npr.randn(K, D, D) +# self._log_nus = np.log(4) * np.ones((K,)) +# +# @property +# def Sigmas(self): +# return np.matmul(self._sqrt_Sigmas, np.swapaxes(self._sqrt_Sigmas, -1, -2)) +# +# @property +# def nus(self): +# return np.exp(self._log_nus) +# +# @property +# def params(self): +# return self.mus, self._sqrt_Sigmas, self._log_nus +# +# @params.setter +# def params(self, value): +# self.mus, self._sqrt_Sigmas, self._log_nus = value +# +# def permute(self, perm): +# self.mus = self.mus[perm] +# self._sqrt_Sigmas = self._sqrt_Sigmas[perm] +# self._log_nus = self._log_nus[perm] +# +# def log_likelihoods(self, data, input, mask, tag): +# assert np.all(mask), "MultivariateStudentsTObservations does not support missing data" +# D, mus, Sigmas, nus = self.D, self.mus, self.Sigmas, self.nus +# +# # stats.multivariate_studentst_logpdf supports broadcasting, but we get +# # significant performance benefit if we call it with (TxD), (D,), (D,D), and (,) +# # arrays as inputs +# return np.column_stack([stats.multivariate_studentst_logpdf(data, mu, Sigma, nu) +# for mu, Sigma, nu in zip(mus, Sigmas, nus)]) +# +# # return stats.multivariate_studentst_logpdf(data[:, None, :], mus, Sigmas, nus) +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# """ +# Student's t is a scale mixture of Gaussians. We can estimate its +# parameters using the EM algorithm. See the notebook in doc/students_t for +# complete details. +# """ +# self._m_step_mu_sigma(expectations, datas, inputs, masks, tags) +# self._m_step_nu(expectations, datas, inputs, masks, tags) +# +# def _m_step_mu_sigma(self, expectations, datas, inputs, masks, tags): +# K, D = self.K, self.D +# +# # Estimate the precisions w for each data point +# E_taus = [] +# for y in datas: +# # nu: (K,) mus: (K, D) Sigmas: (K, D, D) y: (T, D) -> tau: (T, K) +# alpha = self.nus/2 + D/2 +# beta = self.nus/2 + 1/2 * stats.batch_mahalanobis(self._sqrt_Sigmas, y[:, None, :] - self.mus) +# E_taus.append(alpha / beta) +# +# # Update the mean (notation from natural params of Gaussian) +# J = np.zeros((K,)) +# h = np.zeros((K, D)) +# for E_tau, (Ez, _, _), y in zip(E_taus, expectations, datas): +# J += np.sum(Ez * E_tau, axis=0) +# h += np.sum(Ez[:, :, None] * E_tau[:, :, None] * y[:, None, :], axis=0) +# self.mus = h / J[:, None] +# +# # Update the variance +# sqerr = np.zeros((K, D, D)) +# weight = np.zeros((K,)) +# for E_tau, (Ez, _, _), y in zip(E_taus, expectations, datas): +# # sqerr += np.sum(Ez[:, :, None] * E_tau * (y[:, None, :] - self.mus)**2, axis=0) +# resid = y[:, None, :] - self.mus +# sqerr += np.einsum('tk,tk,tki,tkj->kij', Ez, E_tau, resid, resid) +# weight += np.sum(Ez, axis=0) +# +# self._sqrt_Sigmas = np.linalg.cholesky(sqerr / weight[:, None, None] + 1e-8 * np.eye(D)) +# +# def _m_step_nu(self, expectations, datas, inputs, masks, tags): +# """ +# The shape parameter nu determines a gamma prior. We have +# +# tau_n ~ Gamma(nu/2, nu/2) +# y_n ~ N(mu, Sigma / tau_n) +# +# To update nu, we do EM and optimize the expected log likelihood using +# a generalized Newton's method. See the notebook in doc/students_t for +# complete details. +# """ +# K, D = self.K, self.D +# +# # Compute the precisions w for each data point +# E_taus = np.zeros(K) +# E_logtaus = np.zeros(K) +# weights = np.zeros(K) +# for y, (Ez, _, _) in zip(datas, expectations): +# # nu: (K,) mus: (K, D) Sigmas: (K, D, D) y: (T, D) -> alpha/beta: (T, K) +# alpha = self.nus/2 + D/2 +# beta = self.nus/2 + 1/2 * stats.batch_mahalanobis(self._sqrt_Sigmas, y[:, None, :] - self.mus) +# +# E_taus += np.sum(Ez * (alpha / beta), axis=0) +# E_logtaus += np.sum(Ez * (digamma(alpha) - np.log(beta)), axis=0) +# weights += np.sum(Ez, axis=0) +# +# E_taus /= weights +# E_logtaus /= weights +# +# for k in range(K): +# self._log_nus[k] = np.log(generalized_newton_studentst_dof(E_taus[k], E_logtaus[k])) +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# D, mus, Sigmas, nus = self.D, self.mus, self.Sigmas, self.nus +# tau = npr.gamma(nus[z] / 2.0, 2.0 / nus[z]) +# sqrt_Sigma = np.linalg.cholesky(Sigmas[z] / tau) if with_noise else 0 +# return mus[z] + np.dot(sqrt_Sigma, npr.randn(D)) +# +# def smooth(self, expectations, data, input, tag): +# """ +# Compute the mean observation under the posterior distribution +# of latent discrete states. +# """ +# return expectations.dot(self.mus) +# +# +# class BernoulliObservations(Observations): +# +# def __init__(self, K, D, M=0): +# super(BernoulliObservations, self).__init__(K, D, M) +# self.logit_ps = npr.randn(K, D) +# +# @property +# def params(self): +# return self.logit_ps +# +# @params.setter +# def params(self, value): +# self.logit_ps = value +# +# def permute(self, perm): +# self.logit_ps = self.logit_ps[perm] +# +# def log_likelihoods(self, data, input, mask, tag): +# mask = np.ones_like(data, dtype=bool) if mask is None else mask +# return stats.bernoulli_logpdf(data[:, None, :], self.logit_ps, mask=mask[:, None, :]) +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# ps = 1 / (1 + np.exp(self.logit_ps)) +# return npr.rand(self.D) < ps[z] +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# x = np.concatenate(datas) +# weights = np.concatenate([Ez for Ez, _, _ in expectations]) +# for k in range(self.K): +# ps = np.clip(np.average(x, axis=0, weights=weights[:,k]), 1e-3, 1-1e-3) +# self.logit_ps[k] = logit(ps) +# +# def smooth(self, expectations, data, input, tag): +# """ +# Compute the mean observation under the posterior distribution +# of latent discrete states. +# """ +# ps = 1 / (1 + np.exp(self.logit_ps)) +# return expectations.dot(ps) +# +# +# class PoissonObservations(Observations): +# +# def __init__(self, K, D, M=0): +# super(PoissonObservations, self).__init__(K, D, M) +# self.log_lambdas = npr.randn(K, D) +# +# @property +# def params(self): +# return self.log_lambdas +# +# @params.setter +# def params(self, value): +# self.log_lambdas = value +# +# def permute(self, perm): +# self.log_lambdas = self.log_lambdas[perm] +# +# def log_likelihoods(self, data, input, mask, tag): +# lambdas = np.exp(self.log_lambdas) +# mask = np.ones_like(data, dtype=bool) if mask is None else mask +# return stats.poisson_logpdf(data[:, None, :], lambdas, mask=mask[:, None, :]) +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# lambdas = np.exp(self.log_lambdas) +# return npr.poisson(lambdas[z]) +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# x = np.concatenate(datas) +# weights = np.concatenate([Ez for Ez, _, _ in expectations]) +# for k in range(self.K): +# self.log_lambdas[k] = np.log(np.average(x, axis=0, weights=weights[:,k]) + 1e-16) +# +# def smooth(self, expectations, data, input, tag): +# """ +# Compute the mean observation under the posterior distribution +# of latent discrete states. +# """ +# return expectations.dot(np.exp(self.log_lambdas)) +# +# +# class CategoricalObservations(Observations): +# +# def __init__(self, K, D, M=0, C=2): +# """ +# @param C: number of classes in the categorical observations +# """ +# super(CategoricalObservations, self).__init__(K, D, M) +# self.C = C +# self.logits = npr.randn(K, D, C) +# +# @property +# def params(self): +# return self.logits +# +# @params.setter +# def params(self, value): +# self.logits = value +# +# def permute(self, perm): +# self.logits = self.logits[perm] +# +# def log_likelihoods(self, data, input, mask, tag): +# mask = np.ones_like(data, dtype=bool) if mask is None else mask +# return stats.categorical_logpdf(data[:, None, :], self.logits, mask=mask[:, None, :]) +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# ps = np.exp(self.logits - logsumexp(self.logits, axis=2, keepdims=True)) +# return np.array([npr.choice(self.C, p=ps[z, d]) for d in range(self.D)]) +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# x = np.concatenate(datas) +# weights = np.concatenate([Ez for Ez, _, _ in expectations]) +# for k in range(self.K): +# # compute weighted histogram of the class assignments +# xoh = one_hot(x, self.C) # T x D x C +# ps = np.average(xoh, axis=0, weights=weights[:, k]) + 1e-3 # D x C +# ps /= np.sum(ps, axis=-1, keepdims=True) +# self.logits[k] = np.log(ps) +# +# def smooth(self, expectations, data, input, tag): +# """ +# Compute the mean observation under the posterior distribution +# of latent discrete states. +# """ +# raise NotImplementedError +# +# class InputDrivenObservations(Observations): +# # K = number of discrete states +# # D = number of observed dimensions +# # M = exogenous input dimensions (the inputs modulate the probability of discrete state transitions via a multiclass logistic regression) +# +# #zizi: my questions are numbered here +# +# def __init__(self, K, D, M=0, C=2, prior_mean = 0, prior_sigma=1000): +# #1)which one of M=0, C=2, prior_mean = 0, prior_sigma=1000 should I add to Inputdrivenransitions (InT) function? +# # 1-1)why M is 0 here? input dimension is not zero? +# """ +# @param K: number of states +# @param D: dimensionality of output +# @param C: number of distinct classes for each dimension of output +# @param prior_sigma: parameter governing strength of prior. Prior on GLM weights is multivariate +# normal distribution with mean 'prior_mean' and diagonal covariance matrix (prior_sigma is on diagonal) +# """ +# super(InputDrivenObservations, self).__init__(K, D, M) #3)why the below section is not in InT +# self.C = C +# self.M = M +# self.D = D +# self.K = K +# self.prior_mean = prior_mean +# self.prior_sigma = prior_sigma +# +# # Parameters linking input to distribution over output classes +# self.Wk = npr.randn(K, C - 1, M) +# +# @property +# def params(self): +# return self.Wk +# +# @params.setter +# def params(self, value): +# self.Wk = value +# +# def permute(self, perm): +# self.Wk = self.Wk[perm] +# +# def log_prior(self): +# lp = 0 +# # for k in range(self.K): +# # for c in range(self.C - 1): +# # weights = self.Wk[k][c] +# # lp += stats.multivariate_normal_logpdf(weights, mus=np.repeat(self.prior_mean, (self.M)), +# # Sigmas=((self.prior_sigma) ** 2) * np.identity(self.M)) +# return lp +# +# # Calculate time dependent logits - output is matrix of size TxKxC +# # Input is size TxM +# def calculate_logits(self, input): +# """ +# Return array of size TxKxC containing log(pr(yt=C|zt=k)) +# :param input: input array of covariates of size TxM +# :return: array of size TxKxC containing log(pr(yt=c|zt=k, ut)) for all c in {1, ..., C} and k in {1, ..., K} +# """ +# # Transpose array dimensions, so that array is now of shape ((C-1)xKx(M+1)) +# # print('input.shape=',input.shape) +# # print('input=',input) +# Wk_tranpose = np.transpose(self.Wk, (1, 0, 2)) +# # Stack column of zeros to transform array from size ((C-1)xKx(M+1)) to ((C)xKx(M+1)) and then transform shape back to (KxCx(M+1)) +# Wk = np.transpose(np.vstack([Wk_tranpose, np.zeros((1, Wk_tranpose.shape[1], Wk_tranpose.shape[2]))]), +# (1, 0, 2)) +# # Input effect; transpose so that output has dims TxKxC +# time_dependent_logits = np.transpose(np.dot(Wk, input.T), (2, 0, 1)) #Note: this has an unexpected effect when both input (and thus Wk) are empty arrays and returns an array of zeros +# time_dependent_logits = time_dependent_logits - logsumexp(time_dependent_logits, axis=2, keepdims=True) +# return time_dependent_logits +# +# def log_likelihoods(self, data, input, mask, tag): #5) please explain the below functions and what they do? +# # print('input_log_likelihoods=', input) +# if input.ndim == 1 and input.shape == (self.M,): # if input is vector of size self.M (one time point), expand dims to be (1, M) +# input = np.expand_dims(input, axis=0) +# time_dependent_logits = self.calculate_logits(input) +# assert self.D == 1, "InputDrivenObservations written for D = 1!" +# mask = np.ones_like(data, dtype=bool) if mask is None else mask +# return stats.categorical_logpdf(data[:, None, :], time_dependent_logits[:, :, None, :], mask=mask[:, None, :]) +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# assert self.D == 1, "InputDrivenObservations written for D = 1!" +# # print('input1_sample_x=',input) +# if input.ndim == 1 and input.shape == (self.M,): # if input is vector of size self.M (one time point), expand dims to be (1, M) +# input = np.expand_dims(input, axis=0) +# # print('input2_sample_x=', input) +# time_dependent_logits = self.calculate_logits(input) # size TxKxC +# ps = np.exp(time_dependent_logits) +# T = time_dependent_logits.shape[0] +# if T == 1: +# sample = np.array([npr.choice(self.C, p=ps[t, z]) for t in range(T)]) +# elif T > 1: +# sample = np.array([npr.choice(self.C, p=ps[t, z[t]]) for t in range(T)]) +# return sample +# +# def m_step(self, expectations, datas, inputs, masks, tags, optimizer = "bfgs", **kwargs): +# +# T = sum([data.shape[0] for data in datas]) #total number of datapoints +# print('inputs.shape=', np.array(inputs).shape) +# +# def _multisoftplus(X): +# ''' +# computes f(X) = log(1+sum(exp(X), axis =1)) and its first derivative +# :param X: array of size Tx(C-1) +# :return f(X) of size T and df of size (Tx(C-1)) +# ''' +# # print('X.shape=', X.shape) +# # print('X=', X) +# X_augmented = np.append(X, np.zeros((X.shape[0], 1)), 1) # append a column of zeros to X for rowmax calculation +# rowmax = np.max(X_augmented, axis = 1, keepdims=1) #get max along column for log-sum-exp trick, rowmax is size T +# # compute f: +# f = np.log(np.exp(-rowmax[:,0]) + np.sum(np.exp(X - rowmax), axis = 1)) + rowmax[:,0] +# # compute df +# df = np.exp(X - rowmax)/np.expand_dims((np.exp(-rowmax[:,0]) + np.sum(np.exp(X - rowmax), axis = 1)), axis = 1) +# return f, df +# +# def _objective(params, k): +# ''' +# computes term in negative expected complete loglikelihood that depends on weights for state k +# :param params: vector of size (C-1)xM +# :return term in negative expected complete LL that depends on weights for state k; scalar value +# ''' +# W = np.reshape(params, (self.C - 1, self.M)) +# obj = 0 +# for data, input, mask, tag, (expected_states, _, _) \ +# in zip(datas, inputs, masks, tags, expectations): +# xproj = input @ W.T # projection of input onto weight matrix for particular state, size is Tx(C-1) +# f, _ = _multisoftplus(xproj) +# assert data.shape[1] == 1, "InputDrivenObservations written for D = 1!" +# data_one_hot = one_hot(data[:, 0], self.C) # convert to one-hot representation of size TxC +# temp_obj = (-np.sum(data_one_hot[:,:-1]*xproj, axis = 1) + f)@expected_states[:,k] +# obj += temp_obj +# +# # add contribution of prior: +# if self.prior_sigma != 0: +# obj += 1/(2*self.prior_sigma**2)*np.sum(W**2) +# return obj / T +# +# def _gradient(params, k): +# ''' +# Explicit calculation of gradient of _objective w.r.t weight matrix for state k, W_{k} +# :param params: vector of size (C-1)xM +# :param k: state whose parameters we are currently optimizing +# :return gradient of objective with respect to parameters; vector of size (C-1)xM +# ''' +# W = np.reshape(params, (self.C-1, self.M)) +# grad = np.zeros((self.C-1, self.M)) +# for data, input, mask, tag, (expected_states, _, _) \ +# in zip(datas, inputs, masks, tags, expectations): +# xproj = input@W.T #projection of input onto weight matrix for particular state, size is Tx(C-1) +# _, df = _multisoftplus(xproj) +# assert data.shape[1] == 1, "InputDrivenObservations written for D = 1!" +# data_one_hot = one_hot(data[:, 0], self.C) #convert to one-hot representation of size TxC +# grad += (df - data_one_hot[:,:-1]).T@(expected_states[:, [k]]*input) #gradient is shape (C-1,M) +# # Add contribution to gradient from prior: +# if self.prior_sigma != 0: +# grad += (1/(self.prior_sigma)**2)*W +# # Now flatten grad into a vector: +# grad = grad.flatten() +# return grad/T +# +# def _hess(params, k): +# ''' +# Explicit calculation of hessian of _objective w.r.t weight matrix for state k, W_{k} +# :param params: vector of size (C-1)xM +# :param k: state whose parameters we are currently optimizing +# :return hessian of objective with respect to parameters; matrix of size ((C-1)xM) x ((C-1)xM) +# ''' +# W = np.reshape(params, (self.C - 1, self.M)) +# hess = np.zeros(((self.C - 1)*self.M, (self.C - 1)*self.M)) +# for data, input, mask, tag, (expected_states, _, _) \ +# in zip(datas, inputs, masks, tags, expectations): +# xproj = input @ W.T # projection of input onto weight matrix for particular state +# _, df = _multisoftplus(xproj) +# # center blocks: +# dftensor = np.expand_dims(df, axis = 2) # dims are now (T, (C-1), 1) +# Xdf = np.expand_dims(input, axis = 1) * dftensor # multiply every input covariate term with every class derivative term for a given time step; dims are now (T, (C-1), M) +# # reshape Xdf to (T, (C-1)*M) +# Xdf = np.reshape(Xdf, (Xdf.shape[0], -1)) +# # weight Xdf by posterior state probabilities +# pXdf = expected_states[:, [k]]*Xdf # output is size (T, (C-1)*M) +# # outer product with input vector, size (M, (C-1)*M) +# XXdf = input.T @ pXdf +# # center blocks of hessian: +# temp_hess = np.zeros(((self.C - 1) * self.M, (self.C - 1) * self.M)) +# for c in range(1, self.C): +# inds = range((c - 1)*self.M,c*self.M) +# temp_hess[np.ix_(inds, inds)] = XXdf[:, inds] +# # off diagonal entries: +# hess += temp_hess - Xdf.T@pXdf +# # add contribution of prior to hessian +# if self.prior_sigma != 0: +# hess += (1 / (self.prior_sigma) ** 2) +# return hess/T +# +# from scipy.optimize import minimize +# # Optimize weights for each state separately: +# for k in range(self.K): +# def _objective_k(params): +# return _objective(params, k) +# def _gradient_k(params): +# return _gradient(params, k) +# def _hess_k(params): +# return _hess(params, k) +# +# sol = minimize(_objective_k, self.params[k].reshape(((self.C-1) * self.M)), hess=_hess_k, jac=_gradient_k, method="trust-ncg") +# self.params[k] = np.reshape(sol.x, (self.C-1, self.M)) #comment out if you want to stop observation weights being updated +# +# def smooth(self, expectations, data, input, tag): +# """ +# Compute the mean observation under the posterior distribution +# of latent discrete states. +# """ +# raise NotImplementedError +# +# class InputDrivenObservationsDiffInputs(Observations): #zizi: I defined this for when size of inputs for transition and observations are different +# # K = number of discrete states +# # D = number of observed dimensions +# # M = exogenous input dimensions (the inputs modulate the probability of discrete state transitions via a multiclass logistic regression) +# +# #zizi: my questions are numbered here +# +# def __init__(self, K, D, M_obs=0, C=2, prior_mean = 0, prior_sigma=1000): +# #1)which one of M=0, C=2, prior_mean = 0, prior_sigma=1000 should I add to Inputdrivenransitions (InT) function? +# # 1-1)why M is 0 here? input dimension is not zero? +# """ +# @param K: number of states +# @param D: dimensionality of output +# @param C: number of distinct classes for each dimension of output +# @param prior_sigma: parameter governing strength of prior. Prior on GLM weights is multivariate +# normal distribution with mean 'prior_mean' and diagonal covariance matrix (prior_sigma is on diagonal) +# """ +# super(InputDrivenObservationsDiffInputs, self).__init__(K, D, M_obs) #3)why the below section is not in InT +# self.C = C +# self.M_obs = M_obs +# self.D = D +# self.K = K +# self.prior_mean = prior_mean +# self.prior_sigma = prior_sigma +# +# # Parameters linking input to distribution over output classes +# self.Wk = npr.randn(K, C - 1, M_obs) +# +# @property +# def params(self): +# return self.Wk +# +# @params.setter +# def params(self, value): +# self.Wk = value +# +# def permute(self, perm): +# self.Wk = self.Wk[perm] +# +# def log_prior(self): +# lp = 0 +# # for k in range(self.K): +# # for c in range(self.C - 1): +# # weights = self.Wk[k][c] +# # lp += stats.multivariate_normal_logpdf(weights, mus=np.repeat(self.prior_mean, (self.M_obs)), +# # Sigmas=((self.prior_sigma) ** 2) * np.identity(self.M_obs)) +# return lp +# +# # Calculate time dependent logits - output is matrix of size TxKxC +# # Input is size TxM +# def calculate_logits(self, observation_input): +# """ +# Return array of size TxKxC containing log(pr(yt=C|zt=k)) +# :param observation_input: observation_input array of covariates of size TxM_obs +# :return: array of size TxKxC containing log(pr(yt=c|zt=k, ut)) for all c in {1, ..., C} and k in {1, ..., K} +# """ +# # Transpose array dimensions, so that array is now of shape ((C-1)xKx(M+1)) +# # print('observation_input.shape=',observation_input.shape) +# # print('observation_input=',observation_input) +# Wk_tranpose = np.transpose(self.Wk, (1, 0, 2)) +# # Stack column of zeros to transform array from size ((C-1)xKx(M_obs+1)) to ((C)xKx(M_obs+1)) and then transform shape back to (KxCx(M_obs+1)) +# Wk = np.transpose(np.vstack([Wk_tranpose, np.zeros((1, Wk_tranpose.shape[1], Wk_tranpose.shape[2]))]), +# (1, 0, 2)) +# # Input effect; transpose so that output has dims TxKxC +# time_dependent_logits = np.transpose(np.dot(Wk, observation_input.T), (2, 0, 1)) #Note: this has an unexpected effect when both input (and thus Wk) are empty arrays and returns an array of zeros +# time_dependent_logits = time_dependent_logits - logsumexp(time_dependent_logits, axis=2, keepdims=True) +# return time_dependent_logits +# +# def log_likelihoods(self, data, observation_input, mask, tag): #5) please explain the below functions and what they do? +# # print('input_log_likelihoods=', observation_input) +# if observation_input.ndim == 1 and observation_input.shape == (self.M_obs,): # if input is vector of size self.M_obs (one time point), expand dims to be (1, M_obs) +# observation_input = np.expand_dims(observation_input, axis=0) +# time_dependent_logits = self.calculate_logits(observation_input) +# assert self.D == 1, "InputDrivenObservationsDiffInputs written for D = 1!" +# mask = np.ones_like(data, dtype=bool) if mask is None else mask +# return stats.categorical_logpdf(data[:, None, :], time_dependent_logits[:, :, None, :], mask=mask[:, None, :]) +# +# def sample_x(self, z, xhist, observation_input=None, tag=None, with_noise=True): +# assert self.D == 1, "InputDrivenObservationsDiffInputs written for D = 1!" +# # print('input1_sample_x=',observation_input) +# if observation_input.ndim == 1 and observation_input.shape == (self.M_obs,): # if input is vector of size self.M (one time point), expand dims to be (1, M_obs) +# observation_input = np.expand_dims(observation_input, axis=0) +# # print('input2_sample_x=', observation_input) +# time_dependent_logits = self.calculate_logits(observation_input) # size TxKxC +# ps = np.exp(time_dependent_logits) +# T = time_dependent_logits.shape[0] +# if T == 1: +# sample = np.array([npr.choice(self.C, p=ps[t, z]) for t in range(T)]) +# elif T > 1: +# sample = np.array([npr.choice(self.C, p=ps[t, z[t]]) for t in range(T)]) +# return sample +# +# def m_step(self, expectations, datas, observation_input, masks, tags, optimizer = "bfgs", **kwargs): +# +# T = sum([data.shape[0] for data in datas]) #total number of datapoints: time_bins +# def _multisoftplus(X): +# ''' +# computes f(X) = log(1+sum(exp(X), axis =1)) and its first derivative +# :param X: array of size Tx(C-1) +# :return f(X) of size T and df of size (Tx(C-1)) +# ''' +# # print('X.shape=',X.shape) +# # print('X=', X) +# X_augmented = np.append(X, np.zeros((X.shape[0], 1)), 1) # append a column of zeros to X for rowmax calculation +# rowmax = np.max(X_augmented, axis = 1, keepdims=1) #get max along column for log-sum-exp trick, rowmax is size T +# # compute f: +# f = np.log(np.exp(-rowmax[:,0]) + np.sum(np.exp(X - rowmax), axis = 1)) + rowmax[:,0] +# # compute df +# df = np.exp(X - rowmax)/np.expand_dims((np.exp(-rowmax[:,0]) + np.sum(np.exp(X - rowmax), axis = 1)), axis = 1) +# return f, df +# +# def _objective(params, k): +# ''' +# computes term in negative expected complete loglikelihood that depends on weights for state k +# :param params: vector of size (C-1)xM_obs +# :return term in negative expected complete LL that depends on weights for state k; scalar value +# ''' +# W = np.reshape(params, (self.C - 1, self.M_obs)) +# obj = 0 +# # zizi: in some belwo lines input is not observation_input as it is variable +# for data, input, mask, tag, (expected_states, _, _) \ +# in zip(datas, observation_input, masks, tags, expectations): +# xproj = input @ W.T # projection of input onto weight matrix for particular state, size is Tx(C-1) +# f, _ = _multisoftplus(xproj) +# assert data.shape[1] == 1, "InputDrivenObservationsDiffInputs written for D = 1!" +# data_one_hot = one_hot(data[:, 0], self.C) # convert to one-hot representation of size TxC +# temp_obj = (-np.sum(data_one_hot[:,:-1]*xproj, axis = 1) + f)@expected_states[:,k] +# obj += temp_obj +# +# # add contribution of prior: +# if self.prior_sigma != 0: +# obj += 1/(2*self.prior_sigma**2)*np.sum(W**2) +# return obj / T +# +# def _gradient(params, k): +# ''' +# Explicit calculation of gradient of _objective w.r.t weight matrix for state k, W_{k} +# :param params: vector of size (C-1)xM_obs +# :param k: state whose parameters we are currently optimizing +# :return gradient of objective with respect to parameters; vector of size (C-1)xM_obs +# ''' +# W = np.reshape(params, (self.C-1, self.M_obs)) +# grad = np.zeros((self.C-1, self.M_obs)) +# # zizi: in some belwo lines input is not observation_input as it is variable +# for data, input, mask, tag, (expected_states, _, _) \ +# in zip(datas, observation_input, masks, tags, expectations): +# xproj = input@W.T #projection of input onto weight matrix for particular state, size is Tx(C-1) +# _, df = _multisoftplus(xproj) +# assert data.shape[1] == 1, "InputDrivenObservationsDiffInputs written for D = 1!" +# data_one_hot = one_hot(data[:, 0], self.C) #convert to one-hot representation of size TxC +# grad += (df - data_one_hot[:,:-1]).T@(expected_states[:, [k]]*input) #gradient is shape (C-1,M_obs) +# # Add contribution to gradient from prior: +# if self.prior_sigma != 0: +# grad += (1/(self.prior_sigma)**2)*W +# # Now flatten grad into a vector: +# grad = grad.flatten() +# return grad/T +# +# def _hess(params, k): +# ''' +# Explicit calculation of hessian of _objective w.r.t weight matrix for state k, W_{k} +# :param params: vector of size (C-1)xM_obs +# :param k: state whose parameters we are currently optimizing +# :return hessian of objective with respect to parameters; matrix of size ((C-1)xM_obs) x ((C-1)xM_obs) +# ''' +# W = np.reshape(params, (self.C - 1, self.M_obs)) +# hess = np.zeros(((self.C - 1)*self.M_obs, (self.C - 1)*self.M_obs)) +# # zizi: in some belwo lines input is not observation_input as it is variable +# for data, input, mask, tag, (expected_states, _, _) \ +# in zip(datas, observation_input, masks, tags, expectations): +# xproj = input @ W.T # projection of input onto weight matrix for particular state +# _, df = _multisoftplus(xproj) +# # center blocks: +# dftensor = np.expand_dims(df, axis = 2) # dims are now (T, (C-1), 1) +# Xdf = np.expand_dims(input, axis = 1) * dftensor # multiply every input covariate term with every class derivative term for a given time step; dims are now (T, (C-1), M) +# # reshape Xdf to (T, (C-1)*M_obs) +# Xdf = np.reshape(Xdf, (Xdf.shape[0], -1)) +# # weight Xdf by posterior state probabilities +# pXdf = expected_states[:, [k]]*Xdf # output is size (T, (C-1)*M_obs) +# # outer product with input vector, size (M_obs, (C-1)*M_obs) +# XXdf = input.T @ pXdf +# # center blocks of hessian: +# temp_hess = np.zeros(((self.C - 1) * self.M_obs, (self.C - 1) * self.M_obs)) +# for c in range(1, self.C): +# inds = range((c - 1)*self.M_obs,c*self.M_obs) +# temp_hess[np.ix_(inds, inds)] = XXdf[:, inds] +# # off diagonal entries: +# hess += temp_hess - Xdf.T@pXdf +# # add contribution of prior to hessian +# if self.prior_sigma != 0: +# hess += (1 / (self.prior_sigma) ** 2) +# return hess/T +# +# from scipy.optimize import minimize +# # Optimize weights for each state separately: +# for k in range(self.K): +# def _objective_k(params): +# return _objective(params, k) +# def _gradient_k(params): +# return _gradient(params, k) +# def _hess_k(params): +# return _hess(params, k) +# sol = minimize(_objective_k, self.params[k].reshape(((self.C-1) * self.M_obs)), hess=_hess_k, jac=_gradient_k, method="trust-ncg") +# self.params[k] = np.reshape(sol.x, (self.C-1, self.M_obs)) +# +# def smooth(self, expectations, data, observation_input, tag): +# """ +# Compute the mean observation under the posterior distribution +# of latent discrete states. +# """ +# raise NotImplementedError +# +# +# class _AutoRegressiveObservationsBase(Observations): +# """ +# Base class for autoregressive observations of the form, +# +# E[x_t | x_{t-1}, z_t=k, u_t] +# = \sum_{l=1}^{L} A_k^{(l)} x_{t-l} + b_k + V_k u_t. +# +# where L is the number of lags and u_t is the input. +# """ +# def __init__(self, K, D, M=0, lags=1): +# super(_AutoRegressiveObservationsBase, self).__init__(K, D, M) +# +# # Distribution over initial point +# self.mu_init = np.zeros((K, D)) +# +# # AR parameters +# assert lags > 0 +# self.lags = lags +# self.bs = npr.randn(K, D) +# self.Vs = npr.randn(K, D, M) +# +# # Inheriting classes may treat _As differently +# self._As = None +# +# @property +# def As(self): +# return self._As +# +# @As.setter +# def As(self, value): +# self._As = value +# +# @property +# def params(self): +# return self.As, self.bs, self.Vs +# +# @params.setter +# def params(self, value): +# self.As, self.bs, self.Vs = value +# +# def permute(self, perm): +# self.mu_init = self.mu_init[perm] +# self.As = self.As[perm] +# self.bs = self.bs[perm] +# self.Vs = self.Vs[perm] +# +# def _compute_mus(self, data, input, mask, tag): +# # assert np.all(mask), "ARHMM cannot handle missing data" +# K, M = self.K, self.M +# T, D = data.shape +# As, bs, Vs, mu0s = self.As, self.bs, self.Vs, self.mu_init +# +# # Instantaneous inputs +# mus = np.empty((K, T, D)) +# mus = [] +# for k, (A, b, V, mu0) in enumerate(zip(As, bs, Vs, mu0s)): +# # Initial condition +# mus_k_init = mu0 * np.ones((self.lags, D)) +# +# # Subsequent means are determined by the AR process +# mus_k_ar = np.dot(input[self.lags:, :M], V.T) +# for l in range(self.lags): +# Al = A[:, l*D:(l + 1)*D] +# mus_k_ar = mus_k_ar + np.dot(data[self.lags-l-1:-l-1], Al.T) +# mus_k_ar = mus_k_ar + b +# +# # Append concatenated mean +# mus.append(np.vstack((mus_k_init, mus_k_ar))) +# +# return np.array(mus) +# +# def smooth(self, expectations, data, input, tag): +# """ +# Compute the mean observation under the posterior distribution +# of latent discrete states. +# """ +# T = expectations.shape[0] +# mask = np.ones((T, self.D), dtype=bool) +# mus = np.swapaxes(self._compute_mus(data, input, mask, tag), 0, 1) +# return (expectations[:, :, None] * mus).sum(1) +# +# +# class AutoRegressiveObservations(_AutoRegressiveObservationsBase): +# """ +# AutoRegressive observation model with Gaussian noise. +# +# (x_t | z_t = k, u_t) ~ N(A_k x_{t-1} + b_k + V_k u_t, S_k) +# +# where S_k is a positive definite covariance matrix. +# +# The parameters are fit via maximum likelihood estimation. +# """ +# def __init__(self, K, D, M=0, lags=1, +# l2_penalty_A=1e-8, +# l2_penalty_b=1e-8, +# l2_penalty_V=1e-8, +# nu0=1e-4, Psi0=1e-4): +# super(AutoRegressiveObservations, self).\ +# __init__(K, D, M, lags=lags) +# +# # Initialize the dynamics and the noise covariances +# self._As = .80 * np.array([ +# np.column_stack([random_rotation(D), np.zeros((D, (lags-1) * D))]) +# for _ in range(K)]) +# +# self._sqrt_Sigmas_init = np.tile(np.eye(D)[None, ...], (K, 1, 1)) +# self._sqrt_Sigmas = npr.randn(K, D, D) +# +# # Set natural parameters of Gaussian prior on (A, V, b) weight matrix +# J0_diag = np.concatenate((l2_penalty_A * np.ones(D * lags), +# l2_penalty_V * np.ones(M), +# l2_penalty_b * np.ones(1))) +# self.J0 = np.tile(np.diag(J0_diag)[None, :, :], (K, 1, 1)) +# +# h0 = np.concatenate((l2_penalty_A * np.eye(D), +# np.zeros((D * (lags - 1), D)), +# np.zeros((M + 1, D)))) +# self.h0 = np.tile(h0[None, :, :], (K, 1, 1)) +# +# # Set natural parameters of inverse Wishart prior on Sigma +# self.nu0 = nu0 +# self.Psi0 = Psi0 * np.eye(D) if np.isscalar(Psi0) else Psi0 +# +# self.l2_penalty_A = l2_penalty_A +# self.l2_penalty_b = l2_penalty_b +# self.l2_penalty_V = l2_penalty_V +# +# @property +# def A(self): +# return self.As[0] +# +# @A.setter +# def A(self, value): +# assert value.shape == self.As[0].shape +# self.As[0] = value +# +# @property +# def b(self): +# return self.bs[0] +# +# @b.setter +# def b(self, value): +# assert value.shape == self.bs[0].shape +# self.bs[0] = value +# +# @property +# def Sigmas_init(self): +# return np.matmul(self._sqrt_Sigmas_init, np.swapaxes(self._sqrt_Sigmas_init, -1, -2)) +# +# @Sigmas_init.setter +# def Sigmas_init(self, value): +# assert value.shape == (self.K, self.D, self.D) +# self._sqrt_Sigmas_init = np.linalg.cholesky(value + 1e-8 * np.eye(self.D)) +# +# @property +# def Sigmas(self): +# return np.matmul(self._sqrt_Sigmas, np.swapaxes(self._sqrt_Sigmas, -1, -2)) +# +# @Sigmas.setter +# def Sigmas(self, value): +# assert value.shape == (self.K, self.D, self.D) +# self._sqrt_Sigmas = np.linalg.cholesky(value + 1e-8 * np.eye(self.D)) +# +# @property +# def params(self): +# return super(AutoRegressiveObservations, self).params + (self._sqrt_Sigmas,) +# +# @params.setter +# def params(self, value): +# self._sqrt_Sigmas = value[-1] +# super(AutoRegressiveObservations, self.__class__).params.fset(self, value[:-1]) +# +# def permute(self, perm): +# super(AutoRegressiveObservations, self).permute(perm) +# self._sqrt_Sigmas = self._sqrt_Sigmas[perm] +# +# def log_likelihoods(self, data, input, mask, tag=None): +# assert np.all(mask), "Cannot compute likelihood of autoregressive obsevations with missing data." +# L = self.lags +# mus = self._compute_mus(data, input, mask, tag) +# +# # Compute the likelihood of the initial data and remainder separately +# # stats.multivariate_studentst_logpdf supports broadcasting, but we get +# # significant performance benefit if we call it with (TxD), (D,), (D,D), and (,) +# # arrays as inputs +# ll_init = np.column_stack([stats.multivariate_normal_logpdf(data[:L], mu[:L], Sigma) +# for mu, Sigma in zip(mus, self.Sigmas_init)]) +# +# ll_ar = np.column_stack([stats.multivariate_normal_logpdf(data[L:], mu[L:], Sigma) +# for mu, Sigma in zip(mus, self.Sigmas)]) +# +# return np.row_stack((ll_init, ll_ar)) +# +# def _get_sufficient_statistics(self, expectations, datas, inputs): +# K, D, M, lags = self.K, self.D, self.M, self.lags +# D_in = D * lags + M + 1 +# +# # Initialize the outputs +# ExuxuTs = np.zeros((K, D_in, D_in)) +# ExuyTs = np.zeros((K, D_in, D)) +# EyyTs = np.zeros((K, D, D)) +# Ens = np.zeros(K) +# +# # Iterate over data arrays and discrete states +# for (Ez, _, _), data, input in zip(expectations, datas, inputs): +# u = input[lags:] +# y = data[lags:] +# for k in range(K): +# w = Ez[lags:, k] +# +# # ExuxuTs[k] +# for l1 in range(lags): +# x1 = data[lags-l1-1:-l1-1] +# # Cross terms between lagged data and other lags +# for l2 in range(l1, lags): +# x2 = data[lags - l2 - 1:-l2 - 1] +# ExuxuTs[k, l1*D:(l1+1)*D, l2*D:(l2+1)*D] += np.einsum('t,ti,tj->ij', w, x1, x2) +# +# # Cross terms between lagged data and inputs and bias +# ExuxuTs[k, l1*D:(l1+1)*D, D*lags:D*lags+M] += np.einsum('t,ti,tj->ij', w, x1, u) +# ExuxuTs[k, l1*D:(l1+1)*D, -1] += np.einsum('t,ti->i', w, x1) +# +# ExuxuTs[k, D*lags:D*lags+M, D*lags:D*lags+M] += np.einsum('t,ti,tj->ij', w, u, u) +# ExuxuTs[k, D*lags:D*lags+M, -1] += np.einsum('t,ti->i', w, u) +# ExuxuTs[k, -1, -1] += np.sum(w) +# +# # ExuyTs[k] +# for l1 in range(lags): +# x1 = data[lags - l1 - 1:-l1 - 1] +# ExuyTs[k, l1*D:(l1+1)*D, :] += np.einsum('t,ti,tj->ij', w, x1, y) +# ExuyTs[k, D*lags:D*lags+M, :] += np.einsum('t,ti,tj->ij', w, u, y) +# ExuyTs[k, -1, :] += np.einsum('t,ti->i', w, y) +# +# # EyyTs[k] and Ens[k] +# EyyTs[k] += np.einsum('t,ti,tj->ij',w,y,y) +# Ens[k] += np.sum(w) +# +# # Symmetrize the expectations +# for k in range(K): +# for l1 in range(lags): +# for l2 in range(l1, lags): +# ExuxuTs[k, l2*D:(l2+1)*D, l1*D:(l1+1)* D] = ExuxuTs[k, l1*D:(l1+1)*D, l2*D:(l2+1)*D].T +# ExuxuTs[k, D*lags:D*lags+M, l1*D:(l1+1)*D] = ExuxuTs[k, l1*D:(l1+1)*D, D*lags:D*lags+M].T +# ExuxuTs[k, -1, l1*D:(l1+1)*D] = ExuxuTs[k, l1*D:(l1+1)*D, -1].T +# ExuxuTs[k, -1, D*lags:D*lags+M] = ExuxuTs[k, D*lags:D*lags+M, -1].T +# +# return ExuxuTs, ExuyTs, EyyTs, Ens +# +# def _extend_given_sufficient_statistics(self, expectations, continuous_expectations, inputs): +# # Extend continuous_expectations with given inputs and discrete weights +# assert self.lags == 1, "_extend_given_sufficient_statistics assumes lags == 1." +# K, D, M, lags = self.K, self.D, self.M, self.lags +# D_in = D * lags + M + 1 +# +# # Initialize the outputs +# ExuxuTs = np.zeros((K, D_in, D_in)) +# ExuyTs = np.zeros((K, D_in, D)) +# EyyTs = np.zeros((K, D, D)) +# Ens = np.zeros(K) +# +# for (Ez, _, _), (_, Ex, smoothed_sigmas, Exxn), u in \ +# zip(expectations, continuous_expectations, inputs): +# ExxT = smoothed_sigmas + np.einsum('ti,tj->tij', Ex, Ex) +# u = u[lags:] +# +# for k in range(K): +# w = Ez[lags:, k] +# +# ExuxuTs[k, :D, :D] += np.einsum('t,tij->ij', w, ExxT[:-1]) +# ExuxuTs[k, :D, D:D + M] += np.einsum('t,ti,tj->ij', w, Ex[:-1], u) +# ExuxuTs[k, :D, -1] += np.einsum('t,ti->i', w, Ex[:-1]) +# ExuxuTs[k, D:D + M, D:D + M] += np.einsum('t,ti,tj->ij', w, u, u) +# ExuxuTs[k, D:D + M, -1] += np.einsum('t,ti->i', w, u) +# ExuxuTs[k, -1, -1] += np.sum(w) +# +# ExuyTs[k, :D, :] += np.einsum('t,tij->ij', w, Exxn) +# ExuyTs[k, D:D + M, :] += np.einsum('t,ti,tj->ij', w, u, Ex[1:]) +# ExuyTs[k, -1, :] += np.einsum('t,ti->i', w, Ex[1:]) +# +# EyyTs[k] += np.einsum('t,tij->ij', w, ExxT[1:]) +# Ens[k] += np.sum(w) +# +# # Symmetrize the expectations +# for k in range(K): +# ExuxuTs[k, D:D + M, :D] = ExuxuTs[k, :D, D:D + M].T +# ExuxuTs[k, -1, :D] = ExuxuTs[k, :D, -1].T +# ExuxuTs[k, -1, D:D + M] = ExuxuTs[k, D:D + M, -1].T +# +# return ExuxuTs, ExuyTs, EyyTs, Ens +# +# def m_step(self, expectations, datas, inputs, masks, tags, +# continuous_expectations=None, **kwargs): +# """Compute M-step for Gaussian Auto Regressive Observations. +# +# If `continuous_expectations` is not None, this function will +# compute an exact M-step using the expected sufficient statistics for the +# continuous states. In this case, we ignore the prior provided by (J0, h0), +# because the calculation is exact. `continuous_expectations` should be a tuple of +# (Ex, Ey, ExxT, ExyT, EyyT). +# +# If `continuous_expectations` is None, we use `datas` and `expectations, +# and (optionally) the prior given by (J0, h0). In this case, we estimate the sufficient +# statistics using `datas,` which is typically a single sample of the continuous +# states from the posterior distribution. +# """ +# K, D, M, lags = self.K, self.D, self.M, self.lags +# +# # Collect sufficient statistics +# if continuous_expectations is None: +# ExuxuTs, ExuyTs, EyyTs, Ens = self._get_sufficient_statistics(expectations, datas, inputs) +# else: +# ExuxuTs, ExuyTs, EyyTs, Ens = \ +# self._extend_given_sufficient_statistics(expectations, continuous_expectations, inputs) +# +# # Solve the linear regressions +# As = np.zeros((K, D, D * lags)) +# Vs = np.zeros((K, D, M)) +# bs = np.zeros((K, D)) +# Sigmas = np.zeros((K, D, D)) +# for k in range(K): +# Wk = np.linalg.solve(ExuxuTs[k] + self.J0[k], ExuyTs[k] + self.h0[k]).T +# As[k] = Wk[:, :D * lags] +# Vs[k] = Wk[:, D * lags:-1] +# bs[k] = Wk[:, -1] +# +# # Solve for the MAP estimate of the covariance +# EWxyT = Wk @ ExuyTs[k] +# sqerr = EyyTs[k] - EWxyT.T - EWxyT + Wk @ ExuxuTs[k] @ Wk.T +# nu = self.nu0 + Ens[k] +# Sigmas[k] = (sqerr + self.Psi0) / (nu + D + 1) +# +# # If any states are unused, set their parameters to a perturbation of a used state +# unused = np.where(Ens < 1)[0] +# used = np.where(Ens > 1)[0] +# if len(unused) > 0: +# for k in unused: +# i = npr.choice(used) +# As[k] = As[i] + 0.01 * npr.randn(*As[i].shape) +# Vs[k] = Vs[i] + 0.01 * npr.randn(*Vs[i].shape) +# bs[k] = bs[i] + 0.01 * npr.randn(*bs[i].shape) +# Sigmas[k] = Sigmas[i] +# +# # Update parameters via their setter +# self.As = As +# self.Vs = Vs +# self.bs = bs +# self.Sigmas = Sigmas +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# D, As, bs, Vs = self.D, self.As, self.bs, self.Vs +# +# if xhist.shape[0] < self.lags: +# # Sample from the initial distribution +# S = np.linalg.cholesky(self.Sigmas_init[z]) if with_noise else 0 +# return self.mu_init[z] + np.dot(S, npr.randn(D)) +# else: +# # Sample from the autoregressive distribution +# mu = Vs[z].dot(input[:self.M]) + bs[z] +# for l in range(self.lags): +# Al = As[z][:,l*D:(l+1)*D] +# mu += Al.dot(xhist[-l-1]) +# +# S = np.linalg.cholesky(self.Sigmas[z]) if with_noise else 0 +# return mu + np.dot(S, npr.randn(D)) +# +# def neg_hessian_expected_log_dynamics_prob(self, Ez, data, input, mask, tag=None): +# assert np.all(mask), "Cannot compute negative Hessian of autoregressive obsevations with missing data." +# assert self.lags == 1, "Does not compute negative Hessian of autoregressive observations with lags > 1" +# +# # initial distribution contributes a Gaussian term to first diagonal block +# J_ini = np.sum(Ez[0, :, None, None] * np.linalg.inv(self.Sigmas_init), axis=0) +# +# # first part is transition dynamics - goes to all terms except final one +# # E_q(z) x_{t} A_{z_t+1}.T Sigma_{z_t+1}^{-1} A_{z_t+1} x_{t} +# inv_Sigmas = np.linalg.inv(self.Sigmas) +# dynamics_terms = np.array([A.T@inv_Sigma@A for A, inv_Sigma in zip(self.As, inv_Sigmas)]) # A^T Qinv A terms +# J_dyn_11 = np.sum(Ez[1:,:,None,None] * dynamics_terms[None,:], axis=1) +# +# # second part of diagonal blocks are inverse covariance matrices - goes to all but first time bin +# # E_q(z) x_{t+1} Sigma_{z_t+1}^{-1} x_{t+1} +# J_dyn_22 = np.sum(Ez[1:,:,None,None] * inv_Sigmas[None,:], axis=1) +# +# # lower diagonal blocks are (T-1,D,D): +# # E_q(z) x_{t+1} Sigma_{z_t+1}^{-1} A_{z_t+1} x_t +# off_diag_terms = np.array([inv_Sigma@A for A, inv_Sigma in zip(self.As, inv_Sigmas)]) +# J_dyn_21 = -1 * np.sum(Ez[1:,:,None,None] * off_diag_terms[None,:], axis=1) +# +# return J_ini, J_dyn_11, J_dyn_21, J_dyn_22 +# +# +# class AutoRegressiveObservationsNoInput(AutoRegressiveObservations): +# """ +# AutoRegressive observation model without the inputs. +# """ +# def __init__(self, K, D, M=0, lags=1, +# l2_penalty_A=1e-8, +# l2_penalty_b=1e-8): +# +# super(AutoRegressiveObservationsNoInput, self).\ +# __init__(K, D, M=0, lags=lags, +# l2_penalty_A=l2_penalty_A, +# l2_penalty_b=l2_penalty_b) +# +# +# class AutoRegressiveDiagonalNoiseObservations(AutoRegressiveObservations): +# """ +# AutoRegressive observation model with diagonal Gaussian noise. +# +# (x_t | z_t = k, u_t) ~ N(A_k x_{t-1} + b_k + V_k u_t, S_k) +# +# where +# +# S_k = diag([sigma_{k,1}, ..., sigma_{k, D}]) +# +# The parameters are fit via maximum likelihood estimation. +# """ +# def __init__(self, K, D, M=0, lags=1, +# l2_penalty_A=1e-8, +# l2_penalty_b=1e-8, +# l2_penalty_V=1e-8): +# +# super(AutoRegressiveDiagonalNoiseObservations, self).\ +# __init__(K, D, M, lags=lags, +# l2_penalty_A=l2_penalty_A, +# l2_penalty_b=l2_penalty_b, +# l2_penalty_V=l2_penalty_V) +# +# # Initialize the dynamics and the noise covariances +# self._As = .80 * np.array([ +# np.column_stack([random_rotation(D), np.zeros((D, (lags-1) * D))]) +# for _ in range(K)]) +# +# # Get rid of the square root parameterization and replace with log diagonal +# del self._sqrt_Sigmas_init +# del self._sqrt_Sigmas +# self._log_sigmasq_init = np.zeros((K, D)) +# self._log_sigmasq = np.zeros((K, D)) +# +# @property +# def sigmasq_init(self): +# return np.exp(self._log_sigmasq_init) +# +# @sigmasq_init.setter +# def sigmasq_init(self, value): +# assert value.shape == (self.K, self.D) +# assert np.all(value > 0) +# self._log_sigmasq_init = np.log(value) +# +# @property +# def sigmasq(self): +# return np.exp(self._log_sigmasq) +# +# @sigmasq.setter +# def sigmasq(self, value): +# assert value.shape == (self.K, self.D) +# assert np.all(value > 0) +# self._log_sigmasq = np.log(value) +# +# @property +# def Sigmas_init(self): +# return np.array([np.diag(np.exp(log_s)) for log_s in self._log_sigmasq_init]) +# +# @property +# def Sigmas(self): +# return np.array([np.diag(np.exp(log_s)) for log_s in self._log_sigmasq]) +# +# @Sigmas.setter +# def Sigmas(self, value): +# assert value.shape == (self.K, self.D, self.D) +# sigmasq = np.array([np.diag(S) for S in value]) +# assert np.all(sigmasq > 0) +# self._log_sigmasq = np.log(sigmasq) +# +# @property +# def params(self): +# return super(AutoRegressiveObservations, self).params + (self._log_sigmasq,) +# +# @params.setter +# def params(self, value): +# self._log_sigmasq = value[-1] +# super(AutoRegressiveObservations, self.__class__).params.fset(self, value[:-1]) +# +# def permute(self, perm): +# super(AutoRegressiveObservations, self).permute(perm) +# self._log_sigmasq_init = self._log_sigmasq_init[perm] +# self._log_sigmasq = self._log_sigmasq[perm] +# +# def log_likelihoods(self, data, input, mask, tag): +# assert np.all(mask), "Cannot compute likelihood of autoregressive obsevations with missing data." +# +# L = self.lags +# mus = self._compute_mus(data, input, mask, tag) +# +# # Compute the likelihood of the initial data and remainder separately +# # stats.multivariate_studentst_logpdf supports broadcasting, but we get +# # significant performance benefit if we call it with (TxD), (D,), (D,D), and (,) +# # arrays as inputs +# ll_init = np.column_stack([stats.diagonal_gaussian_logpdf(data[:L], mu[:L], sigmasq) +# for mu, sigmasq in zip(mus, self.sigmasq_init)]) +# +# ll_ar = np.column_stack([stats.diagonal_gaussian_logpdf(data[L:], mu[L:], sigmasq) +# for mu, sigmasq in zip(mus, self.sigmasq)]) +# +# +# # Compute the likelihood of the initial data and remainder separately +# return np.row_stack((ll_init, ll_ar)) +# +# +# class IndependentAutoRegressiveObservations(_AutoRegressiveObservationsBase): +# def __init__(self, K, D, M=0, lags=1): +# super(IndependentAutoRegressiveObservations, self).__init__(K, D, M, lags=lags) +# +# self._As = np.concatenate((.95 * np.ones((K, D, 1)), np.zeros((K, D, lags-1))), axis=2) +# self._log_sigmasq_init = np.zeros((K, D)) +# self._log_sigmasq = np.zeros((K, D)) +# +# @property +# def sigmasq_init(self): +# return np.exp(self._log_sigmasq_init) +# +# @property +# def sigmasq(self): +# return np.exp(self._log_sigmasq) +# +# @property +# def As(self): +# return np.array([ +# np.column_stack([np.diag(Ak[:,l]) for l in range(self.lags)]) +# for Ak in self._As +# ]) +# +# @As.setter +# def As(self, value): +# # TODO: extract the diagonal components +# raise NotImplementedError +# +# @property +# def params(self): +# return self._As, self.bs, self.Vs, self._log_sigmasq +# +# @params.setter +# def params(self, value): +# self._As, self.bs, self.Vs, self._log_sigmasq = value +# +# def permute(self, perm): +# self.mu_init = self.mu_init[perm] +# self._As = self._As[perm] +# self.bs = self.bs[perm] +# self.Vs = self.Vs[perm] +# self._log_sigmasq_init = self._log_sigmasq_init[perm] +# self._log_sigmasq = self._log_sigmasq[perm] +# +# def _compute_mus(self, data, input, mask, tag): +# """ +# Re-implement compute_mus for this class since we can do it much +# more efficiently than in the general AR case. +# """ +# T, D = data.shape +# As, bs, Vs = self.As, self.bs, self.Vs +# +# # Instantaneous inputs, lagged data, and bias +# mus = np.matmul(Vs[None, ...], input[self.lags:, None, :self.M, None])[:, :, :, 0] +# for l in range(self.lags): +# mus += As[:, :, l] * data[self.lags-l-1:-l-1, None, :] +# mus += bs +# +# # Pad with the initial condition +# mus = np.concatenate((self.mu_init * np.ones((self.lags, self.K, self.D)), mus)) +# +# assert mus.shape == (T, self.K, D) +# return mus +# +# def log_likelihoods(self, data, input, mask, tag): +# mus = self._compute_mus(data, input, mask, tag) +# +# # Compute the likelihood of the initial data and remainder separately +# L = self.lags +# ll_init = stats.diagonal_gaussian_logpdf(data[:L, None, :], mus[:L], self.sigmasq_init) +# ll_ar = stats.diagonal_gaussian_logpdf(data[L:, None, :], mus[L:], self.sigmasq) +# return np.row_stack((ll_init, ll_ar)) +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# D, M = self.D, self.M +# +# for d in range(self.D): +# # Collect data for this dimension +# xs, ys, weights = [], [], [] +# for (Ez, _, _), data, input, mask in zip(expectations, datas, inputs, masks): +# # Only use data if it is complete +# if np.all(mask[:, d]): +# xs.append( +# np.hstack([data[self.lags-l-1:-l-1, d:d+1] for l in range(self.lags)] +# + [input[self.lags:, :M], np.ones((data.shape[0]-self.lags, 1))])) +# ys.append(data[self.lags:, d]) +# weights.append(Ez[self.lags:]) +# +# xs = np.concatenate(xs) +# ys = np.concatenate(ys) +# weights = np.concatenate(weights) +# +# # If there was no data for this dimension then skip it +# if len(xs) == 0: +# self.As[:, d, :] = 0 +# self.Vs[:, d, :] = 0 +# self.bs[:, d] = 0 +# continue +# +# # Otherwise, fit a weighted linear regression for each discrete state +# for k in range(self.K): +# # Check for zero weights (singular matrix) +# if np.sum(weights[:, k]) < self.lags + M + 1: +# self.As[k, d] = 1.0 +# self.Vs[k, d] = 0 +# self.bs[k, d] = 0 +# self._log_sigmasq[k, d] = 0 +# continue +# +# # Solve for the most likely A,V,b (no prior) +# Jk = np.sum(weights[:, k][:, None, None] * xs[:,:,None] * xs[:, None,:], axis=0) +# hk = np.sum(weights[:, k][:, None] * xs * ys[:, None], axis=0) +# muk = np.linalg.solve(Jk, hk) +# +# self.As[k, d] = muk[:self.lags] +# self.Vs[k, d] = muk[self.lags:self.lags+M] +# self.bs[k, d] = muk[-1] +# +# # Update the variances +# yhats = xs.dot(np.concatenate((self.As[k, d], self.Vs[k, d], [self.bs[k, d]]))) +# sqerr = (ys - yhats)**2 +# sigma = np.average(sqerr, weights=weights[:, k], axis=0) + 1e-16 +# self._log_sigmasq[k, d] = np.log(sigma) +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# D, As, bs, sigmas = self.D, self.As, self.bs, self.sigmasq +# +# # Sample the initial condition +# if xhist.shape[0] < self.lags: +# sigma_init = self.sigmasq_init[z] if with_noise else 0 +# return self.mu_init[z] + np.sqrt(sigma_init) * npr.randn(D) +# +# # Otherwise sample the AR model +# muz = bs[z].copy() +# for lag in range(self.lags): +# muz += As[z, :, lag] * xhist[-lag - 1] +# +# sigma = sigmas[z] if with_noise else 0 +# return muz + np.sqrt(sigma) * npr.randn(D) +# +# +# # Robust autoregressive models with diagonal Student's t noise +# class _RobustAutoRegressiveObservationsMixin(object): +# """ +# Mixin for AR models where the noise is distributed according to a +# multivariate t distribution, +# +# epsilon ~ t(0, Sigma, nu) +# +# which is equivalent to, +# +# tau ~ Gamma(nu/2, nu/2) +# epsilon | tau ~ N(0, Sigma / tau) +# +# We use this equivalence to perform the M step (update of Sigma and tau) +# via an inner expectation maximization algorithm. +# +# This mixin mus be used in conjunction with either AutoRegressiveObservations or +# AutoRegressiveDiagonalNoiseObservations, which provides the parameterization for +# Sigma. The mixin does not capitalize on structure in Sigma, so it will pay +# a small complexity penalty when used in conjunction with the diagonal noise model. +# """ +# def __init__(self, K, D, M=0, lags=1, +# l2_penalty_A=1e-8, +# l2_penalty_b=1e-8, +# l2_penalty_V=1e-8): +# +# super(_RobustAutoRegressiveObservationsMixin, self).\ +# __init__(K, D, M=M, lags=lags, +# l2_penalty_A=l2_penalty_A, +# l2_penalty_b=l2_penalty_b, +# l2_penalty_V=l2_penalty_V) +# self._log_nus = np.log(4) * np.ones(K) +# +# J_diag = np.concatenate((l2_penalty_A * np.ones(D * lags), +# l2_penalty_V * np.ones(M), +# l2_penalty_b * np.ones(1))) +# self.J0 = np.tile(np.diag(J_diag)[None, :, :], (K, 1, 1)) +# self.h0 = np.zeros((K, D * lags + M + 1, D)) +# +# @property +# def nus(self): +# return np.exp(self._log_nus) +# +# @property +# def params(self): +# return super(_RobustAutoRegressiveObservationsMixin, self).params + (self._log_nus,) +# +# @params.setter +# def params(self, value): +# self._log_nus = value[-1] +# super(_RobustAutoRegressiveObservationsMixin, self.__class__).params.fset(self, value[:-1]) +# +# def permute(self, perm): +# super(_RobustAutoRegressiveObservationsMixin, self).permute(perm) +# self._log_nus = self._log_nus[perm] +# +# def log_likelihoods(self, data, input, mask, tag): +# assert np.all(mask), "Cannot compute likelihood of autoregressive obsevations with missing data." +# mus = self._compute_mus(data, input, mask, tag) +# +# # Compute the likelihood of the initial data and remainder separately +# L = self.lags +# # Compute the likelihood of the initial data and remainder separately +# # stats.multivariate_studentst_logpdf supports broadcasting, but we get +# # significant performance benefit if we call it with (TxD), (D,), (D,D), and (,) +# # arrays as inputs +# ll_init = np.column_stack([stats.multivariate_normal_logpdf(data[:L], mu[:L], Sigma) +# for mu, Sigma in zip(mus, self.Sigmas_init)]) +# +# ll_ar = np.column_stack([stats.multivariate_studentst_logpdf(data[L:], mu[L:], Sigma, nu) +# for mu, Sigma, nu in zip(mus, self.Sigmas, self.nus)]) +# +# return np.row_stack((ll_init, ll_ar)) +# +# def m_step(self, expectations, datas, inputs, masks, tags, num_em_iters=1): +# """ +# Student's t is a scale mixture of Gaussians. We can estimate its +# parameters using the EM algorithm. See the notebook in doc/students_t +# for complete details. +# """ +# self._m_step_ar(expectations, datas, inputs, masks, tags, num_em_iters) +# self._m_step_nu(expectations, datas, inputs, masks, tags) +# +# def _m_step_ar(self, expectations, datas, inputs, masks, tags, num_em_iters): +# K, D, M, lags = self.K, self.D, self.M, self.lags +# +# # Collect data for this dimension +# xs, ys, Ezs = [], [], [] +# for (Ez, _, _), data, input, mask, tag in zip(expectations, datas, inputs, masks, tags): +# # Only use data if it is complete +# if not np.all(mask): +# raise Exception("Encountered missing data in AutoRegressiveObservations!") +# +# xs.append( +# np.hstack([data[lags-l-1:-l-1] for l in range(lags)] +# + [input[lags:, :self.M], np.ones((data.shape[0]-lags, 1))])) +# ys.append(data[lags:]) +# Ezs.append(Ez[lags:]) +# +# for itr in range(num_em_iters): +# # E Step: compute expected precision for each data point given current parameters +# taus = [] +# for x, y in zip(xs, ys): +# Afull = np.concatenate((self.As, self.Vs, self.bs[:, :, None]), axis=2) +# mus = np.matmul(Afull[None, :, :, :], x[:, None, :, None])[:, :, :, 0] +# +# # nu: (K,) mus: (T, K, D) sigmas: (K, D, D) y: (T, D) -> tau: (T, K) +# alpha = self.nus / 2 + D/2 +# sqrt_Sigmas = np.linalg.cholesky(self.Sigmas) +# beta = self.nus / 2 + 1/2 * stats.batch_mahalanobis(sqrt_Sigmas, y[:, None, :] - mus) +# taus.append(alpha / beta) +# +# # M step: Fit the weighted linear regressions for each K and D +# # This is exactly the same as the M-step for the AutoRegressiveObservations, +# # but it has an extra scaling factor of tau applied to the weight. +# J = self.J0.copy() +# h = self.h0.copy() +# for x, y, Ez, tau in zip(xs, ys, Ezs, taus): +# weight = Ez * tau +# # Einsum is concise but slow! +# # J += np.einsum('tk, ti, tj -> kij', weight, x, x) +# # h += np.einsum('tk, ti, td -> kid', weight, x, y) +# # Do weighted products for each of the k states +# for k in range(K): +# weighted_x = x * weight[:, k:k+1] +# J[k] += np.dot(weighted_x.T, x) +# h[k] += np.dot(weighted_x.T, y) +# +# mus = np.linalg.solve(J, h) +# self.As = np.swapaxes(mus[:, :D*lags, :], 1, 2) +# self.Vs = np.swapaxes(mus[:, D*lags:D*lags+M, :], 1, 2) +# self.bs = mus[:, -1, :] +# +# # Update the covariance +# sqerr = np.zeros((K, D, D)) +# weight = np.zeros(K) +# for x, y, Ez, tau in zip(xs, ys, Ezs, taus): +# yhat = np.matmul(x[None, :, :], mus) +# resid = y[None, :, :] - yhat +# sqerr += np.einsum('tk,kti,ktj->kij', Ez * tau, resid, resid) +# weight += np.sum(Ez, axis=0) +# +# self.Sigmas = sqerr / weight[:, None, None] + 1e-8 * np.eye(D) +# +# def _m_step_nu(self, expectations, datas, inputs, masks, tags): +# """ +# Update the degrees of freedom parameter of the multivariate t distribution +# using a generalized Newton update. See notes in the ssm repo. +# """ +# K, D, L = self.K, self.D, self.lags +# E_taus = np.zeros(K) +# E_logtaus = np.zeros(K) +# weights = np.zeros(K) +# for (Ez, _, _,), data, input, mask, tag in zip(expectations, datas, inputs, masks, tags): +# # nu: (K,) mus: (T, K, D) Sigmas: (K, D, D) y: (T, D) -> tau: (T, K) +# mus = np.swapaxes(self._compute_mus(data, input, mask, tag), 0, 1) +# +# alpha = self.nus/2 + D/2 +# sqrt_Sigma = np.linalg.cholesky(self.Sigmas) +# # TODO: Performance could be improved by iterating over K outside batch_mahalanobis +# beta = self.nus/2 + 1/2 * stats.batch_mahalanobis(sqrt_Sigma, data[L:, None, :] - mus[L:]) +# +# E_taus += np.sum(Ez[L:, :] * alpha / beta, axis=0) +# E_logtaus += np.sum(Ez[L:, :] * (digamma(alpha) - np.log(beta)), axis=0) +# weights += np.sum(Ez, axis=0) +# +# E_taus /= weights +# E_logtaus /= weights +# +# for k in range(K): +# self._log_nus[k] = np.log(generalized_newton_studentst_dof(E_taus[k], E_logtaus[k])) +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# D, As, bs, Vs, Sigmas, nus = self.D, self.As, self.bs, self.Vs, self.Sigmas, self.nus +# if xhist.shape[0] < self.lags: +# S = np.linalg.cholesky(self.Sigmas_init[z]) if with_noise else 0 +# return self.mu_init[z] + np.dot(S, npr.randn(D)) +# else: +# mu = Vs[z].dot(input[:self.M]) + bs[z] +# for l in range(self.lags): +# mu += As[z][:,l*D:(l+1)*D].dot(xhist[-l-1]) +# +# tau = npr.gamma(nus[z] / 2.0, 2.0 / nus[z]) +# S = np.linalg.cholesky(Sigmas[z] / tau) if with_noise else 0 +# return mu + np.dot(S, npr.randn(D)) +# +# +# class RobustAutoRegressiveObservations(_RobustAutoRegressiveObservationsMixin, AutoRegressiveObservations): +# """ +# AR model where the noise is distributed according to a multivariate t distribution, +# +# epsilon ~ t(0, Sigma, nu) +# +# which is equivalent to, +# +# tau ~ Gamma(nu/2, nu/2) +# epsilon | tau ~ N(0, Sigma / tau) +# +# Here, Sigma is a general covariance matrix. +# """ +# pass +# +# +# class RobustAutoRegressiveObservationsNoInput(RobustAutoRegressiveObservations): +# """ +# RobusAutoRegressiveObservations model without the inputs. +# """ +# def __init__(self, K, D, M=0, lags=1, +# l2_penalty_A=1e-8, +# l2_penalty_b=1e-8, +# l2_penalty_V=1e-8): +# +# super(RobustAutoRegressiveObservationsNoInput, self).\ +# __init__(K, D, M=0, lags=lags, +# l2_penalty_A=l2_penalty_A, +# l2_penalty_b=l2_penalty_b, +# l2_penalty_V=l2_penalty_V) +# +# +# +# class RobustAutoRegressiveDiagonalNoiseObservations( +# _RobustAutoRegressiveObservationsMixin, AutoRegressiveDiagonalNoiseObservations): +# """ +# AR model where the noise is distributed according to a multivariate t distribution, +# +# epsilon ~ t(0, Sigma, nu) +# +# which is equivalent to, +# +# tau ~ Gamma(nu/2, nu/2) +# epsilon | tau ~ N(0, Sigma / tau) +# +# Here, Sigma is a diagonal covariance matrix. +# """ +# pass +# +# # Robust autoregressive models with diagonal Student's t noise +# class AltRobustAutoRegressiveDiagonalNoiseObservations(AutoRegressiveDiagonalNoiseObservations): +# """ +# An alternative formulation of the robust AR model where the noise is +# distributed according to a independent scalar t distribution, +# +# For each output dimension d, +# +# epsilon_d ~ t(0, sigma_d^2, nu_d) +# +# which is equivalent to, +# +# tau_d ~ Gamma(nu_d/2, nu_d/2) +# epsilon_d | tau_d ~ N(0, sigma_d^2 / tau_d) +# +# """ +# def __init__(self, K, D, M=0, lags=1): +# super(AltRobustAutoRegressiveDiagonalNoiseObservations, self).__init__(K, D, M=M, lags=lags) +# self._log_nus = np.log(4) * np.ones((K, D)) +# +# @property +# def nus(self): +# return np.exp(self._log_nus) +# +# @property +# def params(self): +# return self.As, self.bs, self.Vs, self._log_sigmasq, self._log_nus +# +# @params.setter +# def params(self, value): +# self.As, self.bs, self.Vs, self._log_sigmasq, self._log_nus = value +# +# def permute(self, perm): +# super(AltRobustAutoRegressiveDiagonalNoiseObservations, self).permute(perm) +# self.inv_nus = self.inv_nus[perm] +# +# def log_likelihoods(self, data, input, mask, tag): +# assert np.all(mask), "Cannot compute likelihood of autoregressive obsevations with missing data." +# mus = np.swapaxes(self._compute_mus(data, input, mask, tag), 0, 1) +# +# # Compute the likelihood of the initial data and remainder separately +# L = self.lags +# ll_init = stats.diagonal_gaussian_logpdf(data[:L, None, :], mus[:L], self.sigmasq_init) +# ll_ar = stats.independent_studentst_logpdf(data[L:, None, :], mus[L:], self.sigmasq, self.nus) +# return np.row_stack((ll_init, ll_ar)) +# +# def m_step(self, expectations, datas, inputs, masks, tags, +# num_em_iters=1, optimizer="adam", num_iters=10, **kwargs): +# """ +# Student's t is a scale mixture of Gaussians. We can estimate its +# parameters using the EM algorithm. See the notebook in doc/students_t +# for complete details. +# """ +# self._m_step_ar(expectations, datas, inputs, masks, tags, num_em_iters) +# self._m_step_nu(expectations, datas, inputs, masks, tags, optimizer, num_iters, **kwargs) +# +# def _m_step_ar(self, expectations, datas, inputs, masks, tags, num_em_iters): +# K, D, M, lags = self.K, self.D, self.M, self.lags +# +# # Collect data for this dimension +# xs, ys, Ezs = [], [], [] +# for (Ez, _, _), data, input, mask, tag in zip(expectations, datas, inputs, masks, tags): +# # Only use data if it is complete +# if not np.all(mask): +# raise Exception("Encountered missing data in AutoRegressiveObservations!") +# +# xs.append( +# np.hstack([data[lags-l-1:-l-1] for l in range(lags)] +# + [input[lags:, :self.M], np.ones((data.shape[0]-lags, 1))])) +# ys.append(data[lags:]) +# Ezs.append(Ez[lags:]) +# +# for itr in range(num_em_iters): +# # E Step: compute expected precision for each data point given current parameters +# taus = [] +# for x, y in zip(xs, ys): +# # mus = self._compute_mus(data, input, mask, tag) +# # sigmas = self._compute_sigmas(data, input, mask, tag) +# Afull = np.concatenate((self.As, self.Vs, self.bs[:, :, None]), axis=2) +# mus = np.matmul(Afull[None, :, :, :], x[:, None, :, None])[:, :, :, 0] +# +# # nu: (K,D) mus: (T, K, D) sigmas: (K, D) y: (T, D) -> tau: (T, K, D) +# alpha = self.nus / 2 + 1/2 +# beta = self.nus / 2 + 1/2 * (y[:, None, :] - mus)**2 / self.sigmasq +# taus.append(alpha / beta) +# +# # M step: Fit the weighted linear regressions for each K and D +# J = np.tile(np.eye(D * lags + M + 1)[None, None, :, :], (K, D, 1, 1)) +# h = np.zeros((K, D, D*lags + M + 1,)) +# for x, y, Ez, tau in zip(xs, ys, Ezs, taus): +# robust_ar_statistics(Ez, tau, x, y, J, h) +# +# mus = np.linalg.solve(J, h) +# self.As = mus[:, :, :D*lags] +# self.Vs = mus[:, :, D*lags:D*lags+M] +# self.bs = mus[:, :, -1] +# +# # Fit the variance +# sqerr = 0 +# weight = 0 +# for x, y, Ez, tau in zip(xs, ys, Ezs, taus): +# yhat = np.matmul(x[None, :, :], np.swapaxes(mus, -1, -2)) +# sqerr += np.einsum('tk, tkd, ktd -> kd', Ez, tau, (y - yhat)**2) +# weight += np.sum(Ez, axis=0) +# self._log_sigmasq = np.log(sqerr / weight[:, None] + 1e-16) +# +# def _m_step_nu(self, expectations, datas, inputs, masks, tags, optimizer, num_iters, **kwargs): +# K, D, L = self.K, self.D, self.lags +# E_taus = np.zeros((K, D)) +# E_logtaus = np.zeros((K, D)) +# weights = np.zeros(K) +# for (Ez, _, _,), data, input, mask, tag in zip(expectations, datas, inputs, masks, tags): +# # nu: (K,D) mus: (T, K, D) sigmas: (K, D) y: (T, D) -> w: (T, K, D) +# mus = np.swapaxes(self._compute_mus(data, input, mask, tag), 0, 1) +# +# alpha = self.nus/2 + 1/2 +# beta = self.nus/2 + 1/2 * (data[L:, None, :] - mus[L:])**2 / self.sigmasq +# +# E_taus += np.sum(Ez[L:, :, None] * alpha / beta, axis=0) +# E_logtaus += np.sum(Ez[L:, :, None] * (digamma(alpha) - np.log(beta)), axis=0) +# weights += np.sum(Ez, axis=0) +# +# E_taus /= weights[:, None] +# E_logtaus /= weights[:, None] +# +# for k in range(K): +# for d in range(D): +# self._log_nus[k, d] = np.log(generalized_newton_studentst_dof(E_taus[k, d], E_logtaus[k, d])) +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# D, As, bs, sigmasq, nus = self.D, self.As, self.bs, self.sigmasq, self.nus +# if xhist.shape[0] < self.lags: +# sigma_init = self.sigmasq_init[z] if with_noise else 0 +# return self.mu_init[z] + np.sqrt(sigma_init) * npr.randn(D) +# else: +# mu = bs[z].copy() +# for l in range(self.lags): +# mu += As[z][:,l*D:(l+1)*D].dot(xhist[-l-1]) +# +# tau = npr.gamma(nus[z] / 2.0, 2.0 / nus[z]) +# var = sigmasq[z] / tau if with_noise else 0 +# return mu + np.sqrt(var) * npr.randn(D) +# +# +# class VonMisesObservations(Observations): +# def __init__(self, K, D, M=0): +# super(VonMisesObservations, self).__init__(K, D, M) +# self.mus = npr.randn(K, D) +# self.log_kappas = np.log(-1*npr.uniform(low=-1, high=0, size=(K, D))) +# +# @property +# def params(self): +# return self.mus, self.log_kappas +# +# @params.setter +# def params(self, value): +# self.mus, self.log_kappas = value +# +# def permute(self, perm): +# self.mus = self.mus[perm] +# self.log_kappas = self.log_kappas[perm] +# +# def log_likelihoods(self, data, input, mask, tag): +# mus, kappas = self.mus, np.exp(self.log_kappas) +# +# mask = np.ones_like(data, dtype=bool) if mask is None else mask +# return stats.vonmises_logpdf(data[:, None, :], mus, kappas, mask=mask[:, None, :]) +# +# def sample_x(self, z, xhist, input=None, tag=None, with_noise=True): +# D, mus, kappas = self.D, self.mus, np.exp(self.log_kappas) +# return npr.vonmises(self.mus[z], kappas[z], D) +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# +# x = np.concatenate(datas) +# weights = np.concatenate([Ez for Ez, _, _ in expectations]) # T x D +# assert x.shape[0] == weights.shape[0] +# +# # convert angles to 2D representation and employ closed form solutions +# x_k = np.stack((np.sin(x), np.cos(x)), axis=1) # T x 2 x D +# +# r_k = np.tensordot(weights.T, x_k, axes=1) # K x 2 x D +# r_norm = np.sqrt(np.sum(np.power(r_k, 2), axis=1)) # K x D +# +# mus_k = np.divide(r_k, r_norm[:, None]) # K x 2 x D +# r_bar = np.divide(r_norm, np.sum(weights, 0)[:, None]) # K x D +# +# mask = (r_norm.sum(1) == 0) +# mus_k[mask] = 0 +# r_bar[mask] = 0 +# +# # Approximation +# kappa0 = r_bar * (self.D + 1 - np.power(r_bar, 2)) / (1 - np.power(r_bar, 2)) # K,D +# +# kappa0[kappa0 == 0] += 1e-6 +# +# for k in range(self.K): +# self.mus[k] = np.arctan2(*mus_k[k]) # +# self.log_kappas[k] = np.log(kappa0[k]) # K, D +# +# def smooth(self, expectations, data, input, tag): +# mus = self.mus +# return expectations.dot(mus) diff --git a/ssm/transitions.py b/ssm/transitions.py index 79d5e432..aba85153 100644 --- a/ssm/transitions.py +++ b/ssm/transitions.py @@ -39,6 +39,14 @@ def log_transition_matrices(self, data, input, mask, tag): raise NotImplementedError def transition_matrices(self, data, input, mask, tag): + # print('data=',data) + # print('input=', input) + # print('input.shape=', input.shape) #this had nan + # print('input[0:5,:]=', input[0:5,:]) + # rint('mask=', mask) + # print('input_type0=', type(input)) + # print('data.shape13=',data.shape) + # print('self.log_transition_matrices(data, input, mask, tag)=', self.log_transition_matrices(data, input, mask, tag)) return np.exp(self.log_transition_matrices(data, input, mask, tag)) def m_step(self, expectations, datas, inputs, masks, tags, @@ -50,6 +58,7 @@ def m_step(self, expectations, datas, inputs, masks, tags, # Maximize the expected log joint def _expected_log_joint(expectations): + # zizi: if I want to remove log_prior effect: elbo = self.log_prior() for data, input, mask, tag, (expected_states, expected_joints, _) \ in zip(datas, inputs, masks, tags, expectations): @@ -59,16 +68,29 @@ def _expected_log_joint(expectations): # Normalize and negate for minimization T = sum([data.shape[0] for data in datas]) + def _objective(params, itr): self.params = params obj = _expected_log_joint(expectations) + # print('params=',params) return -obj / T # Call the optimizer. Persist state (e.g. SGD momentum) across calls to m_step. optimizer_state = self.optimizer_state if hasattr(self, "optimizer_state") else None + # self.params, self.optimizer_state = \ + # optimizer(_objective, self.params, num_iters=num_iters, + # state=optimizer_state, full_output=True, **kwargs) self.params, self.optimizer_state = \ optimizer(_objective, self.params, num_iters=num_iters, state=optimizer_state, full_output=True, **kwargs) + # print('params[0]=', params[0]) + # print('params[1]=', params[1]) + # list(self.params)[0]= params[0] #comment out if you want to stop P0 being updated + # list(self.params)[1] = params[1] #comment out if you want to stop transition weights being updated + + # print('self.params)[0]2=', self.params[0][0]) + # print('self.params)[1]2=', self.params[1][0]) + def neg_hessian_expected_log_trans_prob(self, data, input, mask, tag, expected_joints): # Return (T-1, D, D) array of blocks for the diagonal of the Hessian @@ -109,6 +131,7 @@ def transition_matrix(self): return np.exp(self.log_Ps - logsumexp(self.log_Ps, axis=1, keepdims=True)) def log_transition_matrices(self, data, input, mask, tag): + log_Ps = self.log_Ps - logsumexp(self.log_Ps, axis=1, keepdims=True) return log_Ps[None, :, :] @@ -180,7 +203,6 @@ def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): class StickyTransitions(StationaryTransitions): """ Upweight the self transition prior. - pi_k ~ Dir(alpha + kappa * e_k) """ def __init__(self, K, D, M=0, alpha=1, kappa=100): @@ -191,11 +213,11 @@ def __init__(self, K, D, M=0, alpha=1, kappa=100): def log_prior(self): K = self.K log_P = self.log_Ps - logsumexp(self.log_Ps, axis=1, keepdims=True) - + # zizi: if I want to remove log_prior effect: lp = 0 - for k in range(K): - alpha = self.alpha * np.ones(K) + self.kappa * (np.arange(K) == k) - lp += np.dot((alpha - 1), log_P[k]) + # for k in range(K): + # alpha = self.alpha * np.ones(K) + self.kappa * (np.arange(K) == k) + # lp += np.dot((alpha - 1), log_P[k]) return lp def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): @@ -209,59 +231,465 @@ def neg_hessian_expected_log_trans_prob(self, data, input, mask, tag, expected_j # Return (T-1, D, D) array of blocks for the diagonal of the Hessian T, D = data.shape return np.zeros((T-1, D, D)) + # K = number of discrete states +# D = number of observed dimensions +# M = exogenous input dimensions (the inputs modulate the probability of discrete state transitions via a multiclass logistic regression) class InputDrivenTransitions(StickyTransitions): + # zizi: my questions are numbered here """ Hidden Markov Model whose transition probabilities are determined by a generalized linear model applied to the exogenous input. """ def __init__(self, K, D, M, alpha=1, kappa=0, l2_penalty=0.0): + """ + @param K: number of states + @param D: dimensionality of output + @param C: number of distinct classes for each dimension of output + @param prior_sigma: parameter governing strength of prior. Prior on GLM weights is multivariate + normal distribution with mean 'prior_mean' and diagonal covariance matrix (prior_sigma is on diagonal) + """ + super(InputDrivenTransitions, self).__init__(K, D, M=M, alpha=alpha, kappa=kappa) + #2) should I change these aplpha and kappa here (prior for ransition matrix) # Parameters linking input to state distribution - self.Ws = npr.randn(K, M) + # print("K = "+str(K)) + # print("M = "+str(M)) + self.Ws = npr.randn(K, M) #zizi: these are weights between states no need for C + # print('self.Ws=',self.Ws) # Regularization of Ws self.l2_penalty = l2_penalty @property def params(self): + print('self.log_Ps0=', np.exp(self.log_Ps)) return self.log_Ps, self.Ws @params.setter def params(self, value): - self.log_Ps, self.Ws = value + self.log_Ps, self.Ws = value #3) is there any problem with this log-Ps? should I do anything here? + # print('self.log_Ps1=', np.exp(self.log_Ps)) def permute(self, perm): """ Permute the discrete latent states. """ self.log_Ps = self.log_Ps[np.ix_(perm, perm)] + # print('self.log_Ps3=', self.log_Ps) + # print('self.Ws.shape=', self.Ws.shape) + # print('self.Ws=', self.Ws) + # print('self.Ws=', self.Ws[perm]) self.Ws = self.Ws[perm] - def log_prior(self): + def log_prior(self): #4)this is different from observation why? any changes needed? + lp=0 + # zizi: if I want to remove log_prior effect: lp = super(InputDrivenTransitions, self).log_prior() lp = lp + np.sum(-0.5 * self.l2_penalty * self.Ws**2) return lp +##### Question? define a new normalized prior? + def log_transition_matrices(self, data, input, mask, tag): - T = data.shape[0] - assert input.shape[0] == T + T = np.array(data).shape[0] + # print('input.shape=', np.array(input).shape) + # print('np.array(data).shape1=', np.array(data).shape) + # print('data.shape12==', np.array(data).shape[0]) + # print('input[1:].shape=',np.array(input[1:]).shape) + # print('self.Ws.T.shape=', self.Ws.T.shape) + assert np.array(input).shape[0] == T # Previous state effect log_Ps = np.tile(self.log_Ps[None, :, :], (T-1, 1, 1)) + # print('log_Ps.shape=', log_Ps.shape) # Input effect log_Ps = log_Ps + np.dot(input[1:], self.Ws.T)[:, None, :] + # print('log_Ps2.shape=', log_Ps.shape) + # print('log_Ps[None, :, :]=',log_Ps[None, :, :]) #was nan + normalized_Ps= log_Ps - logsumexp(log_Ps, axis=2, keepdims=True) + # print('normalized_Ps=', normalized_Ps) + # print('normalized_Ps=', normalized_Ps.shape) + + # print('log_Ps - logsumexp(log_Ps, axis=2, keepdims=True)=', log_Ps - logsumexp(log_Ps, axis=2, keepdims=True)) + # # print('np.sort(normalized_Ps._value)=',np.sort(np.array(normalized_Ps)._value)) + # + # # below until return by zizi + # reorder_NPs=np.reshape(np.array(np.exp(normalized_Ps)), (1, np.array(normalized_Ps).shape[0] *np.array(normalized_Ps).shape[1] *np.array(normalized_Ps).shape[2])) + # # print('reorder_NPs.shape=', reorder_NPs.shape) + # # print('reorder_NPs=', reorder_NPs) + # if not isinstance(reorder_NPs, np.ndarray): #zizi: this is _values are not for arrays + # max_arr=np.sort(reorder_NPs._value[0]) + # # print('max_5=',max_arr[-2:]) + + + # NPs_1 = np.sort(np.array(normalized_Ps), axis=0, kind=None, order=None) + # NPs_2 = np.sort(np.array(normalized_Ps), axis=1, kind=None, order=None) + # NPs_3 = np.sort(np.array(normalized_Ps), axis=2, kind=None, order=None) + # print('normalized_Ps.shape=', np.array(normalized_Ps).shape) + # print('normalized_Ps.max(axis=0)=', np.array(normalized_Ps).max(axis=0)) + # print('log_Ps - logsumexp(log_Ps, axis=2, keepdims=True)=', log_Ps - logsumexp(log_Ps, axis=2, keepdims=True)) return log_Ps - logsumexp(log_Ps, axis=2, keepdims=True) - def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): - Transitions.m_step(self, expectations, datas, inputs, masks, tags, **kwargs) + def m_step(self, expectations, datas, inputs, masks, tags, + optimizer="lbfgs", num_iters=1000, **kwargs): + optimizer = dict(sgd=sgd, adam=adam, rmsprop=rmsprop, bfgs=bfgs, lbfgs=lbfgs)[optimizer] + + # Maximize the expected log joint + def _expected_log_joint(expectations): + elbo = self.log_prior() + # zizi: if I want to remove log_prior effect: + for data, input, mask, tag, (expected_states, expected_joints, _) \ + in zip(datas, inputs, masks, tags, expectations): + log_Ps = self.log_transition_matrices(data, input, mask, tag) + # print('self.params00=', np.exp(self.params[0])) + # print('log_Pss=', np.exp(log_Ps)) + + elbo += np.sum(expected_joints * log_Ps) + # print('elbo00=', elbo) + return elbo + # print('elbo=', elbo) + # Normalize and negate for minimization + T = sum([data.shape[0] for data in datas]) + + def _objective(params, itr): + # print('self.params11=', np.exp(self.params[0])) + self.params = params + # print('self.params12=', np.exp(self.params[0])) + obj = _expected_log_joint(expectations) + # print('params=',params) + return -obj / T + # Call the optimizer. Persist state (e.g. SGD momentum) across calls to m_step. + import time + start_t = time.time() + print('self.params01=', np.exp(self.params[0])) + optimizer_state = self.optimizer_state if hasattr(self, "optimizer_state") else None + self.params, self.optimizer_state = \ + optimizer(_objective, self.params, num_iters=num_iters, + state=optimizer_state, full_output=True, **kwargs) + end_t = time.time() + print('self.params02=', np.exp(self.params[0])) + # print("M-step transitions time for InputDrivenTransitionsAlternativeFormulation = " + str(end_t - start_t)) + + # def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): + # import time + # start_t = time.time() + # Transitions.m_step(self, expectations, datas, inputs, masks, tags, **kwargs) + # end_t = time.time() + # # print("M-step transitions time for InputDrivenTransitions = " + str(end_t-start_t)) + def neg_hessian_expected_log_trans_prob(self, data, input, mask, tag, expected_joints): # Return (T-1, D, D) array of blocks for the diagonal of the Hessian T, D = data.shape return np.zeros((T-1, D, D)) + +####### below is InputDrivenTransitionsAlternativeFormulation with trans prior and prior_sigma +class InputDrivenTransitionsAlternativeFormulation(StickyTransitions): + # zizi: this contains K-1 weight vectors so as to cope with degeneracy + """ + Hidden Markov Model whose transition probabilities are + determined by a generalized linear model applied to the + exogenous input. + """ +#zizi: elow prior_sigma =1000 means if we did not determine sigma, + + def __init__(self, K, D, M, prior_sigma=1000, alpha=1, kappa=0): #l2_penalty=0.0): , global_fit = False, prior_sigma=1000, alpha=1, kappa=0 + # prior_sigma = 1000 means if the sigma was not defined use this value and we dont have prior + """ + @param K: number of states + @param D: dimensionality of output + @param C: number of distinct classes for each dimension of output + @param prior_sigma: parameter governing strength of prior. Prior on GLM weights is multivariate + normal distribution with mean 'prior_mean' and diagonal covariance matrix (prior_sigma is on diagonal) + """ + + super(InputDrivenTransitionsAlternativeFormulation, self).__init__(K, D, M=M, alpha=alpha, kappa=kappa) + #2) should I change these aplpha and kappa here (prior for ransition matrix) + + # Parameters linking input to state distribution + # print("K = "+str(K)) + # print("M = "+str(M)) + self.Ws = npr.randn(K-1, M) #zizi: these are weights between states no need for C + + # Regularization of Ws + # self.l2_penalty = l2_penalty + self.prior_sigma = prior_sigma + # self.global_fit = global_fit + # print('prior_sigma==', prior_sigma) + # print('self.log_Ps000=', np.exp(self.log_Ps)) + + @property + def params(self): #2)it comes here + # print('self.Ws0=', self.Ws) + # print('self.log_Ps0=', np.exp(self.log_Ps)) + return [self.log_Ps, self.Ws] + + @params.setter + def params(self, value): + # print('self.Ws1=', self.Ws) + # print('self.log_Ps1=', np.exp(self.log_Ps)) + [self.log_Ps, self.Ws] = value #3) is there any problem with this log-Ps? should I do anything here? + + # def permute(self, perm): + # """ + # Permute the discrete latent states. + # """ + # self.log_Ps = self.log_Ps[np.ix_(perm, perm)] + # #TODO: potentially append zeros to the end so that the permute function works + # print('perm=', perm) + # print('self.Ws.shape=', self.Ws.shape) + # self.Ws = self.Ws[perm] + # print('Ws.shape=', Ws.shape) + + def permute(self, perm): + """ + Permute the discrete latent states. + """ + self.log_Ps = self.log_Ps[np.ix_(perm, perm)] + # TODO: potentially append zeros to the end so that the permute function works + self.Ws = np.vstack([self.Ws, np.zeros((1, self.Ws.shape[1]))]) # zizi for append zero + # print('self.Ws.shape=', self.Ws.shape) + self.Ws = self.Ws[perm] + + def log_prior(self): #4)this is different from observation why? any changes needed? + # lp=0 + # zizi: if I want to remove log_prior effect: + lp = super(InputDrivenTransitionsAlternativeFormulation, self).log_prior() + # print('lp_trans0=', lp) + # print('prior_sigma_t=', self.prior_sigma) + lp = lp + np.sum(-0.5 * (1 / (self.prior_sigma ** 2)) * self.Ws**2) #lp = lp + np.sum(-0.5 * self.l2_penalty * self.Ws**2) + # print('lp_trans=', lp) + return lp + + def log_transition_matrices(self, data, input, mask, tag): #self.log_Ps does not change in this func and is K by K. it is transition matrix + #below from run + # Ws_with_zeros.shape = (4, 6) #K=4, M=6 + # log_Ps2.shape = (869, 4, 4) #869 is data size abnd changes based on the session data szie + # normalized_Ps.shape = (869, 4, 4) + T = np.array(data).shape[0] + # print('T=', T) + # print('input.shape=', input.shape) + # print('np.array(data).shape1=', np.array(data).shape) + assert np.array(input).shape[0] == T + # Previous state effect #here the siize of log_Ps extends (T-1) times more + log_Ps = np.tile(self.log_Ps[None, :, :], (T-1, 1, 1)) + # print('log_Ps.shape=', log_Ps.shape) + #append column of zeros so that Ws_with_zeros is now KxM + Ws_with_zeros = np.vstack([self.Ws, np.zeros((1, self.Ws.shape[1]))]) + # Ws_with_zeros = np.vstack([self.Ws, npr.randn(1, self.Ws.shape[1])]) #just for test + # Input effect + log_Ps = log_Ps + np.dot(input[1:], Ws_with_zeros.T)[:, None, :] + normalized_Ps = log_Ps - logsumexp(log_Ps, axis=2, keepdims=True) + # print('normalized_Ps.shape=', np.exp(normalized_Ps).shape) + # print('normalized_Ps=', np.exp(normalized_Ps)) + return normalized_Ps + + def m_step(self, expectations, datas, inputs, masks, tags, #datas contain the data of all sessions; data[0] is the first session + optimizer="lbfgs", num_iters=1000, **kwargs): + optimizer = dict(sgd=sgd, adam=adam, rmsprop=rmsprop, bfgs=bfgs, lbfgs=lbfgs)[optimizer] + # print('hereee') + # Maximize the expected log joint + def _expected_log_joint(expectations): + # print('hereee2') + elbo = self.log_prior() + # zizi: if I want to remove log_prior effect: + for data, input, mask, tag, (expected_states, expected_joints, _) \ + in zip(datas, inputs, masks, tags, expectations): + log_Ps = self.log_transition_matrices(data, input, mask, tag) + K = np.array(log_Ps).shape[1] + covar_set = 2 + # print('log_Ps_all.shape', np.array(log_Ps_all).shape) + # print('log_Ps_all[0].shape', np.array(log_Ps_all[0]).shape) + # print('data.shape1==', np.array(data).shape) + # print('datas[0].shape1==', np.array(datas[0]).shape) + # print('self.params00=', np.exp(self.params[0])) + # print('log_Pss.shape=', np.exp(log_Ps).shape) + # print('log_Pss=', np.exp(log_Ps)) + elbo += np.sum(expected_joints * log_Ps) + # if self.global_fit == True: + # path_dir = '/Users/zm6112/Dropbox/Python_code/Pycharm_Z_code_github/glm-hmm_all_data_GLM_trans_diff_inputs/results/ibl_global_fit/' + 'covar_set_' + str( + # covar_set) + '/' + # else: + # path_dir = '/Users/zm6112/Dropbox/Python_code/Pycharm_Z_code_github/glm-hmm_all_data_GLM_trans_diff_inputs/results/ibl_individual_fit/' + 'covar_set_' + str( + # covar_set) + '/' + # + # print('K=', K) + # import numpy + # numpy.savez(path_dir + 'trans_matrix_K_' + str(K) + '.npz', log_Ps_all) #this should not be np.savez as np here is autograd.numpy + + # print('log_Ps_all_end.shape', np.array(log_Ps_all).shape) + # print('log_Ps_all[0]_end.shape', np.array(log_Ps_all[0]).shape) + # print('log_Ps_all[1]_end.shape', np.array(log_Ps_all[1]).shape) + return elbo# log_Ps_all is to save for the figure Jonathan said. + # print('elbo=', elbo) + # Normalize and negate for minimization + T = sum([data.shape[0] for data in datas]) + # print('hereee3') + + def _objective(params, itr): + # print('self.params11=', np.exp(self.params[0])) + self.params = params + # print('self.params12=', np.exp(self.params[0])) + obj = _expected_log_joint(expectations) + # print('params=',params) + return -obj / T + + # print('hereee4') + # Call the optimizer. Persist state (e.g. SGD momentum) across calls to m_step. + import time + start_t = time.time() + # print('self.params01=', np.exp(self.params[0])) + optimizer_state = self.optimizer_state if hasattr(self, "optimizer_state") else None + self.params, self.optimizer_state = \ + optimizer(_objective, self.params, num_iters=num_iters, + state=optimizer_state, full_output=True, **kwargs) + end_t = time.time() + # print('self.params02=', self.params) + # print("M-step transitions time for InputDrivenTransitionsAlternativeFormulation = " + str(end_t - start_t)) + elbo = _expected_log_joint(expectations) #zizi: this is for the figure + + + def neg_hessian_expected_log_trans_prob(self, data, input, mask, tag, expected_joints): + # Return (T-1, D, D) array of blocks for the diagonal of the Hessian + T, D = data.shape + return np.zeros((T-1, D, D)) + +''''###################################################### Hierarchical section for GLM-T transitions #############################################################''' + +class InputDrivenTransitionsAlternativeFormulation_Hierarchy(StickyTransitions): + # zizi: this contains K-1 weight vectors so as to cope with degeneracy + """ + Hidden Markov Model whose transition probabilities are + determined by a generalized linear model applied to the + exogenous input. + """ + def __init__(self, K, D, M, Wk_glob_trans, prior_sigma, alpha=1, kappa=0): # l2_penalty=0.0): + # prior_sigma = 1000 means if the sigma was not defined use this value and we dont have prior + """ + @param K: number of states + @param D: dimensionality of output + @param C: number of distinct classes for each dimension of output + @param prior_sigma: parameter governing strength of prior. Prior on GLM weights is multivariate + normal distribution with mean 'prior_mean' and diagonal covariance matrix (prior_sigma is on diagonal) + """ + + super(InputDrivenTransitionsAlternativeFormulation_Hierarchy, self).__init__(K, D, M=M, alpha=alpha, kappa=kappa) + # 2) should I change these aplpha and kappa here (prior for ransition matrix) + + # Parameters linking input to state distribution + # print("K = " + str(K)) + # print("M = " + str(M)) + self.Ws = npr.randn(K - 1, M) # zizi: these are weights between states no need for C + + # Regularization of Ws + # self.l2_penalty = l2_penalty + self.prior_sigma = prior_sigma + self.Wk_glob_trans = np.copy(Wk_glob_trans) + + @property + def params(self): # 2)it comes here + # print('self.Ws0=', self.Ws) + # print('self.log_Ps0=', self.log_Ps) + return [self.log_Ps, self.Ws] + + @params.setter + def params(self, value): # it does not come here + # print('self.Ws1=', self.Ws) + [self.log_Ps, self.Ws] = value # 3) is there any problem with this log-Ps? should I do anything here? + + # def permute(self, perm): + # """ + # Permute the discrete latent states. + # """ + # self.log_Ps = self.log_Ps[np.ix_(perm, perm)] + # #TODO: potentially append zeros to the end so that the permute function works + # print('perm=', perm) + # print('self.Ws.shape=', self.Ws.shape) + # self.Ws = self.Ws[perm] + # print('Ws.shape=', Ws.shape) + + def permute(self, perm): + """ + Permute the discrete latent states. + """ + self.log_Ps = self.log_Ps[np.ix_(perm, perm)] + # TODO: potentially append zeros to the end so that the permute function works + self.Ws = np.vstack([self.Ws, np.zeros((1, self.Ws.shape[1]))]) # zizi for append zero + # print('self.Ws.shape=', self.Ws.shape) + self.Ws = self.Ws[perm] + + def log_prior(self): # 4)this is different from observation why? any changes needed? + # zizi: if I want to remove log_prior effect: + lp = super(InputDrivenTransitionsAlternativeFormulation_Hierarchy, self).log_prior() + # print('lp_trans0=', lp) + ## below no hire + # lp = lp + np.sum(-0.5 * (1 / (self.prior_sigma ** 2)) * self.Ws ** 2) # lp = lp + np.sum(-0.5 * self.l2_penalty * self.Ws**2) + lp = lp + np.sum(-0.5 * (1 / (self.prior_sigma ** 2)) * (self.Ws-self.Wk_glob_trans) ** 2) + + # print('lp_trans=', lp) + return lp + + def log_transition_matrices(self, data, input, mask, + tag): # self.log_Ps does not change in this func and is K by K. it is transition matrix + # below from run + # Ws_with_zeros.shape = (4, 6) #K=4, M=6 + # log_Ps2.shape = (869, 4, 4) #869 is data size abnd changes based on the session data szie + # normalized_Ps.shape = (869, 4, 4) + T = np.array(data).shape[0] + assert np.array(input).shape[0] == T + # Previous state effect #here the siize of log_Ps extends (T-1) times more + log_Ps = np.tile(self.log_Ps[None, :, :], (T - 1, 1, 1)) + # append column of zeros so that Ws_with_zeros is now KxM + Ws_with_zeros = np.vstack([self.Ws, np.zeros((1, self.Ws.shape[1]))]) + # Input effect + log_Ps = log_Ps + np.dot(input[1:], Ws_with_zeros.T)[:, None, :] + normalized_Ps = log_Ps - logsumexp(log_Ps, axis=2, keepdims=True) + return normalized_Ps + + def m_step(self, expectations, datas, inputs, masks, tags, + optimizer="lbfgs", num_iters=1000, **kwargs): + optimizer = dict(sgd=sgd, adam=adam, rmsprop=rmsprop, bfgs=bfgs, lbfgs=lbfgs)[optimizer] + + # Maximize the expected log joint + def _expected_log_joint(expectations): + elbo = self.log_prior() + # zizi: if I want to remove log_prior effect: + for data, input, mask, tag, (expected_states, expected_joints, _) \ + in zip(datas, inputs, masks, tags, expectations): + log_Ps = self.log_transition_matrices(data, input, mask, tag) + elbo += np.sum(expected_joints * log_Ps) + return elbo + + # Normalize and negate for minimization + T = sum([data.shape[0] for data in datas]) + + def _objective(params, itr): + self.params = params + obj = _expected_log_joint(expectations) + # print('params=',params) + return -obj / T + + # Call the optimizer. Persist state (e.g. SGD momentum) across calls to m_step. + import time + start_t = time.time() + + optimizer_state = self.optimizer_state if hasattr(self, "optimizer_state") else None + self.params, self.optimizer_state = \ + optimizer(_objective, self.params, num_iters=num_iters, + state=optimizer_state, full_output=True, **kwargs) + end_t = time.time() + # print('self.params00=', self.params) + # print("M-step transitions time for InputDrivenTransitionsAlternativeFormulation = " + str(end_t - start_t)) + + def neg_hessian_expected_log_trans_prob(self, data, input, mask, tag, expected_joints): + # Return (T-1, D, D) array of blocks for the diagonal of the Hessian + T, D = data.shape + return np.zeros((T - 1, D, D)) + + class RecurrentTransitions(InputDrivenTransitions): """ Generalization of the input driven HMM in which the observations serve as future inputs @@ -667,3 +1095,969 @@ def m_step(self, expectations, datas, inputs, masks, tags, samples, **kwargs): # Reset the transition matrix self._transition_matrix = None + + + +# class InputDrivenTransitionsAlternativeFormulation(StickyTransitions): + # # zizi: this contains K-1 weight vectors so as to cope with degeneracy + # """ + # Hidden Markov Model whose transition probabilities are + # determined by a generalized linear model applied to the + # exogenous input. + # """ + # def __init__(self, K, D, M, alpha=1, kappa=0, prior_sigma = 1000): #l2_penalty=0.0): + # # prior_sigma = 1000 means if the sigma was not defined use this value and we dont have prior + # """ + # @param K: number of states + # @param D: dimensionality of output + # @param C: number of distinct classes for each dimension of output + # @param prior_sigma: parameter governing strength of prior. Prior on GLM weights is multivariate + # normal distribution with mean 'prior_mean' and diagonal covariance matrix (prior_sigma is on diagonal) + # """ + # + # super(InputDrivenTransitionsAlternativeFormulation, self).__init__(K, D, M=M, alpha=alpha, kappa=kappa) + # #2) should I change these aplpha and kappa here (prior for ransition matrix) + # + # # Parameters linking input to state distribution + # print("K = "+str(K)) + # print("M = "+str(M)) + # self.Ws = npr.randn(K-1, M) #zizi: these are weights between states no need for C + # + # # Regularization of Ws + # # self.l2_penalty = l2_penalty + # self.prior_sigma = prior_sigma + # + # @property + # def params(self): #2)it comes here + # # print('self.Ws0=', self.Ws) + # # print('self.log_Ps0=', self.log_Ps) + # return [self.log_Ps, self.Ws] + # + # @params.setter + # def params(self, value): #it does not come here + # # print('self.Ws1=', self.Ws) + # [self.log_Ps, self.Ws] = value #3) is there any problem with this log-Ps? should I do anything here? + # + # # def permute(self, perm): + # # """ + # # Permute the discrete latent states. + # # """ + # # self.log_Ps = self.log_Ps[np.ix_(perm, perm)] + # # #TODO: potentially append zeros to the end so that the permute function works + # # print('perm=', perm) + # # print('self.Ws.shape=', self.Ws.shape) + # # self.Ws = self.Ws[perm] + # # print('Ws.shape=', Ws.shape) + # + # def permute(self, perm): + # """ + # Permute the discrete latent states. + # """ + # self.log_Ps = self.log_Ps[np.ix_(perm, perm)] + # # TODO: potentially append zeros to the end so that the permute function works + # self.Ws = np.vstack([self.Ws, np.zeros((1, self.Ws.shape[1]))]) # zizi for append zero + # # print('self.Ws.shape=', self.Ws.shape) + # self.Ws = self.Ws[perm] + # + # def log_prior(self): #4)this is different from observation why? any changes needed? + # lp=0 + # # zizi: if I want to remove log_prior effect: + # lp = super(InputDrivenTransitionsAlternativeFormulation, self).log_prior() + # # print('lp_trans0=', lp) + # lp = lp + np.sum(-0.5 * (1 / (self.prior_sigma ** 2)) * self.Ws**2) #lp = lp + np.sum(-0.5 * self.l2_penalty * self.Ws**2) + # # print('lp_trans=', lp) + # return lp + # + # def log_transition_matrices(self, data, input, mask, tag): #self.log_Ps does not change in this func and is K by K. it is transition matrix + # #below from run + # # Ws_with_zeros.shape = (4, 6) #K=4, M=6 + # # log_Ps2.shape = (869, 4, 4) #869 is data size abnd changes based on the session data szie + # # normalized_Ps.shape = (869, 4, 4) + # T = np.array(data).shape[0] + # assert np.array(input).shape[0] == T + # # Previous state effect #here the siize of log_Ps extends (T-1) times more + # log_Ps = np.tile(self.log_Ps[None, :, :], (T-1, 1, 1)) + # #append column of zeros so that Ws_with_zeros is now KxM + # Ws_with_zeros = np.vstack([self.Ws, np.zeros((1, self.Ws.shape[1]))]) + # # Input effect + # log_Ps = log_Ps + np.dot(input[1:], Ws_with_zeros.T)[:, None, :] + # normalized_Ps= log_Ps - logsumexp(log_Ps, axis=2, keepdims=True) + # return normalized_Ps + # + # def m_step(self, expectations, datas, inputs, masks, tags, + # optimizer="lbfgs", num_iters=1000, **kwargs): + # optimizer = dict(sgd=sgd, adam=adam, rmsprop=rmsprop, bfgs=bfgs, lbfgs=lbfgs)[optimizer] + # + # # Maximize the expected log joint + # def _expected_log_joint(expectations): + # elbo = self.log_prior() + # # zizi: if I want to remove log_prior effect: + # for data, input, mask, tag, (expected_states, expected_joints, _) \ + # in zip(datas, inputs, masks, tags, expectations): + # log_Ps = self.log_transition_matrices(data, input, mask, tag) + # elbo += np.sum(expected_joints * log_Ps) + # return elbo + # # Normalize and negate for minimization + # T = sum([data.shape[0] for data in datas]) + # + # def _objective(params, itr): + # self.params = params + # obj = _expected_log_joint(expectations) + # # print('params=',params) + # return -obj / T + # + # # Call the optimizer. Persist state (e.g. SGD momentum) across calls to m_step. + # import time + # start_t = time.time() + # + # optimizer_state = self.optimizer_state if hasattr(self, "optimizer_state") else None + # self.params, self.optimizer_state = \ + # optimizer(_objective, self.params, num_iters=num_iters, + # state=optimizer_state, full_output=True, **kwargs) + # end_t = time.time() + # # print('self.params00=', self.params) + # # print("M-step transitions time for InputDrivenTransitionsAlternativeFormulation = " + str(end_t - start_t)) + # + # def neg_hessian_expected_log_trans_prob(self, data, input, mask, tag, expected_joints): + # # Return (T-1, D, D) array of blocks for the diagonal of the Hessian + # T, D = data.shape + # return np.zeros((T-1, D, D)) + + +########################################## +# from functools import partial +# from warnings import warn +# +# import autograd.numpy as np +# import autograd.numpy.random as npr +# from autograd.scipy.special import logsumexp +# from autograd.scipy.stats import dirichlet +# from autograd import hessian +# +# from ssm.util import one_hot, logistic, relu, rle, ensure_args_are_lists, LOG_EPS, DIV_EPS +# from ssm.regression import fit_multiclass_logistic_regression, fit_negative_binomial_integer_r +# from ssm.stats import multivariate_normal_logpdf +# from ssm.optimizers import adam, bfgs, lbfgs, rmsprop, sgd +# +# +# class Transitions(object): +# def __init__(self, K, D, M=0): +# self.K, self.D, self.M = K, D, M +# +# @property +# def params(self): +# raise NotImplementedError +# +# @params.setter +# def params(self, value): +# raise NotImplementedError +# +# @ensure_args_are_lists +# def initialize(self, datas, inputs=None, masks=None, tags=None): +# pass +# +# def permute(self, perm): +# pass +# +# def log_prior(self): +# return 0 +# +# def log_transition_matrices(self, data, input, mask, tag): +# raise NotImplementedError +# +# def transition_matrices(self, data, input, mask, tag): +# # print('input_type0=', type(input)) +# # print('data.shape13=',data.shape) +# return np.exp(self.log_transition_matrices(data, input, mask, tag)) +# +# def m_step(self, expectations, datas, inputs, masks, tags, +# optimizer="lbfgs", num_iters=1000, **kwargs): +# """ +# If M-step cannot be done in closed form for the transitions, default to BFGS. +# """ +# optimizer = dict(sgd=sgd, adam=adam, rmsprop=rmsprop, bfgs=bfgs, lbfgs=lbfgs)[optimizer] +# +# # Maximize the expected log joint +# def _expected_log_joint(expectations): +# elbo =0 # self.log_prior() +# for data, input, mask, tag, (expected_states, expected_joints, _) \ +# in zip(datas, inputs, masks, tags, expectations): +# log_Ps = self.log_transition_matrices(data, input, mask, tag) +# elbo += np.sum(expected_joints * log_Ps) +# return elbo +# +# # Normalize and negate for minimization +# T = sum([data.shape[0] for data in datas]) +# +# def _objective(params, itr): +# self.params = params +# obj = _expected_log_joint(expectations) +# # print('params=',params) +# return -obj / T +# +# # Call the optimizer. Persist state (e.g. SGD momentum) across calls to m_step. +# optimizer_state = self.optimizer_state if hasattr(self, "optimizer_state") else None +# params, self.optimizer_state = \ +# optimizer(_objective, self.params, num_iters=num_iters, +# state=optimizer_state, full_output=True, **kwargs) +# self.params[0] = params[0] #comment out if you want to stop P0 being updated +# self.params[1] = params[1] #comment out if you want to stop transition weights being updated +# +# def neg_hessian_expected_log_trans_prob(self, data, input, mask, tag, expected_joints): +# # Return (T-1, D, D) array of blocks for the diagonal of the Hessian +# warn("Analytical Hessian is not implemented for this transition class. \ +# Optimization via Laplace-EM may be slow. Consider using an \ +# alternative posterior and inference method.") +# obj = lambda x, E_zzp1: np.sum(E_zzp1 * self.log_transition_matrices(x, input, mask, tag)) +# hess = hessian(obj) +# terms = np.array([-1 * hess(x[None,:], Ezzp1) for x, Ezzp1 in zip(data, expected_joints)]) +# return terms +# +# class StationaryTransitions(Transitions): +# """ +# Standard Hidden Markov Model with fixed initial distribution and transition matrix. +# """ +# def __init__(self, K, D, M=0): +# super(StationaryTransitions, self).__init__(K, D, M=M) +# Ps = .95 * np.eye(K) + .05 * npr.rand(K, K) +# Ps /= Ps.sum(axis=1, keepdims=True) +# self.log_Ps = np.log(Ps) +# +# @property +# def params(self): +# return (self.log_Ps,) +# +# @params.setter +# def params(self, value): +# self.log_Ps = value[0] +# +# def permute(self, perm): +# """ +# Permute the discrete latent states. +# """ +# self.log_Ps = self.log_Ps[np.ix_(perm, perm)] +# +# @property +# def transition_matrix(self): +# return np.exp(self.log_Ps - logsumexp(self.log_Ps, axis=1, keepdims=True)) +# +# def log_transition_matrices(self, data, input, mask, tag): +# log_Ps = self.log_Ps - logsumexp(self.log_Ps, axis=1, keepdims=True) +# return log_Ps[None, :, :] +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# K = self.K +# P = sum([np.sum(Ezzp1, axis=0) for _, Ezzp1, _ in expectations]) + 1e-32 +# P = np.nan_to_num(P / P.sum(axis=-1, keepdims=True)) +# +# # Set rows that are all zero to uniform +# P = np.where(P.sum(axis=-1, keepdims=True) == 0, 1.0 / K, P) +# log_P = np.log(P) +# self.log_Ps = log_P - logsumexp(log_P, axis=-1, keepdims=True) +# +# def neg_hessian_expected_log_trans_prob(self, data, input, mask, tag, expected_joints): +# # Return (T-1, D, D) array of blocks for the diagonal of the Hessian +# T, D = data.shape +# return np.zeros((T-1, D, D)) +# +# +# class ConstrainedStationaryTransitions(StationaryTransitions): +# """ +# Standard Hidden Markov Model with fixed transition matrix. +# Allows the user to specify some entries of the transition matrix to be zeros, +# in order to prohibit certain transitions. +# +# The user passes an array, `mask`, which must be the same size +# as the transition matrix. Entries of the mask which are zero +# correspond to entries in the transition matrix which will be +# fixed at zero. +# """ +# def __init__(self, K, D, transition_mask=None, M=0): +# super(ConstrainedStationaryTransitions, self).__init__(K, D, M=M) +# Ps = self.transition_matrix +# if transition_mask is None: +# transition_mask = np.ones_like(Ps, dtype=bool) +# else: +# transition_mask = transition_mask.astype(bool) +# +# # Validate the transition mask. A valid mask must have be the same shape +# # as the transition matrix, contain only ones and zeros, and contain at +# # least one non-zero entry per row. +# assert transition_mask.shape == Ps.shape, "Mask must be the same size " \ +# "as the transition matrix. Found mask of shape {}".format(transition_mask.shape) +# assert np.isin(transition_mask,[1,0]).all(), "Mask must contain only 1s and zeros." +# for i in range(transition_mask.shape[0]): +# assert transition_mask[i].any(), "Mask must contain at least one " \ +# "nonzero entry per row." +# +# self.transition_mask = transition_mask +# Ps = Ps * transition_mask +# Ps /= Ps.sum(axis=-1, keepdims=True) +# self.log_Ps = np.log(Ps) +# self.log_Ps[~transition_mask] = -np.inf +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# super(ConstrainedStationaryTransitions, self).m_step( +# expectations, +# datas, +# inputs, +# masks, +# tags, +# **kwargs +# ) +# assert np.allclose(self.transition_matrix[~self.transition_mask], 0, +# atol=2 * LOG_EPS) +# self.log_Ps[~self.transition_mask] = -np.inf +# +# +# class StickyTransitions(StationaryTransitions): +# """ +# Upweight the self transition prior. +# +# pi_k ~ Dir(alpha + kappa * e_k) +# """ +# def __init__(self, K, D, M=0, alpha=1, kappa=100): +# super(StickyTransitions, self).__init__(K, D, M=M) +# self.alpha = alpha +# self.kappa = kappa +# +# def log_prior(self): +# K = self.K +# log_P = self.log_Ps - logsumexp(self.log_Ps, axis=1, keepdims=True) +# +# lp = 0 +# # for k in range(K): +# # alpha = self.alpha * np.ones(K) + self.kappa * (np.arange(K) == k) +# # lp += np.dot((alpha - 1), log_P[k]) +# return lp +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# expected_joints = sum([np.sum(Ezzp1, axis=0) for _, Ezzp1, _ in expectations]) + 1e-16 +# expected_joints += self.kappa * np.eye(self.K) + (self.alpha-1) * np.ones((self.K, self.K)) +# P = (expected_joints / expected_joints.sum(axis=1, keepdims=True)) + 1e-16 +# assert np.all(P >= 0), "mode is well defined only when transition matrix entries are non-negative! Check alpha >= 1" +# self.log_Ps = np.log(P) +# +# def neg_hessian_expected_log_trans_prob(self, data, input, mask, tag, expected_joints): +# # Return (T-1, D, D) array of blocks for the diagonal of the Hessian +# T, D = data.shape +# return np.zeros((T-1, D, D)) +# +# # K = number of discrete states +# # D = number of observed dimensions +# # M = exogenous input dimensions (the inputs modulate the probability of discrete state transitions via a multiclass logistic regression) +# +# class InputDrivenTransitions(StickyTransitions): +# # zizi: my questions are numbered here +# """ +# Hidden Markov Model whose transition probabilities are +# determined by a generalized linear model applied to the +# exogenous input. +# """ +# def __init__(self, K, D, M, alpha=1, kappa=0, l2_penalty=0.0): +# """ +# @param K: number of states +# @param D: dimensionality of output +# @param C: number of distinct classes for each dimension of output +# @param prior_sigma: parameter governing strength of prior. Prior on GLM weights is multivariate +# normal distribution with mean 'prior_mean' and diagonal covariance matrix (prior_sigma is on diagonal) +# """ +# +# super(InputDrivenTransitions, self).__init__(K, D, M=M, alpha=alpha, kappa=kappa) +# #2) should I change these aplpha and kappa here (prior for ransition matrix) +# +# # Parameters linking input to state distribution +# print("K = "+str(K)) +# print("M = "+str(M)) +# self.Ws = npr.randn(K, M) #zizi: these are weights between states no need for C +# +# # Regularization of Ws +# self.l2_penalty = l2_penalty +# +# @property +# def params(self): +# return self.log_Ps, self.Ws +# +# @params.setter +# def params(self, value): +# self.log_Ps, self.Ws = value #3) is there any problem with this log-Ps? should I do anything here? +# +# def permute(self, perm): +# """ +# Permute the discrete latent states. +# """ +# self.log_Ps = self.log_Ps[np.ix_(perm, perm)] +# self.Ws = self.Ws[perm] +# +# def log_prior(self): #4)this is different from observation why? any changes needed? +# lp=0 +# # lp = super(InputDrivenTransitions, self).log_prior() +# # lp = lp + np.sum(-0.5 * self.l2_penalty * self.Ws**2) +# return lp +# +# def log_transition_matrices(self, data, input, mask, tag): +# T = np.array(data).shape[0] +# # print('input.shape=', np.array(input).shape) +# # print('T1=', T) +# # print('data.shape12==', np.array(data).shape[0]) +# # print('input[1:].shape=',np.array(input[1:]).shape) +# # print('self.Ws.T.shape=', self.Ws.T.shape) +# assert np.array(input).shape[0] == T +# # Previous state effect +# log_Ps = np.tile(self.log_Ps[None, :, :], (T-1, 1, 1)) +# # Input effect +# log_Ps = log_Ps + np.dot(input[1:], self.Ws.T)[:, None, :] +# normalized_Ps= log_Ps - logsumexp(log_Ps, axis=2, keepdims=True) +# # print('np.sort(normalized_Ps._value)=',np.sort(np.array(normalized_Ps)._value)) +# +# # below until return by zizi +# reorder_NPs=np.reshape(np.array(np.exp(normalized_Ps)), (1, np.array(normalized_Ps).shape[0] *np.array(normalized_Ps).shape[1] *np.array(normalized_Ps).shape[2])) +# # print('reorder_NPs.shape=', reorder_NPs.shape) +# # print('reorder_NPs=', reorder_NPs) +# if not isinstance(reorder_NPs, np.ndarray): #zizi: this is _values are not for arrays +# max_arr=np.sort(reorder_NPs._value[0]) +# # print('max_5=',max_arr[-2:]) +# +# +# # NPs_1 = np.sort(np.array(normalized_Ps), axis=0, kind=None, order=None) +# # NPs_2 = np.sort(np.array(normalized_Ps), axis=1, kind=None, order=None) +# # NPs_3 = np.sort(np.array(normalized_Ps), axis=2, kind=None, order=None) +# # print('normalized_Ps.shape=', np.array(normalized_Ps).shape) +# # print('normalized_Ps.max(axis=0)=', np.array(normalized_Ps).max(axis=0)) +# +# return log_Ps - logsumexp(log_Ps, axis=2, keepdims=True) +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# Transitions.m_step(self, expectations, datas, inputs, masks, tags, **kwargs) +# +# def neg_hessian_expected_log_trans_prob(self, data, input, mask, tag, expected_joints): +# # Return (T-1, D, D) array of blocks for the diagonal of the Hessian +# T, D = data.shape +# return np.zeros((T-1, D, D)) +# +# +# class InputDrivenTransitionsAlternativeFormulation(StickyTransitions): +# # zizi: this contains K-1 weight vectors so as to cope with degeneracy +# """ +# Hidden Markov Model whose transition probabilities are +# determined by a generalized linear model applied to the +# exogenous input. +# """ +# def __init__(self, K, D, M, alpha=1, kappa=0, l2_penalty=0.0): +# """ +# @param K: number of states +# @param D: dimensionality of output +# @param C: number of distinct classes for each dimension of output +# @param prior_sigma: parameter governing strength of prior. Prior on GLM weights is multivariate +# normal distribution with mean 'prior_mean' and diagonal covariance matrix (prior_sigma is on diagonal) +# """ +# +# super(InputDrivenTransitionsAlternativeFormulation, self).__init__(K, D, M=M, alpha=alpha, kappa=kappa) +# #2) should I change these aplpha and kappa here (prior for ransition matrix) +# +# # Parameters linking input to state distribution +# print("K = "+str(K)) +# print("M = "+str(M)) +# self.Ws = npr.randn(K-1, M) #zizi: these are weights between states no need for C +# +# # Regularization of Ws +# self.l2_penalty = l2_penalty +# +# @property +# def params(self): +# return [self.log_Ps, self.Ws] +# +# @params.setter +# def params(self, value): +# [self.log_Ps, self.Ws] = value #3) is there any problem with this log-Ps? should I do anything here? +# +# def permute(self, perm): +# """ +# Permute the discrete latent states. +# """ +# self.log_Ps = self.log_Ps[np.ix_(perm, perm)] +# #TODO: potentially append zeros to the end so that the permute function works +# self.Ws = self.Ws[perm] +# +# def log_prior(self): #4)this is different from observation why? any changes needed? +# lp=0 +# # lp = super(InputDrivenTransitions, self).log_prior() +# # lp = lp + np.sum(-0.5 * self.l2_penalty * self.Ws**2) +# return lp +# +# def log_transition_matrices(self, data, input, mask, tag): +# T = np.array(data).shape[0] +# # print('input.shape=', np.array(input).shape) +# # print('T1=', T) +# # print('data.shape12==', np.array(data).shape[0]) +# # print('input[1:].shape=',np.array(input[1:]).shape) +# # print('self.Ws.T.shape=', self.Ws.T.shape) +# assert np.array(input).shape[0] == T +# # Previous state effect +# log_Ps = np.tile(self.log_Ps[None, :, :], (T-1, 1, 1)) +# #append column of zeros so that Ws_with_zeros is now KxM +# Ws_with_zeros = np.vstack([self.Ws, np.zeros((1, self.Ws.shape[1]))]) +# # Input effect +# log_Ps = log_Ps + np.dot(input[1:], Ws_with_zeros.T)[:, None, :] +# normalized_Ps= log_Ps - logsumexp(log_Ps, axis=2, keepdims=True) +# # print('np.sort(normalized_Ps._value)=',np.sort(np.array(normalized_Ps)._value)) +# +# # below until return by zizi +# #reorder_NPs=np.reshape(np.array(np.exp(normalized_Ps)), (1, np.array(normalized_Ps).shape[0] *np.array(normalized_Ps).shape[1] *np.array(normalized_Ps).shape[2])) +# # print('reorder_NPs.shape=', reorder_NPs.shape) +# # print('reorder_NPs=', reorder_NPs) +# # if not isinstance(reorder_NPs, np.ndarray): #zizi: this is _values are not for arrays +# # max_arr=np.sort(reorder_NPs._value[0]) +# # print('max_5=',max_arr[-2:]) +# +# +# # NPs_1 = np.sort(np.array(normalized_Ps), axis=0, kind=None, order=None) +# # NPs_2 = np.sort(np.array(normalized_Ps), axis=1, kind=None, order=None) +# # NPs_3 = np.sort(np.array(normalized_Ps), axis=2, kind=None, order=None) +# # print('normalized_Ps.shape=', np.array(normalized_Ps).shape) +# # print('normalized_Ps.max(axis=0)=', np.array(normalized_Ps).max(axis=0)) +# +# return normalized_Ps +# +# def m_step(self, expectations, datas, inputs, masks, tags, +# optimizer="lbfgs", num_iters=1000, **kwargs): +# """ +# If M-step cannot be done in closed form for the transitions, default to BFGS. +# """ +# optimizer = dict(sgd=sgd, adam=adam, rmsprop=rmsprop, bfgs=bfgs, lbfgs=lbfgs)[optimizer] +# +# # Maximize the expected log joint +# def _expected_log_joint(expectations): +# elbo = 0 # self.log_prior() +# for data, input, mask, tag, (expected_states, expected_joints, _) \ +# in zip(datas, inputs, masks, tags, expectations): +# log_Ps = self.log_transition_matrices(data, input, mask, tag) +# elbo += np.sum(expected_joints * log_Ps) +# return elbo +# +# # Normalize and negate for minimization +# T = sum([data.shape[0] for data in datas]) +# +# def _objective(params, itr): +# self.params = params +# obj = _expected_log_joint(expectations) +# # print('params=',params) +# return -obj / T +# +# # Call the optimizer. Persist state (e.g. SGD momentum) across calls to m_step. +# optimizer_state = self.optimizer_state if hasattr(self, "optimizer_state") else None +# self.params, self.optimizer_state = \ +# optimizer(_objective, self.params, num_iters=num_iters, +# state=optimizer_state, full_output=True, **kwargs) +# +# def neg_hessian_expected_log_trans_prob(self, data, input, mask, tag, expected_joints): +# # Return (T-1, D, D) array of blocks for the diagonal of the Hessian +# T, D = data.shape +# return np.zeros((T-1, D, D)) +# +# +# class RecurrentTransitions(InputDrivenTransitions): +# """ +# Generalization of the input driven HMM in which the observations serve as future inputs +# """ +# def __init__(self, K, D, M=0, alpha=1, kappa=0): +# super(RecurrentTransitions, self).__init__(K, D, M, alpha=alpha, kappa=kappa) +# +# # Parameters linking past observations to state distribution +# self.Rs = np.zeros((K, D)) +# +# @property +# def params(self): +# return super(RecurrentTransitions, self).params + (self.Rs,) +# +# @params.setter +# def params(self, value): +# self.Rs = value[-1] +# super(RecurrentTransitions, self.__class__).params.fset(self, value[:-1]) +# +# def permute(self, perm): +# """ +# Permute the discrete latent states. +# """ +# super(RecurrentTransitions, self).permute(perm) +# self.Rs = self.Rs[perm] +# +# def log_transition_matrices(self, data, input, mask, tag): +# T, _ = data.shape +# # Previous state effect +# log_Ps = np.tile(self.log_Ps[None, :, :], (T-1, 1, 1)) +# # Input effect +# log_Ps = log_Ps + np.dot(input[1:], self.Ws.T)[:, None, :] +# # Past observations effect +# log_Ps = log_Ps + np.dot(data[:-1], self.Rs.T)[:, None, :] +# return log_Ps - logsumexp(log_Ps, axis=2, keepdims=True) +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# Transitions.m_step(self, expectations, datas, inputs, masks, tags, **kwargs) +# +# def neg_hessian_expected_log_trans_prob(self, data, input, mask, tag, expected_joints): +# # Return (T-1, D, D) array of blocks for the diagonal of the Hessian +# T, D = data.shape +# hess = np.zeros((T-1,D,D)) +# vtildes = np.exp(self.log_transition_matrices(data, input, mask, tag)) # normalized probabilities +# Ez = np.sum(expected_joints, axis=2) # marginal over z from T=1 to T-1 +# for k in range(self.K): +# vtilde = vtildes[:,k,:] # normalized probabilities given state k +# Rv = vtilde @ self.Rs +# hess += Ez[:,k][:,None,None] * \ +# ( np.einsum('tn, ni, nj ->tij', -vtilde, self.Rs, self.Rs) \ +# + np.einsum('ti, tj -> tij', Rv, Rv)) +# return -1 * hess +# +# class RecurrentOnlyTransitions(Transitions): +# """ +# Only allow the past observations and inputs to influence the +# next state. Get rid of the transition matrix and replace it +# with a constant bias r. +# """ +# def __init__(self, K, D, M=0): +# super(RecurrentOnlyTransitions, self).__init__(K, D, M) +# +# # Parameters linking past observations to state distribution +# self.Ws = npr.randn(K, M) +# self.Rs = npr.randn(K, D) +# self.r = npr.randn(K) +# +# @property +# def params(self): +# return self.Ws, self.Rs, self.r +# +# @params.setter +# def params(self, value): +# self.Ws, self.Rs, self.r = value +# +# def permute(self, perm): +# """ +# Permute the discrete latent states. +# """ +# self.Ws = self.Ws[perm] +# self.Rs = self.Rs[perm] +# self.r = self.r[perm] +# +# def log_transition_matrices(self, data, input, mask, tag): +# log_Ps = np.dot(input[1:], self.Ws.T)[:, None, :] # inputs +# log_Ps = log_Ps + np.dot(data[:-1], self.Rs.T)[:, None, :] # past observations +# log_Ps = log_Ps + self.r # bias +# log_Ps = np.tile(log_Ps, (1, self.K, 1)) # expand +# return log_Ps - logsumexp(log_Ps, axis=2, keepdims=True) # normalize +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# Transitions.m_step(self, expectations, datas, inputs, masks, tags, **kwargs) +# +# def neg_hessian_expected_log_trans_prob(self, data, input, mask, tag, expected_joints): +# # Return (T-1, D, D) array of blocks for the diagonal of the Hessian +# v = np.dot(input[1:], self.Ws.T) + np.dot(data[:-1], self.Rs.T) + self.r +# shifted_exp = np.exp(v - np.max(v,axis=1,keepdims=True)) +# vtilde = shifted_exp / np.sum(shifted_exp,axis=1,keepdims=True) # normalized probabilities +# Rv = vtilde@self.Rs +# hess = np.einsum('tn, ni, nj ->tij', -vtilde, self.Rs, self.Rs) \ +# + np.einsum('ti, tj -> tij', Rv, Rv) +# return -1 * hess +# +# +# class RBFRecurrentTransitions(InputDrivenTransitions): +# """ +# Recurrent transitions with radial basis functions for parameterizing +# the next state probability given current continuous data. We have, +# +# p(z_{t+1} = k | z_t, x_t) +# \propto N(x_t | \mu_k, \Sigma_k) \times \pi_{z_t, z_{t+1}) +# +# where {\mu_k, \Sigma_k, \pi_k}_{k=1}^K are learned parameters. +# Equivalently, +# +# log p(z_{t+1} = k | z_t, x_t) +# = log N(x_t | \mu_k, \Sigma_k) + log \pi_{z_t, z_{t+1}) + const +# = -D/2 log(2\pi) -1/2 log |Sigma_k| +# -1/2 (x - \mu_k)^T \Sigma_k^{-1} (x-\mu_k) +# + log \pi{z_t, z_{t+1}} +# +# The difference between this and the recurrent model above is that the +# log transition matrices are quadratic functions of x rather than linear. +# +# While we're at it, there's no harm in adding a linear term to the log +# transition matrices to capture input dependencies. +# """ +# def __init__(self, K, D, M=0, alpha=1, kappa=0): +# super(RBFRecurrentTransitions, self).__init__(K, D, M=M, alpha=alpha, kappa=kappa) +# +# # RBF parameters +# self.mus = npr.randn(K, D) +# self._sqrt_Sigmas = npr.randn(K, D, D) +# +# @property +# def params(self): +# return self.log_Ps, self.mus, self._sqrt_Sigmas, self.Ws +# +# @params.setter +# def params(self, value): +# self.log_Ps, self.mus, self._sqrt_Sigmas, self.Ws = value +# +# @property +# def Sigmas(self): +# return np.matmul(self._sqrt_Sigmas, np.swapaxes(self._sqrt_Sigmas, -1, -2)) +# +# @ensure_args_are_lists +# def initialize(self, datas, inputs=None, masks=None, tags=None): +# # Fit a GMM to the data to set the means and covariances +# from sklearn.mixture import GaussianMixture +# gmm = GaussianMixture(self.K, covariance_type="full") +# gmm.fit(np.vstack(datas)) +# self.mus = gmm.means_ +# self._sqrt_Sigmas = np.linalg.cholesky(gmm.covariances_) +# +# def permute(self, perm): +# """ +# Permute the discrete latent states. +# """ +# self.log_Ps = self.log_Ps[np.ix_(perm, perm)] +# self.mus = self.mus[perm] +# self.sqrt_Sigmas = self.sqrt_Sigmas[perm] +# self.Ws = self.Ws[perm] +# +# def log_transition_matrices(self, data, input, mask, tag): +# assert np.all(mask), "Recurrent models require that all data are present." +# +# T = data.shape[0] +# assert input.shape[0] == T +# K, D = self.K, self.D +# +# # Previous state effect +# log_Ps = np.tile(self.log_Ps[None, :, :], (T-1, 1, 1)) +# +# # RBF recurrent function +# rbf = multivariate_normal_logpdf(data[:-1, None, :], self.mus, self.Sigmas) +# log_Ps = log_Ps + rbf[:, None, :] +# +# # Input effect +# log_Ps = log_Ps + np.dot(input[1:], self.Ws.T)[:, None, :] +# return log_Ps - logsumexp(log_Ps, axis=2, keepdims=True) +# +# def m_step(self, expectations, datas, inputs, masks, tags, **kwargs): +# Transitions.m_step(self, expectations, datas, inputs, masks, tags, **kwargs) +# +# +# # Allow general nonlinear emission models with neural networks +# class NeuralNetworkRecurrentTransitions(Transitions): +# def __init__(self, K, D, M=0, hidden_layer_sizes=(50,), nonlinearity="relu"): +# super(NeuralNetworkRecurrentTransitions, self).__init__(K, D, M=M) +# +# # Baseline transition probabilities +# Ps = .95 * np.eye(K) + .05 * npr.rand(K, K) +# Ps /= Ps.sum(axis=1, keepdims=True) +# self.log_Ps = np.log(Ps) +# +# # Initialize the NN weights +# layer_sizes = (D + M,) + hidden_layer_sizes + (K,) +# self.weights = [npr.randn(m, n) for m, n in zip(layer_sizes[:-1], layer_sizes[1:])] +# self.biases = [npr.randn(n) for n in layer_sizes[1:]] +# +# nonlinearities = dict( +# relu=relu, +# tanh=np.tanh, +# sigmoid=logistic) +# self.nonlinearity = nonlinearities[nonlinearity] +# +# @property +# def params(self): +# return self.log_Ps, self.weights, self.biases +# +# @params.setter +# def params(self, value): +# self.log_Ps, self.weights, self.biases = value +# +# def permute(self, perm): +# self.log_Ps = self.log_Ps[np.ix_(perm, perm)] +# self.weights[-1] = self.weights[-1][:,perm] +# self.biases[-1] = self.biases[-1][perm] +# +# def log_transition_matrices(self, data, input, mask, tag): +# # Pass the data and inputs through the neural network +# x = np.hstack((data[:-1], input[1:])) +# for W, b in zip(self.weights, self.biases): +# y = np.dot(x, W) + b +# x = self.nonlinearity(y) +# +# # Add the baseline transition biases +# log_Ps = self.log_Ps[None, :, :] + y[:, None, :] +# +# # Normalize +# return log_Ps - logsumexp(log_Ps, axis=2, keepdims=True) +# +# def m_step(self, expectations, datas, inputs, masks, tags, optimizer="adam", num_iters=100, **kwargs): +# # Default to adam instead of bfgs for the neural network model. +# Transitions.m_step(self, expectations, datas, inputs, masks, tags, +# optimizer=optimizer, num_iters=num_iters, **kwargs) +# +# +# class NegativeBinomialSemiMarkovTransitions(Transitions): +# """ +# Semi-Markov transition model with negative binomial (NB) distributed +# state durations, as compared to the geometric state durations in the +# standard Markov model. The negative binomial has higher variance than +# the geometric, but its mode can be greater than 1. +# +# The NB(r, p) distribution, with r a positive integer and p a probability +# in [0, 1], is this distribution over number of heads before seeing +# r tails where the probability of heads is p. The number of heads +# between each tails is an independent geometric random variable. Thus, +# the total number of heads is the sum of r independent and identically +# distributed geometric random variables. +# +# We can "embed" the semi-Markov model with negative binomial durations +# in the standard Markov model by expanding the state space. Map each +# discrete state k to r new states: (k,1), (k,2), ..., (k,r_k), +# for k in 1, ..., K. The total number of states is \sum_k r_k, +# where state k has a NB(r_k, p_k) duration distribution. +# +# The transition probabilities are as follows. The probability of staying +# within the same "super state" are: +# +# p(z_{t+1} = (k,i) | z_t = (k,i)) = p_k +# +# and for 0 <= j <= r_k - i +# +# p(z_{t+1} = (k,i+j) | z_t = (k,i)) = (1-p_k)^{j-i} p_k +# +# The probability of flipping (r_k - i + 1) tails in a row in state k; +# i.e. the probability of exiting super state k, is (1-p_k)^{r_k-i+1}. +# Thus, the probability of transitioning to a new super state is: +# +# p(z_{t+1} = (j,1) | z_t = (k,i)) = (1-p_k)^{r_k-i+1} * P[k, j] +# +# where P[k, j] is a transition matrix with zero diagonal. +# +# As a sanity check, note that the sum of probabilities is indeed 1: +# +# \sum_{j=i}^{r_k} p(z_{t+1} = (k,j) | z_t = (k,i)) +# + \sum_{m \neq k} p(z_{t+1} = (m, 1) | z_t = (k, i)) +# +# = \sum_{j=0}^{r_k-i} (1-p_k)^j p_k + \sum_{m \neq k} (1-p_k)^{r_k-i+1} * P[k, j] +# +# = p_k (1-(1-p_k)^{r_k-i+1}) / (1-(1-p_k)) + (1-p_k)^{r_k-i+1} +# +# = 1 - (1-p_k)^{r_k-i+1} + (1 - p_k)^{r_k-i+1} +# +# = 1. +# +# where we used the geometric series and the fact that \sum_{j != k} P[k, j] = 1. +# """ +# def __init__(self, K, D, M=0, r_min=1, r_max=20): +# assert K > 1, "Explicit duration models only work if num states > 1." +# super(NegativeBinomialSemiMarkovTransitions, self).__init__(K, D, M=M) +# +# # Initialize the super state transition probabilities +# self.Ps = npr.rand(K, K) +# np.fill_diagonal(self.Ps, 0) +# self.Ps /= self.Ps.sum(axis=1, keepdims=True) +# +# # Initialize the negative binomial duration probabilities +# self.r_min, self.r_max = r_min, r_max +# self.rs = npr.randint(r_min, r_max + 1, size=K) +# # self.rs = np.ones(K, dtype=int) +# # self.ps = npr.rand(K) +# self.ps = 0.5 * np.ones(K) +# +# # Initialize the transition matrix +# self._transition_matrix = None +# +# @property +# def params(self): +# return (self.Ps, self.rs, self.ps) +# +# @params.setter +# def params(self, value): +# Ps, rs, ps = value +# assert Ps.shape == (self.K, self.K) +# assert np.allclose(np.diag(Ps), 0) +# assert np.allclose(Ps.sum(1), 1) +# assert rs.shape == (self.K) +# assert rs.dtype == int +# assert np.all(rs > 0) +# assert ps.shape == (self.K) +# assert np.all(ps > 0) +# assert np.all(ps < 1) +# self.Ps, self.rs, self.ps = Ps, rs, ps +# +# # Reset the transition matrix +# self._transition_matrix = None +# +# def permute(self, perm): +# """ +# Permute the discrete latent states. +# """ +# self.Ps = self.Ps[np.ix_(perm, perm)] +# self.rs = self.rs[perm] +# self.ps = self.ps[perm] +# +# # Reset the transition matrix +# self._transition_matrix = None +# +# @property +# def total_num_states(self): +# return np.sum(self.rs) +# +# @property +# def state_map(self): +# return np.repeat(np.arange(self.K), self.rs) +# +# @property +# def transition_matrix(self): +# if self._transition_matrix is not None: +# return self._transition_matrix +# +# As, rs, ps = self.Ps, self.rs, self.ps +# +# # Fill in the transition matrix one block at a time +# K_total = self.total_num_states +# P = np.zeros((K_total, K_total)) +# starts = np.concatenate(([0], np.cumsum(rs)[:-1])) +# ends = np.cumsum(rs) +# for (i, j), Aij in np.ndenumerate(As): +# block = P[starts[i]:ends[i], starts[j]:ends[j]] +# +# # Diagonal blocks (stay in sub-state or advance to next sub-state) +# if i == j: +# for k in range(rs[i]): +# # p(z_{t+1} = (.,i+k) | z_t = (.,i)) = (1-p)^k p +# # for 0 <= k <= r - i +# block += (1 - ps[i])**k * ps[i] * np.diag(np.ones(rs[i]-k), k=k) +# +# # Off-diagonal blocks (exit to a new super state) +# else: +# # p(z_{t+1} = (j,1) | z_t = (k,i)) = (1-p_k)^{r_k-i+1} * A[k, j] +# block[:,0] = (1-ps[i]) ** np.arange(rs[i], 0, -1) * Aij +# +# assert np.allclose(P.sum(1),1) +# assert (0 <= P).all() and (P <= 1.).all() +# +# # Cache the transition matrix +# self._transition_matrix = P +# +# return P +# +# def log_transition_matrices(self, data, input, mask, tag): +# T = data.shape[0] +# P = self.transition_matrix +# return np.tile(np.log(P)[None, :, :], (T-1, 1, 1)) +# +# def m_step(self, expectations, datas, inputs, masks, tags, samples, **kwargs): +# # Update the transition matrix between super states +# P = sum([np.sum(Ezzp1, axis=0) for _, Ezzp1, _ in expectations]) + 1e-16 +# np.fill_diagonal(P, 0) +# P /= P.sum(axis=-1, keepdims=True) +# self.Ps = P +# +# # Fit negative binomial models for each duration based on sampled states +# states, durations = map(np.concatenate, zip(*[rle(z_smpl) for z_smpl in samples])) +# for k in range(self.K): +# self.rs[k], self.ps[k] = \ +# fit_negative_binomial_integer_r(durations[states == k], self.r_min, self.r_max) +# +# # Reset the transition matrix +# self._transition_matrix = None diff --git a/ssm/util.py b/ssm/util.py index 093b9cc6..aadca337 100644 --- a/ssm/util.py +++ b/ssm/util.py @@ -88,6 +88,11 @@ def random_rotation(n, theta=None): def ensure_args_are_lists(f): def wrapper(self, datas, inputs=None, masks=None, tags=None, **kwargs): + # print('inputs9', inputs) + # print('inputs9.shape', np.array(inputs).shape) + + # print('datas9.shape', np.array(datas).shape) + datas = [datas] if not isinstance(datas, (list, tuple)) else datas M = (self.M,) if isinstance(self.M, int) else self.M @@ -97,6 +102,9 @@ def wrapper(self, datas, inputs=None, masks=None, tags=None, **kwargs): inputs = [np.zeros((data.shape[0],) + M) for data in datas] elif not isinstance(inputs, (list, tuple)): inputs = [inputs] + # print('input12.shape', np.array(inputs).shape) + # print('input12', inputs) + if masks is None: masks = [np.ones_like(data, dtype=bool) for data in datas] @@ -107,12 +115,64 @@ def wrapper(self, datas, inputs=None, masks=None, tags=None, **kwargs): tags = [None] * len(datas) elif not isinstance(tags, (list, tuple)): tags = [tags] + # print('inputs10.shape', np.array(inputs).shape) + # print('datas10.shape', np.array(datas).shape) + # print('inputs10', inputs) return f(self, datas, inputs=inputs, masks=masks, tags=tags, **kwargs) return wrapper +def ensure_args_are_lists_modified(f): #zizi: zoe made this for HHM_TO + def wrapper(self, datas, transition_input=None, observation_input=None, masks=None, tags=None, **kwargs): + # observation_input=list(observation_input) + # print('observation_input9.shape', np.array(observation_input).shape) + # print('datas9.shape', np.array(datas).shape) + # print('transition_input9.shape', np.array(transition_input).shape) + # print('observation_input9', observation_input) + + datas = [datas] if not isinstance(datas, (list, tuple)) else datas + + M_obs = (self.M_obs,) if isinstance(self.M_obs, int) else self.M_obs + assert isinstance(M_obs, tuple) + + M_trans = (self.M_trans,) if isinstance(self.M_trans, int) else self.M_trans + assert isinstance(M_trans, tuple) + + if transition_input is None: + transition_input = [np.zeros((data.shape[0],) + M_trans) for data in datas] + elif not isinstance(transition_input, (list, tuple)): + transition_input = [transition_input] + + if observation_input is None: + observation_input = [np.zeros((data.shape[0],) + M_obs) for data in datas] + # print('observation_input11.shape', np.array(observation_input).shape) + elif not isinstance(observation_input, (list, tuple)): + observation_input = [observation_input] + # print('observation_input12.shape', np.array(observation_input).shape) + + if masks is None: + masks = [np.ones_like(data, dtype=bool) for data in datas] + elif not isinstance(masks, (list, tuple)): + masks = [masks] + + if tags is None: + tags = [None] * len(datas) + elif not isinstance(tags, (list, tuple)): + tags = [tags] + + # print('observation_input10.shape', np.array(observation_input).shape) + # print('data10.shape', np.array(datas).shape) + # print('transition_input10.shape', np.array(transition_input).shape) + # + # print('observation_input10.shape', observation_input) + + return f(self, datas, transition_input=transition_input, observation_input=observation_input, masks=masks, tags=tags, **kwargs) + + return wrapper + + def ensure_variational_args_are_lists(f): def wrapper(self, arg0, datas, inputs=None, masks=None, tags=None, **kwargs): datas = [datas] if not isinstance(datas, (list, tuple)) else datas @@ -158,6 +218,35 @@ def wrapper(self, data, input=None, mask=None, tag=None, **kwargs): return f(self, data, input=input, mask=mask, tag=tag, **kwargs) return wrapper +def ensure_args_not_none_modified(f): # zizi: this is because of hmm_TO + + def wrapper(self, data, transition_input=None, observation_input=None, mask=None, tag=None, **kwargs): + assert data is not None + + M_obs = (self.M_obs,) if isinstance(self.M_obs, int) else self.M_obs + assert isinstance(M_obs, tuple) + + M_trans = (self.M_trans,) if isinstance(self.M_trans, int) else self.M_trans + assert isinstance(M_trans, tuple) + + transition_input = np.zeros((data.shape[0],) + M) if transition_input is None else transition_input + observation_input = np.zeros((data.shape[0],) + M) if observation_input is None else observation_input + + # if transition_input is None: + # transition_input = [np.zeros((data.shape[0],) + M_trans) for data in datas] + # elif not isinstance(transition_input, (list, tuple)): + # transition_input = [transition_input] + # + # if observation_input is None: + # observation_input = [np.zeros((data.shape[0],) + M_obs) for data in datas] + # elif not isinstance(transition_input, (list, tuple)): + # observation_input = [observation_input] + + mask = np.ones_like(data, dtype=bool) if mask is None else mask + # print('input3=', input) + # print('input_type3=', type(input)) + return f(self, data, transition_input=transition_input, observation_input=observation_input, mask=mask, tag=tag, **kwargs) + return wrapper def ensure_slds_args_not_none(f): def wrapper(self, variational_mean, data, input=None, mask=None, tag=None, **kwargs): From f2df3a7e6d356ec9b64c4edcd418b87f10714229 Mon Sep 17 00:00:00 2001 From: Zeinab Date: Tue, 26 Dec 2023 16:51:42 -0500 Subject: [PATCH 04/41] github test --- ssm/hmm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ssm/hmm.py b/ssm/hmm.py index 57d08d2a..bfe06a94 100644 --- a/ssm/hmm.py +++ b/ssm/hmm.py @@ -20,7 +20,7 @@ __all__ = ['HMM', 'HSMM'] - +aaa class HMM(object): """ Base class for hidden Markov models. From 3ed0773e0a493f58b7987d4c4d721bfd05759366 Mon Sep 17 00:00:00 2001 From: Zeinab Date: Tue, 26 Dec 2023 17:02:10 -0500 Subject: [PATCH 05/41] reverse_github_test --- ssm/hmm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ssm/hmm.py b/ssm/hmm.py index bfe06a94..57d08d2a 100644 --- a/ssm/hmm.py +++ b/ssm/hmm.py @@ -20,7 +20,7 @@ __all__ = ['HMM', 'HSMM'] -aaa + class HMM(object): """ Base class for hidden Markov models. From 4e0a3d42358f00b85b66b6fc9d6e66af39a65a8e Mon Sep 17 00:00:00 2001 From: Zeinab Date: Tue, 26 Dec 2023 17:56:10 -0500 Subject: [PATCH 06/41] init_file_finished --- ssm/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ssm/__init__.py b/ssm/__init__.py index f2f58de5..eb52d12d 100644 --- a/ssm/__init__.py +++ b/ssm/__init__.py @@ -1,5 +1,4 @@ # Default imports for SSM -from .hmm_TO import * #All the functions and constants can be imported using * from .hmm import * from .lds import * \ No newline at end of file From e893d6962ad5765743c83f505a85188bf168dec2 Mon Sep 17 00:00:00 2001 From: Zeinab Date: Wed, 27 Dec 2023 14:19:14 -0500 Subject: [PATCH 07/41] editting hmm file --- .idea/workspace.xml | 44 ++++++++++++++++++++++++++++++++++++++++++++ ssm/hmm.py | 3 ++- 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 .idea/workspace.xml diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 00000000..4f42f6b0 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1702336081338 + + + + \ No newline at end of file diff --git a/ssm/hmm.py b/ssm/hmm.py index 57d08d2a..cda9d136 100644 --- a/ssm/hmm.py +++ b/ssm/hmm.py @@ -28,7 +28,8 @@ class HMM(object): Notation: K: number of discrete latent states D: dimensionality of observations - M: dimensionality of inputs + M_obs: dimensionality of observation inputs + M_trans: dimensionality of transition inputs In the code we will sometimes refer to the discrete latent state sequence as z and the data as x. From c0951381f39904b5ae312b1b16ebadb6891d1f0b Mon Sep 17 00:00:00 2001 From: Zeinab Date: Thu, 28 Dec 2023 15:58:17 -0500 Subject: [PATCH 08/41] Editing files for pull request --- .idea/workspace.xml | 6 + ssm/hmm.py | 441 ++++-- ssm/init_state_distns.py | 4 - ssm/messages.py | 3 +- ssm/observations.py | 2734 +------------------------------------- ssm/transitions.py | 1323 +----------------- ssm/util.py | 41 +- 7 files changed, 415 insertions(+), 4137 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 4f42f6b0..fc31e544 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,13 @@ + + + + + +