]> git.armaanb.net Git - python_dp.git/blob - exponential_mechanism.ipynb
Initial commit
[python_dp.git] / exponential_mechanism.ipynb
1 {
2  "cells": [
3   {
4    "cell_type": "markdown",
5    "id": "6b9078e7",
6    "metadata": {},
7    "source": [
8     "# Exponential mechanism DP\n",
9     "\n",
10     "By [Armaan Bhojwani](https://armaanb.net) under [Praneeth Vepakomma](https://praneeth.mit.edu/)\n",
11     "\n",
12     "This notebook features the following differentially private operations on a finite set:\n",
13     "- Exponential mechanism\n",
14     "    - Choice\n",
15     "\n",
16     "### Dependencies\n",
17     "- tqdm\n",
18     "- matplotlib\n",
19     "\n",
20     "### Status\n",
21     "- Complete\n",
22     "\n",
23     "### References\n",
24     "- https://programming-dp.com/ch9.html"
25    ]
26   },
27   {
28    "cell_type": "markdown",
29    "id": "f961bc8f",
30    "metadata": {},
31    "source": [
32     "## Choosing the best country to hold a conference in\n",
33     "You are tasked with hosting a conference on nuclear disarmarment in, ideally, the country with the most nuclear weapons. The catch is you can't reveal which country has the most nukes. In this example, the input database is a 2x196 table with 196 countries in the first column and a triangularly distributed number of theoretical nukes in the second."
34    ]
35   },
36   {
37    "cell_type": "markdown",
38    "id": "84841604",
39    "metadata": {},
40    "source": [
41     "### Parameters\n",
42     "\n",
43     "Epsilon is the privacy-accuracy trade-off\n",
44     "\n",
45     "Sensitivity is 1 as we are essentially performing a max query on the privatized probabilities we create"
46    ]
47   },
48   {
49    "cell_type": "code",
50    "execution_count": 1,
51    "id": "c18e3ee5",
52    "metadata": {},
53    "outputs": [],
54    "source": [
55     "# Privacy\n",
56     "epsilon = 5\n",
57     "sensitivity = 1\n",
58     "\n",
59     "# Data\n",
60     "nukes_low = 0       # Minimum number of nukes a country can have\n",
61     "nukes_high = 10000  # Maximum number of nukes a country can have\n",
62     "\n",
63     "# Analysis\n",
64     "max_epsilon = 10     # Largest epsilon value to test\n",
65     "epsilon_step = 0.25   # Step size between epsilons\n",
66     "num_samples = 20000  # Number of times to run lim x->inf functions"
67    ]
68   },
69   {
70    "cell_type": "markdown",
71    "id": "38fc1651",
72    "metadata": {},
73    "source": [
74     "### Build the dataset"
75    ]
76   },
77   {
78    "cell_type": "code",
79    "execution_count": 2,
80    "id": "bb8b815b",
81    "metadata": {
82     "scrolled": true
83    },
84    "outputs": [
85     {
86      "name": "stdout",
87      "output_type": "stream",
88      "text": [
89       "Top 25 countries with the most nukes (non-private):\n",
90       " 1: ('Czech Republic', 9547)\n",
91       " 2: ('Dominica', 9377)\n",
92       " 3: ('Brunei', 9323)\n",
93       " 4: ('Andorra', 8885)\n",
94       " 5: ('Saint Vincent and the Grenadines', 8851)\n",
95       " 6: ('Bangladesh', 8603)\n",
96       " 7: ('Djibouti', 8437)\n",
97       " 8: ('Bhutan', 8131)\n",
98       " 9: ('Dominican Republic', 8119)\n",
99       "10: ('Japan', 8048)\n",
100       "11: ('Malta', 7912)\n",
101       "12: ('Lebanon', 7905)\n",
102       "13: ('Bulgaria', 7903)\n",
103       "14: ('Slovakia', 7850)\n",
104       "15: ('Belgium', 7694)\n",
105       "16: ('Honduras', 7677)\n",
106       "17: ('Cuba', 7598)\n",
107       "18: ('Saudi Arabia', 7534)\n",
108       "19: ('Equatorial Guinea', 7496)\n",
109       "20: ('United States of America', 7461)\n",
110       "21: ('New Zealand', 7398)\n",
111       "22: ('Turkmenistan', 7396)\n",
112       "23: ('Pakistan', 7348)\n",
113       "24: ('Somalia', 7288)\n",
114       "25: ('Monaco', 7267)\n"
115      ]
116     }
117    ],
118    "source": [
119     "import numpy as np\n",
120     "\n",
121     "rng = np.random.default_rng()\n",
122     "\n",
123     "countries = np.loadtxt(\"./Data/countries.txt\", dtype='str')\n",
124     "countries = [y.replace('_', ' ') for y in countries]\n",
125     "nukes_avg = (nukes_low + nukes_high) / 2\n",
126     "nukes = rng.triangular(nukes_low,\n",
127     "                       nukes_avg,\n",
128     "                       nukes_high,\n",
129     "                       size=np.shape(countries))\n",
130     "nukes = [round(y) for y in nukes]\n",
131     "\n",
132     "x = list(zip(countries, nukes))\n",
133     "x.sort(key=lambda tup: tup[1], reverse=True)\n",
134     "\n",
135     "print(\"Top 25 countries with the most nukes (non-private):\")\n",
136     "for i, y in enumerate(x[:25]):\n",
137     "    print(f\"{1 + i:2}: {y}\")"
138    ]
139   },
140   {
141    "cell_type": "markdown",
142    "id": "22e2bf56",
143    "metadata": {},
144    "source": [
145     "### Apply exponential model"
146    ]
147   },
148   {
149    "cell_type": "code",
150    "execution_count": 3,
151    "id": "58ba906b",
152    "metadata": {},
153    "outputs": [
154     {
155      "name": "stdout",
156      "output_type": "stream",
157      "text": [
158       "Using epsilon 5, the algorithm chose Turkmenistan, which is the number 22 best choice.\n"
159      ]
160     }
161    ],
162    "source": [
163     "def exponential_mech(nukes, nukes_high, epsilon):\n",
164     "    # Create list of privatized probabilities for each country\n",
165     "    nukesX = [4 * i / nukes_high for i in nukes]\n",
166     "    nukesX = [np.exp(epsilon * i / (2 * sensitivity)) for i in nukesX]\n",
167     "    nukesProb = nukesX / np.linalg.norm(nukesX, ord=1)\n",
168     "\n",
169     "    # Pick a country according to the privatized probabilities\n",
170     "    choice = rng.choice(countries, 1, p=nukesProb)[0]\n",
171     "    place = [y[0] for y in x].index(choice) + 1\n",
172     "    \n",
173     "    return choice, place\n",
174     "\n",
175     "choice, place = exponential_mech(nukes, nukes_high, epsilon)\n",
176     "\n",
177     "print(f\"Using epsilon {epsilon}, the algorithm chose {choice}, which is the \" +\n",
178     "          f\"number {place} best choice.\")"
179    ]
180   },
181   {
182    "cell_type": "markdown",
183    "id": "3f0a0af7",
184    "metadata": {},
185    "source": [
186     "### Analysis"
187    ]
188   },
189   {
190    "cell_type": "code",
191    "execution_count": 4,
192    "id": "e09e3c58",
193    "metadata": {},
194    "outputs": [
195     {
196      "data": {
197       "application/vnd.jupyter.widget-view+json": {
198        "model_id": "0fe00cb9502543f59894a5c989feddde",
199        "version_major": 2,
200        "version_minor": 0
201       },
202       "text/plain": [
203        "  0%|          | 0/39 [00:00<?, ?it/s]"
204       ]
205      },
206      "metadata": {},
207      "output_type": "display_data"
208     }
209    ],
210    "source": [
211     "from common import get_epsilons\n",
212     "from tqdm.notebook import tqdm\n",
213     "\n",
214     "epsilons = get_epsilons(max_epsilon, epsilon_step)\n",
215     "\n",
216     "data = []\n",
217     "for epsilon in tqdm(epsilons):\n",
218     "    epsilon_data = []\n",
219     "    for j in range(num_samples):\n",
220     "        _, place = exponential_mech(nukes, nukes_high, epsilon)\n",
221     "        \n",
222     "        epsilon_data.append(place)\n",
223     "    data.append(np.mean(epsilon_data))"
224    ]
225   },
226   {
227    "cell_type": "markdown",
228    "id": "9f93a11a",
229    "metadata": {},
230    "source": [
231     "### Plotting"
232    ]
233   },
234   {
235    "cell_type": "code",
236    "execution_count": 5,
237    "id": "eb014efc",
238    "metadata": {
239     "scrolled": false
240    },
241    "outputs": [
242     {
243      "data": {
244       "image/png": "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",
245       "text/plain": [
246        "<Figure size 640x480 with 1 Axes>"
247       ]
248      },
249      "metadata": {},
250      "output_type": "display_data"
251     }
252    ],
253    "source": [
254     "import matplotlib.pyplot as plt\n",
255     "\n",
256     "plt.plot(epsilons, data)\n",
257     "plt.xlabel(\"Epsilon\")\n",
258     "plt.ylabel(\"Mean distance from ideal choice\")\n",
259     "plt.title(\"Effect of epsilon on privacy\")\n",
260     "plt.show()"
261    ]
262   }
263  ],
264  "metadata": {
265   "kernelspec": {
266    "display_name": "Python 3 (ipykernel)",
267    "language": "python",
268    "name": "python3"
269   },
270   "language_info": {
271    "codemirror_mode": {
272     "name": "ipython",
273     "version": 3
274    },
275    "file_extension": ".py",
276    "mimetype": "text/x-python",
277    "name": "python",
278    "nbconvert_exporter": "python",
279    "pygments_lexer": "ipython3",
280    "version": "3.9.7"
281   }
282  },
283  "nbformat": 4,
284  "nbformat_minor": 5
285 }