/
Homomorphic_Encryption_for_Lieanr_Regression.ipynb
503 lines (503 loc) · 119 KB
/
Homomorphic_Encryption_for_Lieanr_Regression.ipynb
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
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from sklearn.metrics import r2_score\n",
"from sklearn import linear_model\n",
"\n",
"from utils import plt_linefit\n",
"from datasets import generate_1d_dataset\n",
"from homomorphic_encryption import encryption_train, decryption_train, encryption_test, decryption_test, estimator_OLS, predict "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Homomorphic Encryption"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generate Data"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# m number of data points\n",
"# n number of features\n",
"m = 200\n",
"n = 1\n",
"\n",
"#np.random.seed(437) "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"X_train, X_test, y_train, y_test = generate_1d_dataset(m, n, factor=10.0)\n",
"X_train = np.array([[1,xi.item()] for xi in X_train])\n",
"X_test = np.array([[1,xi.item()] for xi in X_test])\n",
"plt.scatter(X_train.T.tolist()[1], y_train.T.tolist()[0], label=\"train\")\n",
"plt.scatter(X_test.T.tolist()[1], y_test.T.tolist()[0], label=\"test\")\n",
"plt.ylabel(\"X\")\n",
"plt.ylabel(\"y\")\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Test the Encryption/Decryption Method"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"H_enc = encryption_train(X_train,y_train)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"H_dec = decryption_train(H_enc[0],H_enc[1],H_enc[2],H_enc[3])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"X_enc = H_enc[0]\n",
"y_enc = H_enc[1]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(X_train.T.tolist()[1], y_train.T.tolist()[0], label=\"original\")\n",
"plt.scatter(X_enc.T.tolist()[1], y_enc.T.tolist()[0], label=\"encrypted\")\n",
"plt.title(\"Similarity between original and encrypted data\")\n",
"plt.ylabel(\"X\")\n",
"plt.ylabel(\"y\")\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Train Linear Regression"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Raw DATA"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"matrix([[5.15967967],\n",
" [1.00108387]])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Homemade estimator\n",
"β̂_raw = estimator_OLS(X_train,y_train)\n",
"β̂_raw"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([5.15967967, 1.00108387])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# sklearn estimator\n",
"regr = linear_model.LinearRegression(fit_intercept=False)\n",
"regr.fit(X_train, y_train)\n",
"\n",
"#print(regr.intercept_[0])\n",
"regr.coef_[0]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(X_train.T.tolist()[1], y_train.T.tolist()[0], label=\"train\")\n",
"plt.plot([np.min(X_train[:,1]), np.max(X_train[:,1])], plt_linefit(X_train,β̂_raw), label=\"DIY Model\")\n",
"plt.plot([np.min(X_train[:,1]), np.max(X_train[:,1])], plt_linefit(X_train,regr.coef_[0]), label=\"sklearn Model\")\n",
"plt.ylabel(\"X\")\n",
"plt.ylabel(\"y\")\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Encrypted DATA"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"matrix([[ 5.23981932],\n",
" [-0.41080004]])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Homemade estimator\n",
"β̂_enc = estimator_OLS(X_enc,y_enc)\n",
"β̂_enc"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 5.23981932, -0.41080004])"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# sklearn estimator\n",
"regr_enc = linear_model.LinearRegression(fit_intercept=False)\n",
"regr_enc.fit(X_enc, y_enc)\n",
"\n",
"regr_enc.coef_[0]"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAD4CAYAAAAQP7oXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3de3zO9f/H8cfrOsw2p0mIIZTkfBqmfl8q5VBCSkVJRyl9O8tEDqVy6CRFIVLOSUtfyqH41reQw4YWIhEjJBN2za7D+/fHde3q2gzDtuu6ttf9dtvNdb0/n8+116fYc5/P+/15v8UYg1JKKZUXlmAXoJRSKnxoaCillMozDQ2llFJ5pqGhlFIqzzQ0lFJK5Zkt2AUUpIsvvtjUqFEj2GUopVRYWb9+/Z/GmAq5bSvSoVGjRg3WrVsX7DKUUiqsiMju023T21NKKaXyTENDKaVUnmloKKWUyrMi3aeRG6fTyd69e8nIyAh2Keo0IiMjqVq1Kna7PdilKKVyKHahsXfvXkqXLk2NGjUQkWCXo3IwxnD48GH27t1LzZo1g12OUiqHYhcaGRkZGhghTEQoX748hw4dCnYpSoWlxKRUxi7Zxr40B1ViohjQoQ7dmsbm2+cXu9AANDBCnP7/Uer8JCalMmjBZhxONwCpaQ4GLdgMkG/BoR3hSilVRIxdsg2H000p0qkh+wFwON2MXbIt376HhkYQWK1WmjRpQv369WncuDGvv/46Ho8HgJUrV9K5c2dSUlK44oorcDgc/uNuuukmZs+ene2zVq5ciYgwZcoUf1tycjIiwmuvvZbnmnbt2kWDBg0ueB+lVPDsS3NwjSWJJSUGMsH+NoLH355fNDSCICoqiuTkZFJSUli2bBlffvklI0aMyLZP/fr16d69Oy+//DIAiYmJOJ1OevbsecrnNWjQgHnz5vnfz549m8aNGxfsSSilQsqRQ/sZFzGRDyPGctxE8bzzAYzvR3yVmKh8+z4aGkFWsWJFJk2axDvvvEPOVRSHDh3KJ598QnJyMgkJCbz77ru5fsall15KRkYGBw4cwBjDV199RadOnfzbk5OTiY+Pp1GjRtxyyy0cOXIEgPXr19O4cWMaN26c7bPdbjcDBgygRYsWNGrUiPfff78AzlwplR+Mx8P6RVMw77ako/zAONetdM58hWRzOQBRdisDOtTJt+9XLDvCs4z4IoWf9/2dr59Zr0oZht1c/5yOqVWrFm63m4MHD2Zrj46O5rXXXqNNmzY8/fTT1K5d+7Sfcdttt/HJJ5/QtGlTmjVrRokSJfzb7rnnHsaPH0/btm0ZOnQoI0aM4K233uK+++7jnXfeoU2bNgwYMMC//wcffEDZsmVZu3YtJ0+e5Oqrr6Z9+/baQa1UiDmY+hupMx+lefoP/GK7gqPdJ3DpySpU1NFTxdfNN99MTEwMjz766Bn3u/3227njjjvYunUrPXv25IcffgDg6NGjpKWl0bZtWwD69OlDjx49SEtLIy0tjTZt2gDQu3dvvvzySwCWLl3Kpk2bmD9/vv8ztm/fzhVXXFFQp6mUOgcet5u1C96i3k9juRI3q694mhZ3DMZqs1GT/BsplZtiHRrnekVQUHbu3InVaqVixYps2bLllO0WiwWL5cx3Ei+55BLsdjvLli1j3Lhx/tA4H8YYxo8fT4cOHbK179q167w/UymVP/bu+Imj8x6hVeYmfopsQrk7JhBfq/B+lmmfRpAdOnSIfv368dhjj13w7Z8XX3yR0aNHY7Va/W1ly5alXLlyfPfddwB8/PHHtG3blpiYGGJiYvjf//4HwMyZM/3HdOjQgYkTJ+J0OgH45ZdfOHHixAXVppS6MC5nJqtnDOPij6+hWuYOfmw4gvoDVxBbiIEBxfxKI1gcDgdNmjTB6XRis9no3bs3Tz/99AV/7lVXXZVr+/Tp0+nXrx/p6enUqlWLadOmATBt2jTuv/9+RIT27dv793/wwQfZtWsXzZo1wxhDhQoVSExMvOD6lFLnZ+dPa3An9ifetZ2kkldR9e6JtKxSIyi1SM4RO0VJXFycybkI05YtW6hbt26QKlJ5pf+flIKTGekkzRhC8z0f8reUYlfLETTr2Ac5y+3qCyUi640xcblt0ysNpZQKQVvXLifqyyeJ9+xhbUwHavd+m+YXXxLssjQ0lFIqVCQmpfL2l0ncnf4x91qXcEDKs6ntB7S49rZgl+anoaGUUiEgMSmVxE9nMN0ymVjrn3zkvoHx9OSFmFY0CnZxATQ0lFIqyI7+dQhP4qN8aFvJr57K9MgcynrjfYp77JJtBfrcxbnS0FBKqSBKWjKdaquG0oW/Ge/qxjuubpwkwr89PycbzA8aGkopFQR//vE7v3/cn2YnvmWH9TKeYAjfn6xyyn75OdlgftCH+0JEjRo1+PPPP09pL1WqVKHWoVOtK1WwjMfDj5+NJ+K9eOofX8WqWo9TI2E1PTrfSJTdmm3f/J5sMD8ELTREJFJEfhSRjSKSIiIjfO01RWSNiOwQkbkiEuFrL+F7v8O3vUawag9Hbrc7z/vqVOtKFYx9v23lp9HtaLlxCHvtNTl499e0vuclbPYIujWN5dXuDYmNiUKA2JgoXu3eMKT6MyC4VxongeuMMY2BJkBHEYkHRgNvGmMuB44AD/j2fwA44mt/07df2Dlx4gQ33XQTjRs3pkGDBsydOzfbdofDQadOnZg8efIpx44dO9Y/XfmwYcP87d26daN58+bUr1+fSZMm+dtLlSrFM888Q+PGjVm1ahU1atRg2LBhNGvWjIYNG7J169Zca9Sp1pXKX26Xi9WzRhLzYRtqZmxhTb3BXJnwLdVqZ/9lrFvTWL5PuI7fRt3E9wnXhVxgQBD7NIz3UfTjvrd235cBrgN6+dqnA8OBiUBX32uA+cA7IiLmQh5p/zIB/th83ofn6pKG0GnUaTd/9dVXVKlShUWLFgHeGWSzHD9+nDvvvJN77rmHe+65J9txS5cuZfv27fz4448YY+jSpQvffvstbdq0YerUqVx00UU4HA5atGjBrbfeSvny5Tlx4gStWrXi9ddf93/OxRdfzIYNG5gwYQKvvfZatttQgXSqdaXyx+4t68n49FHiXVvZGN2SSr0m0qra5cEu67wFtU9DRKwikgwcBJYBvwJpxhiXb5e9QFbUxgJ7AHzbjwLlC7fiC9ewYUOWLVvGwIED+e677yhbtqx/W9euXbnvvvtOCQzwhsbSpUv9P8S3bt3K9u3bAXj77bdp3Lgx8fHx7Nmzx99utVq59dZbs31O9+7dAWjevPkZZ629/fbb+eSTT5g9e3a21QJzm2r922+/zXWq9cDaP/roI5o0aUKrVq04fPiwv0aliqrMkxmsmjaQynPaU9GVyrrmY2g0YAmXhHFgQJBHTxlj3EATEYkBPgOuvNDPFJG+QF+A6tWrn3nnM1wRFJQrrriCDRs2sHjxYoYMGUK7du0YOnQoAFdffTVfffUVvXr1OuW3cGMMgwYN4uGHH87WvnLlSpYvX86qVauIjo7mmmuuISMjA4DIyMhsM94C/isGq9WKy+XidHSqdaXO3y8b/ov9P4/T2rOLdWXaUav3eOIqht6tpvMREqOnjDFpwAqgNRAjIllhVhVI9b1OBaoB+LaXBQ7n8lmTjDFxxpi4ChUqFHjt52rfvn1ER0dz9913M2DAADZs2ODf9uKLL1KuXDn69+9/ynEdOnRg6tSpHD/uvaOXmprKwYMHOXr0KOXKlSM6OpqtW7eyevXqfKtVp1pX6tw4Thxj9XuPctnnXSnp+Zvk/3uPuGcWcFERCQwI4pWGiFQAnMaYNBGJAm7A27m9ArgNmAP0AT73HbLQ936Vb/s3F9SfESSbN29mwIABWCwW7HY7EydOzLZ93Lhx3H///Tz33HOMGTPG396+fXu2bNlC69atAW8n94wZM+jYsSPvvfcedevWpU6dOsTHx+dbrTrVulJ5l/L9Isouf5p48wdrLu5K3d5v0iQm7O6gn1XQpkYXkUZ4O7qteK945hljXhSRWngD4yIgCbjbGHNSRCKBj4GmwF/AncaYnWf6Hjo1evjS/08qXPyddpgtHz1Jq78Wslcqc/T616l/9U3BLuuChOTU6MaYTXgDIGf7TqBlLu0ZQI9CKE0ppfIkeflsqvzveeLMEVZXvovGvUdTtWTpYJdVoHQaEaWUOkeHD+xl14x/0/zYN/xmqcHRm6cT37RNsMsqFBoaSimVR8bjYf1/JnHZhpE0NA5W1ehH814jiCgRGezSCo2GhlJK5cEfe3ZwYNYjxDl+ZKutLlG3vkvrus2DXVah09BQSqkz8LjdrJ3/Gg1+foMyGFZf+RwtegzEaiuePz6L51krpVQe/P5LMsc/6U8r509sjmxG+Z7vEV8jtGadLWwh8XBfcZOWlsaECRPO+bgbb7yRtLS0AqhIKRXImXmSVdMHU2nm9cQ6f2Ntk5dpMPBrqhTzwAANjaA4XWicaVoPgMWLFxMTE1NQZSmlgB0bv2f36Na0/u0dUkq3xtlvNS26PYZY9MclaGicVWJSKleP+oaaCYu4etQ3JCalnv2gs0hISODXX3+lSZMmtGjRgn/961906dKFevXqAaef6jxroaZdu3ZRt25dHnroIerXr0/79u1xOHJfEnLGjBm0bNmSJk2a8PDDD/vX1ShVqhSDBw/2T3R44MABAA4cOMAtt9zin+L8QuacUiqcZDhOsGrS49RY0JkY92GSWr9Ns2e/4OJLzjKHXTGjoXEGiUmpDFqwmdQ0BwZITXMwaMHmCw6OUaNGcdlll5GcnMzYsWPZsGED48aN45dffgFg6tSprF+/nnXr1vH2229z+PApU2yxfft2+vfvT0pKCjExMXz66aen7LNlyxbmzp3L999/T3JyMlar1T8n1IkTJ4iPj2fjxo20adPGv37H448/Ttu2bdm4cSMbNmygfv36F3SuSoWDLWuWcGhMHK33TWdDuY7YH19H0w59gl1WSNKO8DMYu2QbDmf2Fe8cTjdjl2zL18VRWrZsSc2aNf3v3377bT777DMA/1Tn5ctnn8OmZs2aNGnSBDj9NOdff/0169evp0WLFt7aHQ4qVqwIQEREBJ07d/Yfv2zZMgC++eYbPvroI8A7E27g1O1KFTXH/z5CykdP0+rPBeyTimy+7iNatuka7LJCmobGGexLy/2Wz+naz1fJkiX9r8801XmgwEWRrFYrDoeDPXv2cPPNNwPQr18/jDH06dOHV1999ZTj7Xa7f/r1s02TrlRRkZiUytgl29iX5qBz9E8873mfFuYvVle6g0b3jKVKKf0l6Wz09tQZVImJOqf2vCpdujTHjh3LdduFTHVerVo1kpOTSU5Opl+/frRr14758+dz8OBBAP766y927959xs9o166df+Zdt9udbWVBpcJZ1u3mE2kHec0+gfGeVzjmiWReoynEPzqJaA2MPNHQOIMBHeoQZc++iFGU3cqADhc27K58+fJcffXVNGjQINuyqAAdO3bE5XJRt25dEhISLmiq83r16jFy5Ejat29Po0aNuOGGG9i/f/8Zjxk3bhwrVqygYcOGNG/enJ9//vm8v79SoWTMl1u4zv09y0sMoItlFeNc3emc+Qrjt18U7NLCStCmRi8M+TE1euDlbJWYKAZ0qBOSi70XNTo1uspPh/btImni/bS3rmejpxYDnX3ZaryjogT4bVR4T2We30JyavRw0a1prIaEUmHKeDys/WwcV24ew78sLkY672KauyNu/rmDcKG3m4sbDQ2lVJGUujOFtDmP0DJzIykRjfip2UvM/D7D/6wS5M/t5uKmWIaGMcY/ckiFnqJ8y1QVPLfLxdo5I2m8/V3KYOXHhsNo0f1J6lsslKikt5svVLELjcjISA4fPkz58uU1OEKQMYbDhw8TGVl81idQ+ee3lDU4P3uMeNcvJJW8iti7JtAy9p9noPR284UrdqFRtWpV9u7dy6FDh4JdijqNyMhIqlatGuwyVBg5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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(X_enc.T.tolist()[1], y_enc.T.tolist()[0], label=\"train-enc\")\n",
"plt.plot([np.min(X_enc[:,1]), np.max(X_enc[:,1])], plt_linefit(X_enc,β̂_enc), label=\"DIY Model\")\n",
"plt.plot([np.min(X_enc[:,1]), np.max(X_enc[:,1])], plt_linefit(X_enc,regr_enc.coef_[0]), label=\"sklearn Model\")\n",
"plt.ylabel(\"X\")\n",
"plt.ylabel(\"y\")\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Prediction"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Prediction on Raw DATA"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"R2: 0.9976538444224966\n"
]
}
],
"source": [
"y_test_raw = predict(β̂_raw,X_test)\n",
"print(f\"R2: {r2_score(y_test, y_test_raw,multioutput='uniform_average')}\")"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(X_test.T.tolist()[1], y_test.T.tolist()[0], label=\"test\")\n",
"plt.scatter(X_test.T.tolist()[1], y_test_raw.T.tolist()[0], label=\"predict\")\n",
"plt.ylabel(\"X\")\n",
"plt.ylabel(\"y\")\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Prediction on Encrypted DATA"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"R2: -14.06932490792416\n"
]
}
],
"source": [
"H = encryption_test(X_test,H_enc[3])\n",
"\n",
"y_pred_homo = predict(β̂_enc,H[0])\n",
"\n",
"#print(f\"R2: {r2_score(X_test, np.linalg.inv(H[1]).dot(H[0]),multioutput='uniform_average')}\")\n",
"print(f\"R2: {r2_score(y_test, y_pred_homo,multioutput='uniform_average')}\")"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(X_test.T.tolist()[1], y_test.T.tolist()[0], label=\"test\")\n",
"plt.scatter(X_test.T.tolist()[1], y_pred_homo.T.tolist()[0], label=\"predict\")\n",
"plt.ylabel(\"X\")\n",
"plt.ylabel(\"y\")\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Decryption After Prediction"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"R2: -29.991502769068035\n"
]
}
],
"source": [
"#y_pred_homo_dec = np.linalg.inv(H[1]).dot(y_pred_homo)\n",
"y_pred_homo_dec = decryption_test(y_pred_homo,H[1])\n",
"print(f\"R2: {r2_score(y_test, y_pred_homo_dec,multioutput='uniform_average')}\")"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(X_test.T.tolist()[1], y_test.T.tolist()[0], label=\"test\")\n",
"plt.scatter(X_test.T.tolist()[1], y_pred_homo_dec.T.tolist()[0], label=\"predict\")\n",
"plt.ylabel(\"X\") \n",
"plt.ylabel(\"y\")\n",
"plt.legend()\n",
"plt.show()"
]
}
],
"metadata": {
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}