File size: 60,676 Bytes
2829e3a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Mz7n1DKlNfDZ"
      },
      "source": [
        "# Bike Rides and the Poisson Model\n",
        "\n",
        "To help the urban planners, you are called to model the daily bike rides in NYC using [this dataset](https://gist.github.com/sachinsdate/c17931a3f000492c1c42cf78bf4ce9fe/archive/7a5131d3f02575668b3c7e8c146b6a285acd2cd7.zip).  The dataset contains date, day of the week, high and low temp, precipitation and bike ride couunts as columns. \n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "fB-BnQuhNfDc"
      },
      "source": [
        "## Maximum Likelihood I \n",
        " \n",
        "The obvious choice in distributions is the [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution) which depends only on one parameter, λ, which is the average number of occurrences per interval. We want to estimate this parameter using Maximum Likelihood Estimation.\n",
        "\n",
        "Implement a Gradient Descent algorithm from scratch that will estimate the Poisson distribution according to the Maximum Likelihood criterion. Plot the estimated mean vs iterations to showcase convergence towards the true mean. \n",
        "\n",
        "References: \n",
        "\n",
        "1. [This blog post](https://towardsdatascience.com/the-poisson-process-everything-you-need-to-know-322aa0ab9e9a). \n",
        "\n",
        "2. [This blog post](https://towardsdatascience.com/understanding-maximum-likelihood-estimation-fa495a03017a) and note the negative  log likelihood function.  \n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 285,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 766
        },
        "id": "LAz1foK9NfDd",
        "outputId": "1034c2ad-6856-46d3-bfc5-7915646979b4"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "lambda* from gradient descent :  2680.0420560747625\n",
            "Log Likelyhood for Lambda* :  3952001.7180423485\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1440x720 with 4 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import scipy\n",
        "from scipy.stats import poisson\n",
        "\n",
        "\n",
        "#estimationg for mu using maximum log likelihood derivation, from reference 2\n",
        "def getMu(x):\n",
        "  sigX=0\n",
        "  n=0\n",
        "  for i in x:\n",
        "    sigX+=i\n",
        "    n+=1\n",
        "  return sigX/n\n",
        "\n",
        "#factorial function\n",
        "def factorial(x):\n",
        "  sum=0\n",
        "  for i in range(x):\n",
        "    sum+=i\n",
        "  return sum\n",
        "\n",
        "#calculates log likelihood\n",
        "def LLK(X, mu):\n",
        "  llk=0\n",
        "  for x in X:\n",
        "    llk+=np.log(mu)*x-mu-np.log((x))\n",
        "  return llk\n",
        "\n",
        "#calculates the partial derivitave of the log likelihood function with respect to lambda (LOSS FUNCTION)\n",
        "def LLK_Gradient(X,mu):\n",
        "  sum=0;\n",
        "  n=0\n",
        "  for x in X:\n",
        "    sum+=x\n",
        "    n+=1\n",
        "  return (1/mu)*sum-n\n",
        "\n",
        "#iterative method for finding lambda*\n",
        "def iterative(X):\n",
        "  llks=[]\n",
        "  mus=[]\n",
        "  for i in range(X.min(),X.max(),4):\n",
        "    llks.append(LLK(X,i))\n",
        "    mus.append(i)\n",
        "  return mus,llks\n",
        "\n",
        "#Gradient descent for finding lambda*\n",
        "def GradDesc(X,eta,iter):\n",
        "  iteration=[]\n",
        "  mu_set=[]\n",
        "  mu=np.random.randint(X.min(),X.max())\n",
        "  for i in range(iter):\n",
        "    iteration.append(i)\n",
        "    mu_set.append(mu)\n",
        "    #print(LLK_Gradient(X,mu))\n",
        "    mu=mu+eta*LLK_Gradient(X,mu)\n",
        "  return mu, mu_set,iteration\n",
        "\n",
        "\n",
        "\n",
        "\n",
        "data=pd.read_csv(\"./nyc_bb_bicyclist_counts.csv\")\n",
        "bb_count=data.loc[:,\"BB_COUNT\"].values\n",
        "\n",
        "\n",
        "\n",
        "\n",
        "\n",
        "\n",
        "#print(iterative(bb_count))\n",
        "lam, lam_set,iteration=GradDesc(bb_count,0.7,1000)\n",
        "lamLLK_set=[]\n",
        "for mu in lam_set:\n",
        "  lamLLK_set.append(LLK(bb_count,mu))\n",
        "\n",
        "simulated=[]\n",
        "for i in range(len(bb_count)):\n",
        "  simulated.append(np.random.poisson(lam))\n",
        "\n",
        "mu_set, muLLK_set=iterative(bb_count)\n",
        "\n",
        "print(\"lambda* from gradient descent : \",lam)\n",
        "print(\"Log Likelyhood for Lambda* : \",(LLK(bb_count,getMu(bb_count))))\n",
        "\n",
        "fig, axis= plt.subplots(1, 4, figsize=(20, 10))\n",
        "\n",
        "axis[0].hist(bb_count,20)\n",
        "axis[0].set_title(\"Actual Biker Dataset\")\n",
        "axis[0].set_xlabel(\"Number of Bikers\")\n",
        "axis[0].set_ylabel(\"Number of Days\")\n",
        "\n",
        "axis[1].hist(simulated,20)\n",
        "axis[1].set_title(\"Simulated Dataset using Lambda*\")\n",
        "axis[1].set_xlabel(\"Number of Bikers\")\n",
        "axis[1].set_ylabel(\"Number of Days\")\n",
        "\n",
        "axis[2].scatter(lam_set,lamLLK_set)\n",
        "axis[2].set_title(\"Lambda vs Log Likelihood Gradient Descent\")\n",
        "axis[2].set_xlabel(\"Lambda\")\n",
        "axis[2].set_ylabel(\"Log Likelyhood (in millions)\")\n",
        "\n",
        "axis[3].scatter(iteration,lam_set)\n",
        "axis[3].set_title(\"Lamda over iterations\")\n",
        "axis[3].set_xlabel(\"iteration\")\n",
        "axis[3].set_ylabel(\"lamda\")\n",
        "\n",
        "fig.tight_layout()\n",
        "\n",
        "\n",
        " \n",
        "plt.show()\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "The first figure on the left is a histogram of the provided dataset. The second fingure, second from left, shows a simulated dataset using 𝝺* calculated from the gradient descent, and numpy.random.poisson(). The second figure has less outliers, and forms a more uniform distrobution, but maintains a similar shape to the acutal dataset. \n",
        "\n",
        "The 3rd figure, second from the right, is a scatter plot showing the different log-likelihoods for all lambdas genorated during the gradient descent. The first lambda used is the lowest point on the graph, and all subsequent points move towards the true mean, 𝝺*, and gradually increase in log likelihood. The final point with the highest log likelihood is close to 𝝺*, with approximatly the maximum log likelihood.\n",
        " The rightmost figure is another scatterplot which shows the progression of lamda over the iterations of the gradient descent. The values for lamda converger quickly to the approximate value of 𝝺*."
      ],
      "metadata": {
        "id": "7WZ8JQgwAUnS"
      }
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "fbhG8Vs9NfDe"
      },
      "source": [
        "## Maximum Likelihood II\n",
        "\n",
        "A colleague of yours suggest that the parameter $\\lambda$ must be itself dependent on the weather and other factors since people bike when its not raining. Assume that you model $\\lambda$ as \n",
        "\n",
        "$$\\lambda_i = \\exp(\\mathbf w^T \\mathbf x_i)$$\n",
        "\n",
        "where $\\mathbf x_i$ is one of the example features and $\\mathbf w$ is a set of parameters. \n",
        "\n",
        "Train the model with SGD with this assumption and compare the MSE of the predictions with the `Maximum Likelihood I` approach. \n",
        "\n",
        "You may want to use [this partial derivative of the log likelihood function](http://home.cc.umanitoba.ca/~godwinrt/7010/poissonregression.pdf)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 422,
      "metadata": {
        "id": "FoWbZHpfNfDe",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "4c5b26b9-1484-48ed-f4b9-52f077427b64"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mean squared error for method 1:  692017.6584942794\n",
            "Mean squared error for method 2:  3000035.1120429407\n"
          ]
        }
      ],
      "source": [
        "from numpy.core.multiarray import dot\n",
        "data=pd.read_csv(\"./nyc_bb_bicyclist_counts.csv\")\n",
        "y=data.loc[:,\"BB_COUNT\"].values\n",
        "precip=data.loc[:,\"PRECIP\"].values\n",
        "high=data.loc[:,\"HIGH_T\"].values\n",
        "low=data.loc[:,\"LOW_T\"].values\n",
        "m=len(y)\n",
        "\n",
        "n_epochs=500\n",
        "np.random.seed(42)\n",
        "\n",
        "def makeX(precip,high,low,size):\n",
        "  X=[]\n",
        "  for i in range(size):\n",
        "    X.append([precip[i],high[i]/100,low[i]/100])\n",
        "  return np.array(X)\n",
        "\n",
        "\n",
        "X=makeX(precip,high,low,m)\n",
        "\n",
        "w=[1,1,1]\n",
        "\n",
        "#def getGrads(X,y,w,m):\n",
        "#  gradients=[0]\n",
        "#  for i in range(m):\n",
        "#    gradients=gradients+(y[i]-np.exp(w @ X[i].T))*X[i]\n",
        "#  return gradients\n",
        "\n",
        "for epoch in range(n_epochs):\n",
        "  for iteration in range(m):\n",
        "    random_index=np.random.randint(m)\n",
        "    xi=X[random_index:random_index+1]\n",
        "    yi=y[random_index:random_index+1]\n",
        "    #print(yi,xi,w, \"yi-xi-w\")\n",
        "    #print(np.dot(w,xi.T),\"wTx\")\n",
        "    #print(np.exp(np.dot(w,xi.T)), \"yhat\")\n",
        "    gradients=(yi-np.exp(np.dot(w,xi.T)))*xi\n",
        "    #gradients=getGrads(X,y,w,m)\n",
        "    #print(gradients,\"gradient\")\n",
        "    eta=8*10**-5\n",
        "    w=w+eta*gradients\n",
        "    #print(w,\"new w\")\n",
        "\n",
        "#print(w)\n",
        "\n",
        "lamdas=[]\n",
        "for i in range(m):\n",
        "  lamdas.append(np.exp(np.dot(w,X[i])))\n",
        "  #print(lamdas[i][0],y[i])\n",
        "\n",
        "\n",
        "\n",
        "MSELLK1 = 0\n",
        "MSELLK2 = 0\n",
        "for i in range(m):\n",
        "  MSELLK1+=(lam_set[i]-y[i])**2\n",
        "  MSELLK2+=(lamdas[i][0]-y[i])**2\n",
        "MSELLK1=MSELLK1/m\n",
        "MSELLK2=MSELLK2/m\n",
        "\n",
        "print(\"Mean squared error for method 1: \",MSELLK1)\n",
        "print(\"Mean squared error for method 2: \",MSELLK2)"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "The mean squared error is much lower in the first method than the second one. Furthermore, the mean squared error is noticable very high in lambda set using the second method. This could be indicitave of a flaw in the GDS algorithm which optimizes our parameter set, w. It could also indicated that the weather has very little effect on the number of cyclists crossing the bridge. I beleive that the former is the case, and specifically that the gradient function is not working correctly. "
      ],
      "metadata": {
        "id": "fthnVmfDh_2R"
      }
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.10.9"
    },
    "orig_nbformat": 4,
    "vscode": {
      "interpreter": {
        "hash": "7d6993cb2f9ce9a59d5d7380609d9cb5192a9dedd2735a011418ad9e827eb538"
      }
    },
    "colab": {
      "provenance": []
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}