664 lines
57 KiB
Plaintext
664 lines
57 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Properties of Differential Privacy"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"```{admonition} Learning Objectives\n",
|
|
"After reading this chapter, you will be able to:\n",
|
|
"- Explain the concepts of sequential composition, parallel composition, and post processing\n",
|
|
"- Calculate the cumulative privacy cost of multiple applications of a differential privacy mechanism\n",
|
|
"- Determine when the use of parallel composition is allowed\n",
|
|
"```\n",
|
|
"\n",
|
|
"This chapter describes three important properties of differentially private mechanisms that arise from the definition of differential privacy. These properties will help us to design useful algorithms that satisfy differential privacy, and ensure that those algorithms provide accurate answers. The three properties are:\n",
|
|
"\n",
|
|
"- Sequential composition\n",
|
|
"- Parallel composition\n",
|
|
"- Post processing"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {
|
|
"tags": [
|
|
"remove-cell"
|
|
]
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import pandas as pd\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"plt.style.use('seaborn-whitegrid')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Sequential Composition\n",
|
|
"\n",
|
|
"The first major property of differential privacy is *sequential composition* {cite}`dwork2006B,dwork2006`, which bounds the total privacy cost of releasing multiple results of differentially private mechanisms on the same input data. Formally, the sequential composition theorem for differential privacy says that:\n",
|
|
"\n",
|
|
"- If $F_1(x)$ satisfies $\\epsilon_1$-differential privacy\n",
|
|
"- And $F_2(x)$ satisfies $\\epsilon_2$-differential privacy\n",
|
|
"- Then the mechanism $G(x) = (F_1(x), F_2(x))$ which releases both results satisfies $\\epsilon_1+\\epsilon_2$-differential privacy\n",
|
|
"\n",
|
|
"Sequential composition is a vital property of differential privacy because it enables the design of algorithms that consult the data more than once. Sequential composition is also important when multiple separate analyses are performed on a single dataset, since it allows individuals to bound the *total* privacy cost they incur by participating in all of these analyses.\n",
|
|
"The bound on privacy cost given by sequential composition is an *upper* bound - the actual privacy cost of two particular differentially private releases may be smaller than this, but never larger.\n",
|
|
"\n",
|
|
"The principle that the $\\epsilon$s \"add up\" makes sense if we examine the distribution of outputs from a mechanism which averages two differentially private results together. Let's look at some examples."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"epsilon1 = 1\n",
|
|
"epsilon2 = 1\n",
|
|
"epsilon_total = 2\n",
|
|
"\n",
|
|
"# satisfies 1-differential privacy\n",
|
|
"def F1():\n",
|
|
" return np.random.laplace(loc=0, scale=1/epsilon1)\n",
|
|
"\n",
|
|
"# satisfies 1-differential privacy\n",
|
|
"def F2():\n",
|
|
" return np.random.laplace(loc=0, scale=1/epsilon2)\n",
|
|
"\n",
|
|
"# satisfies 2-differential privacy\n",
|
|
"def F3():\n",
|
|
" return np.random.laplace(loc=0, scale=1/epsilon_total)\n",
|
|
"\n",
|
|
"# satisfies 2-differential privacy, by sequential composition\n",
|
|
"def F_combined():\n",
|
|
" return (F1() + F2()) / 2"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"If we graph `F1` and `F2`, we see that the distributions of their outputs look pretty similar."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {
|
|
"tags": [
|
|
"hide-input"
|
|
]
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# plot F1\n",
|
|
"plt.hist([F1() for i in range(1000)], bins=50, label='F1');\n",
|
|
"\n",
|
|
"# plot F2 (should look the same)\n",
|
|
"plt.hist([F2() for i in range(1000)], bins=50, alpha=.7, label='F2');\n",
|
|
"plt.legend();"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"If we graph `F1` and `F3`, we see that the distribution of outputs from `F3` looks \"pointier\" than that of `F1`, because its higher $\\epsilon$ implies less privacy, and therefore a smaller likelihood of getting results far from the true answer."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {
|
|
"tags": [
|
|
"hide-input"
|
|
]
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# plot F1\n",
|
|
"plt.hist([F1() for i in range(1000)], bins=50, label='F1');\n",
|
|
"\n",
|
|
"# plot F3 (should look \"pointier\")\n",
|
|
"plt.hist([F3() for i in range(1000)], bins=50, alpha=.7, label='F3');\n",
|
|
"plt.legend();"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"If we graph `F1` and `F_combined`, we see that the distribution of outputs from `F_combined` is pointier. This means its answers are more accurate than those of `F1`, so it makes sense that its $\\epsilon$ must be higher (i.e. it yields less privacy than `F1`)."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {
|
|
"tags": [
|
|
"hide-input"
|
|
]
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# plot F1\n",
|
|
"plt.hist([F1() for i in range(1000)], bins=50, label='F1');\n",
|
|
"\n",
|
|
"# plot F_combined (should look \"pointier\")\n",
|
|
"plt.hist([F_combined() for i in range(1000)], bins=50, alpha=.7, label='F_combined');\n",
|
|
"plt.legend();"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"What about `F3` and `F_combined`? Recall that the $\\epsilon$ values for these two mechanisms are the same - both have an $\\epsilon$ of 2. Their output distributions should look the same."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {
|
|
"tags": [
|
|
"hide-input"
|
|
]
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# plot F1\n",
|
|
"plt.hist([F3() for i in range(1000)], bins=50, label='F3');\n",
|
|
"\n",
|
|
"# plot F_combined (should look \"pointier\")\n",
|
|
"plt.hist([F_combined() for i in range(1000)], bins=50, alpha=.7, label='F_combined');\n",
|
|
"plt.legend();"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"In fact, `F3` looks \"pointier\"! Why does this happen? Remember that sequential composition yields an *upper* bound on the total $\\epsilon$ of several releases, the actual cumulative impact on privacy might be lower. That's the case here - the actual privacy loss in this case appears to be somewhat lower than the upper bound $\\epsilon$ determined by sequential composition. Sequential composition is an extremely useful way to control total privacy cost, and we will see it used in many different ways, but keep in mind that it is not necessarily an exact bound."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Parallel Composition\n",
|
|
"\n",
|
|
"The second important property of differential privacy is called *parallel composition* {cite}`mcsherry2009`. Parallel composition can be seen as an alternative to sequential composition - a second way to calculate a bound on the total privacy cost of multiple data releases. Parallel composition is based on the idea of splitting your dataset into disjoint chunks and running a differentially private mechanism on each chunk separately. Since the chunks are disjoint, each individual's data appears in *exactly* one chunk - so even if there are $k$ chunks in total (and therefore $k$ runs of the mechanism), the mechanism runs exactly once on the data of each *individual*. Formally,\n",
|
|
"\n",
|
|
" - If $F(x)$ satisfies $\\epsilon$-differential privacy\n",
|
|
" - And we split a dataset $X$ into $k$ disjoint chunks such that $x_1 \\cup ... \\cup x_k = X$\n",
|
|
" - Then the mechanism which releases all of the results $F(x_1), ..., F(x_k)$ satisfies $\\epsilon$-differential privacy\n",
|
|
" \n",
|
|
"Note that this is a much better bound than sequential composition would give. Since we run $F$ $k$ times, sequential composition would say that this procedure satisfies $k\\epsilon$-differential privacy. Parallel composition allows us to say that the total privacy cost is just $\\epsilon$.\n",
|
|
"\n",
|
|
"The formal definition matches up with our intuition - if each participant in the dataset contributes one row to $X$, then this row will appear in *exactly* one of the chunks $x_1, ..., x_k$. That means $F$ will only \"see\" this participant's data *one time*, meaning a privacy cost of $\\epsilon$ is appropriate for that individual. Since this property holds for all individuals, the privacy cost is $\\epsilon$ for everyone."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Histograms\n",
|
|
"\n",
|
|
"In our context, a *histogram* is an analysis of a dataset which splits the dataset into \"bins\" based on the value of one of the data attributes, and counts the number of rows in each bin. For example, a histogram might count the number of people in the dataset who achieved a particular educational level."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"metadata": {
|
|
"tags": [
|
|
"hide-input"
|
|
]
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>Education</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>HS-grad</th>\n",
|
|
" <td>10501</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>Some-college</th>\n",
|
|
" <td>7291</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>Bachelors</th>\n",
|
|
" <td>5355</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>Masters</th>\n",
|
|
" <td>1723</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>Assoc-voc</th>\n",
|
|
" <td>1382</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" Education\n",
|
|
"HS-grad 10501\n",
|
|
"Some-college 7291\n",
|
|
"Bachelors 5355\n",
|
|
"Masters 1723\n",
|
|
"Assoc-voc 1382"
|
|
]
|
|
},
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"adult = pd.read_csv(\"adult_with_pii.csv\")\n",
|
|
"adult['Education'].value_counts().to_frame().head(5)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Histograms are particularly interesting for differential privacy because they automatically satisfy parallel composition. Each \"bin\" in a histogram is defined by a possible value for a data attribute (for example, `'Education' == 'HS-grad'`). It's impossible for a single row to have *two* values for an attribute simultaneously, so defining the bins this way *guarantees* that they will be disjoint. Thus we have satisfied the requirements for parallel composition, and we can use a differentially private mechanism to release *all* of the bin counts with a total privacy cost of just $\\epsilon$."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 19,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>Education</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>HS-grad</th>\n",
|
|
" <td>10500.351353</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>Some-college</th>\n",
|
|
" <td>7291.651159</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>Bachelors</th>\n",
|
|
" <td>5354.108264</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>Masters</th>\n",
|
|
" <td>1721.048317</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>Assoc-voc</th>\n",
|
|
" <td>1380.405573</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" Education\n",
|
|
"HS-grad 10500.351353\n",
|
|
"Some-college 7291.651159\n",
|
|
"Bachelors 5354.108264\n",
|
|
"Masters 1721.048317\n",
|
|
"Assoc-voc 1380.405573"
|
|
]
|
|
},
|
|
"execution_count": 19,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"epsilon = 1\n",
|
|
"\n",
|
|
"# This analysis has a total privacy cost of epsilon = 1, even though we release many results!\n",
|
|
"f = lambda x: x + np.random.laplace(loc=0, scale=1/epsilon)\n",
|
|
"s = adult['Education'].value_counts().apply(f)\n",
|
|
"s.to_frame().head(5)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Contingency Tables\n",
|
|
"\n",
|
|
"A *contingency table* or *cross tabulation* (often shortened to *crosstab*) is like a multi-dimensional histogram. It counts the frequency of rows in the dataset with particular values for more than one attribute at a time. Contingency tables are frequently used to show the relationship between two variables when analyzing data. For example, we might want to see counts based on both education level and gender:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 17,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th>Sex</th>\n",
|
|
" <th>Female</th>\n",
|
|
" <th>Male</th>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>Education</th>\n",
|
|
" <th></th>\n",
|
|
" <th></th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>10th</th>\n",
|
|
" <td>295</td>\n",
|
|
" <td>638</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>11th</th>\n",
|
|
" <td>432</td>\n",
|
|
" <td>743</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>12th</th>\n",
|
|
" <td>144</td>\n",
|
|
" <td>289</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1st-4th</th>\n",
|
|
" <td>46</td>\n",
|
|
" <td>122</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5th-6th</th>\n",
|
|
" <td>84</td>\n",
|
|
" <td>249</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
"Sex Female Male\n",
|
|
"Education \n",
|
|
"10th 295 638\n",
|
|
"11th 432 743\n",
|
|
"12th 144 289\n",
|
|
"1st-4th 46 122\n",
|
|
"5th-6th 84 249"
|
|
]
|
|
},
|
|
"execution_count": 17,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"pd.crosstab(adult['Education'], adult['Sex']).head(5)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Like the histogram we saw earlier, each individual in the dataset participates in exactly *one* count appearing in this table. It's impossible for any single row to have multiple values simultaneously, for any set of data attributes considered in building the contingency table. As a result, it's safe to use parallel composition here, too."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 20,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th>Sex</th>\n",
|
|
" <th>Female</th>\n",
|
|
" <th>Male</th>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>Education</th>\n",
|
|
" <th></th>\n",
|
|
" <th></th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>10th</th>\n",
|
|
" <td>297.758459</td>\n",
|
|
" <td>638.617751</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>11th</th>\n",
|
|
" <td>433.029825</td>\n",
|
|
" <td>743.426772</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>12th</th>\n",
|
|
" <td>144.846308</td>\n",
|
|
" <td>288.532753</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1st-4th</th>\n",
|
|
" <td>46.809439</td>\n",
|
|
" <td>123.217421</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5th-6th</th>\n",
|
|
" <td>84.838273</td>\n",
|
|
" <td>247.778789</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
"Sex Female Male\n",
|
|
"Education \n",
|
|
"10th 297.758459 638.617751\n",
|
|
"11th 433.029825 743.426772\n",
|
|
"12th 144.846308 288.532753\n",
|
|
"1st-4th 46.809439 123.217421\n",
|
|
"5th-6th 84.838273 247.778789"
|
|
]
|
|
},
|
|
"execution_count": 20,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"ct = pd.crosstab(adult['Education'], adult['Sex'])\n",
|
|
"f = lambda x: x + np.random.laplace(loc=0, scale=1/epsilon)\n",
|
|
"ct.applymap(f).head(5)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"It's also possible to generate contingency tables of more than 2 variables. Consider what happens each time we add a variable, though: each of the counts tends to get smaller. Intuitively, as we split the dataset into more chunks, each chunk has fewer rows in it, so all of the counts get smaller.\n",
|
|
"\n",
|
|
"These shrinking counts can have a significant affect on the accuracy of the differentially private results we calculate from them. If we think of things in terms of signal and noise, a large count represents a strong *signal* - it's unlikely to be disrupted too much by relatively weak noise (like the noise we add above), and therefore the results are likely to be useful even after the noise is added. However, a small count represents a weak *signal* - potentially *as weak* as the noise itself - and after we add the noise, we won't be able to infer anything useful from the results.\n",
|
|
"\n",
|
|
"So while it may seem that parallel composition gives us something \"for free\" (more results for the same privacy cost), that's not really the case. Parallel composition simply moves the tradeoff between accuracy and privacy along a different axis - as we split the dataset into more chunks and release more results, each result contains a weaker signal, and so it's less accurate."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Post-processing\n",
|
|
"\n",
|
|
"The third property of differential privacy we will discuss here is called *post-processing*. The idea is simple: it's impossible to reverse the privacy protection provided by differential privacy by post-processing the data in some way. Formally:\n",
|
|
"\n",
|
|
"- If $F(X)$ satisfies $\\epsilon$-differential privacy\n",
|
|
"- Then for any (deterministic or randomized) function $g$, $g(F(X))$ satisfies $\\epsilon$-differential privacy\n",
|
|
"\n",
|
|
"The post-processing property means that it's always safe to perform arbitrary computations on the output of a differentially private mechanism - there's no danger of reversing the privacy protection the mechanism has provided. In particular, it's fine to perform post-processing that might reduce the noise or improve the signal in the mechanism's output (e.g. replacing negative results with zeros, for queries that shouldn't return negative results). In fact, many sophisticated differentially private algorithms make use of post-processing to reduce noise and improve the accuracy of their results.\n",
|
|
"\n",
|
|
"The other implication of the post-processing property is that differential privacy provides resistance against privacy attacks based on auxiliary information. For example, the function $g$ might contain auxiliary information about elements of the dataset, and attempt to perform a linkage attack using this information. The post-processing property says that such an attack is limited in its effectiveness by the privacy parameter $\\epsilon$, regardless of the auxiliary information contained in $g$."
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"celltoolbar": "Tags",
|
|
"kernelspec": {
|
|
"display_name": "Python 3",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.6.10"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|