Spaces:
Runtime error
Runtime error
File size: 182,789 Bytes
66061aa |
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 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 |
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from scipy.io import savemat, loadmat\n",
"import pandas as pd\n",
"import pdb\n",
"import json\n",
"import numpy as np\n",
"from numpy import median, mean\n",
"from sklearn.linear_model import BayesianRidge, LinearRegression, RidgeCV, Ridge\n",
"from sklearn.neural_network import MLPRegressor\n",
"from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error\n",
"from sklearn.model_selection import cross_val_score, LeaveOneOut\n",
"import pickle\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## group contribution method linear regression "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean squared error: 45.20\n",
"Coefficient of determination: 0.9989\n"
]
},
{
"data": {
"text/plain": [
"Text(0.7, 0.25, '$R^2$ = 0.9989')"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"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": [
"ac = loadmat('./data/component_contribution_python.mat')\n",
"\n",
"S = ac['train_S']\n",
"G = ac['G']\n",
"b = ac['b']\n",
"\n",
"m, n = S.shape\n",
"assert G.shape[0] == m\n",
"assert b.shape == (n, 1)\n",
"\n",
"STG = np.dot(S.T,G)\n",
"\n",
"X = STG\n",
"# y = b.flatten()\n",
"y = b\n",
"\n",
"reg = LinearRegression(fit_intercept=False).fit(X, y)\n",
"\n",
"# filename = './model/linearReg_ac_all_model.sav'\n",
"# pickle.dump(reg, open(filename, 'wb'))\n",
"# filename = './model/linearReg_ac_all_model.sav'\n",
"# outfilename = '../cache/db_ac_all/result_linearReg.csv'\n",
"# predict(filename,outfilename)\n",
"# pdb.set_trace()\n",
"predicted = reg.predict(X)\n",
"\n",
"plt.hist(reg.coef_[0][0:163], bins=50)\n",
"# plt.xscale('log')\n",
"plt.xlabel('$\\Delta_g G^o$')\n",
"plt.ylabel('Count')\n",
"# plt.savefig('./figures/linear_cc_groups.png')\n",
"\n",
"mse = mean_squared_error(y, predicted)\n",
"r2 = r2_score(y, predicted)\n",
"\n",
"print('Mean squared error: %.2f'\n",
" % mse)\n",
"# The coefficient of determination: 1 is perfect prediction\n",
"print('Coefficient of determination: %.4f'\n",
" % r2)\n",
"\n",
"fig, ax = plt.subplots()\n",
"ax.scatter(y, predicted)\n",
"ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=1)\n",
"ax.set_xlabel('Measured $\\Delta_r G^o$')\n",
"ax.set_ylabel('Predicted $\\Delta_r G^o$')\n",
"plt.figtext(.7, .2, \"MSE = %.2f\" % mse)\n",
"plt.figtext(.7, .25, \"$R^2$ = %.4f\" % r2)\n",
"# plt.savefig('./figures/linear_regression_cc.png')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cross validation group contribution "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"median of cv is: 5.460625755099045\n",
"mean of cv is: 188754266931.4596\n"
]
},
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Cumulative distribution')"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ac = loadmat('./data/component_contribution_python.mat')\n",
"\n",
"S = ac['train_S']\n",
"\n",
"df_S = pd.DataFrame(ac['train_S'])\n",
"df_S_unique = df_S.T.drop_duplicates().T\n",
"unque_cols = df_S_unique.columns.values.tolist()\n",
"S = S[:, unque_cols]\n",
"\n",
"G = ac['G']\n",
"\n",
"b_list = json.load(open('./data/median_b.json'))\n",
"b = np.asarray(b_list)\n",
"b = np.reshape(b,(-1,1))\n",
"\n",
"m, n = S.shape\n",
"assert G.shape[0] == m\n",
"assert b.shape == (n, 1)\n",
"\n",
"STG = np.dot(S.T,G)\n",
"\n",
"X = STG\n",
"y = b\n",
"\n",
"\n",
"# cross validation\n",
"regression = LinearRegression(fit_intercept=False)\n",
"# lasso = linear_model.Lasso()\n",
"\n",
"scores = -cross_val_score(regression, X, y, cv=LeaveOneOut(), scoring='neg_mean_absolute_error')\n",
"print('median of cv is: ', median(scores))\n",
"print('mean of cv is: ', mean(scores))\n",
"\n",
"\n",
"# print('std of cv is: ', scores.std)\n",
"x = np.sort(scores)\n",
"# y = np.arange(1,len(x)+1)/len(x)\n",
"y = 1. * np.arange(len(x)) / (len(x) - 1)\n",
"\n",
"fig = plt.figure(figsize=(6,6))\n",
"plt.xlim(right=15)\n",
"plt.plot(x,y,marker='.',linestyle='none')#,color=\"#273c75\")\n",
"plt.axhline(y=0.5,linewidth=1,color='grey')\n",
"plt.xlabel('|$\\Delta G^{\\'o}_{est} - \\Delta G^{\\'o}_{obs}$|')\n",
"plt.ylabel('Cumulative distribution')\n",
"# fig.savefig('./figures/cross_validation_cc.jpg')\n",
"# plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## M1-linear model regression "
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean squared error: 38.30\n",
"Coefficient of determination: 0.9990\n"
]
},
{
"data": {
"text/plain": [
"Text(0.7, 0.25, '$R^2$ = 0.9990')"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"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": [
"ac = loadmat('./data/dGPredictor_stereo.mat')\n",
"\n",
"S = ac['train_S']\n",
"\n",
"G = ac['G']\n",
"b = ac['b']\n",
"\n",
"\n",
"m, n = S.shape\n",
"assert G.shape[0] == m\n",
"assert b.shape == (n, 1)\n",
"\n",
"STG = np.dot(S.T,G)\n",
"\n",
"X = STG\n",
"# y = b.flatten()\n",
"y = b\n",
"\n",
"# reg = LinearRegression(fit_intercept=False).fit(X, y)\n",
"alphas = np.logspace(-6, 6, 200)\n",
"reg = RidgeCV(alphas=alphas, fit_intercept=False ).fit(X, y)\n",
"\n",
"plt.hist(reg.coef_[0][0:264], bins=50, color = 'burlywood')\n",
"# plt.xscale('log')\n",
"plt.xlabel('$\\Delta_g G^o$')\n",
"plt.ylabel('Count')\n",
"# plt.savefig('./figures/ridge_groups.png')\n",
"\n",
"predicted = reg.predict(X)\n",
"\n",
"mse = mean_squared_error(y, predicted)\n",
"r2 = r2_score(y, predicted)\n",
"\n",
"print('Mean squared error: %.2f'\n",
" % mse)\n",
"# The coefficient of determination: 1 is perfect prediction\n",
"print('Coefficient of determination: %.4f'\n",
" % r2)\n",
"\n",
"fig, ax = plt.subplots()\n",
"ax.scatter(y, predicted, color = 'burlywood')\n",
"ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=1,)\n",
"ax.set_xlabel('Measured $\\Delta_r G^o$')\n",
"ax.set_ylabel('Predicted $\\Delta_r G^o$')\n",
"plt.figtext(.7, .2, \"MSE = %.2f\" % mse)\n",
"plt.figtext(.7, .25, \"$R^2$ = %.4f\" % r2)\n",
"# plt.savefig('./figures/ridge_regression.png')\n",
"# plt.show()\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## M1 linear model cross-validation"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"median of cv is: 5.82616291903174\n",
"mean of cv is: 14.961333672834286\n"
]
},
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Cumulative distribution')"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAF7CAYAAADfZ4xYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAocUlEQVR4nO3df5RdZX3v8ff3TCYTJslkyOQXJoQEGoMDEqFDQtFLRYoEqqZaawXbWltLbVFre6vibVdbV1ev1nqtorbItRQtVIpKr7FiEDWKvTSQgBNCwh0MATJzEvJjwuSEhJNkMt/7x94TzszZ55ydyezza39ea2XNnGfvOfMli+zPeZ69n+cxd0dERNIrU+sCRESkthQEIiIppyAQEUk5BYGISMopCEREUk5BICKSclNqXcCpmjNnji9ZsqTWZYiINJRHH310v7vPjTrWcEGwZMkSNm3aVOsyREQaipk9V+qYhoZERFJOQSAiknIKAhGRlFMQiIiknIJARCTlFAQiIimnIBARSTkFgYhIyikIRERSLrEgMLPbzWyvmT1R4riZ2S1mtt3MHjezS5KqRURESkuyR3AHsLrM8WuBZeGfG4F/TLAWEREpIbEgcPcHgQNlTlkDfNUDG4BOMzsrqXpERCRaLe8RLAT6C14PhG0iIlJFtQwCi2jzyBPNbjSzTWa2ad++fQmXJSKSLrUMggHg7ILXi4BdUSe6+23u3uPuPXPnRi6nLSIiE1TLIFgL/Fb49NBlwEF3313DekREUimxjWnM7GvA64E5ZjYA/CXQCuDutwL3AdcB24EjwHuSqkVEREpLLAjc/foKxx24KanfLyIi8WhmsYhIyikIRERSTkEgIpJyCgIRkZRTEIiIpJyCQEQk5RQEIiIppyAQEUk5BYGISMopCEREUk5BICKScgoCEZGUUxCIiKScgkBEJOUUBCIiKacgEBFJOQWBiEjKKQhERFJOQSAiknIKAhGRlFMQiIiknIJARCTlFAQiIimnIBARSTkFgYhIyikIRERSTkEgIpJyCgIRkZRTEIiIpJyCQEQk5RQEIiIppyAQEUk5BYGISMopCEREUk5BICKScgoCEZGUUxCIiKScgkBEJOUUBCIiKacgEBFJOQWBiEjKKQhERFJOQSAiknIKAhGRlFMQiIiknIJARCTlFAQiIimnIBARSTkFgYhIyikIRERSLtEgMLPVZtZnZtvN7OaI47PM7NtmttnMtprZe5KsR0REik1J6o3NrAX4InA1MABsNLO17r6t4LSbgG3u/mYzmwv0mdld7n4sqbpERJpJfijLi9ktAMxY+GqmdS6MPGd+V8eCUu+RWBAAK4Ht7r4DwMzuBtYAhUHgwEwzM2AGcAAYTrAmEZGGl+vv5fCePqbOnEfuuU3gJwA4tGsLZ116w5gwyA9leX7j15h75szihAglGQQLgf6C1wPAqnHnfAFYC+wCZgK/7u4jCdYkItKQRi/+mdYzOPJ88Hk6P/jM2JNGTpA/sHNsEBzYiY+cACv93kkGQdSv9XGvrwF6gTcA5wEPmNlP3D035o3MbgRuBFi8ePHkVyoiUqdy/b0MPf0QJ47mKp+caWHa7LHXyGmzF2OZFnAff/09KckgGADOLni9iOCTf6H3AJ/0oMDtZvYMcD7wSOFJ7n4bcBtAT09Pyf8YEZFGlh/KBp/ow4v5wR0bOLLvZ2V/pmPJKnz4KBB9j2Ba50IWXHo9+1746/HX35OSDIKNwDIzWwpkgXcCN4w7ZydwFfATM5sPLAd2JFiTiEjdyQ9lg4v+/u3gDtYSjKmMnIg8v31BNyPHX2L6/OV0nP2aiu8/rXMhewZzz5c6nlgQuPuwmb0fuB9oAW53961m9r7w+K3AXwN3mNkWgv/sj7r7/qRqEhGptfGf+l/MbuFQ9nEovD3qJ4oH0kMdS1bRtfzKSa0pyR4B7n4fcN+4tlsLvt8FvDHJGkREamWwbz1H9j5F+7xX0rX8ypNP8AQ3bzNlPvUbZDIwMgIYU9rPZOqM2cxaelnk46GnK9EgEBFJk8JP+wefe/Tk0z25Zx8GoKV1WhACeOlP/WZ0veoaps6ce/K9krj4F1IQiIicplx/L4cGNnPs0J5wjD9z8tn+UUf2PsXcV78Jy7SM6xGMgGVon3MuLW3Tx9zwTToARikIREQmKNffy8FnNzJ8ZHDsAS8e7mmf98qTT/AU3iOo1qf+chQEIiKnYHT45+ihfSeHfoqMe+qnfUH3yRu80zoXjrno1zIARikIRERiGF3Tp+gJn3Fap3cx58Lrgp+pg0/7cSgIREQijH7yz7SewUv7nn75Gf+yMsy58Lqqj/GfLgWBiEho9FP/iaOHOTK4o+SErrGM9gWvom3m3Ib49B9FQSAiqXdyZm+F5RzGyjBz0UUll35uJAoCEUmtUw4AMzrOWUlL67SG/fQfRUEgIk2tcKx/5PhLJy/guf5eBrfdT8m1HCzDzIUXMbVjAcfCZXqa4dN/FAWBiDSNyHV8dm0ZM9ZvmSnMPv+XGHzye5QKgfZ5yxJbzqEeKQhEpCGVvuiPlF3Hx0dOcHhPX+QjoGkLgFEKAhFpGKNj+scOH2D4pRdeXs5h/EW/5OqdhmVamD5/OUdf6MdHhgGjfd7PpTIARikIRKSuFH7SH70wn5zMNbCZoit81EX/5MzekXCs/9VM7Vgw5h5BNRd1q3cKAhGpG4N968k9+wjgWGYKCy69HiBcunk4+ociLvozFr4aKD+zd/xSD2mmIBCRmssPZTnQt56jQwMn23xkmPyBneH3JXbqCsf0Ifqirwt9PAoCEam6XH8vh/f0MX3+coASj3HayRvBhUs3t806Cx85wcxFK8Zs06iL/sQpCESkasZ/8s8PPkMwrlN8Z7djycqTF/fCpZt1wZ98CgIRqYpg/P/hiCNRITB2X16N5ydLQSAiiYm3dn8mfKZfj3HWioJARBKR6+9l8Mn7yy7d3LFkFdPnv1LDPjWmIBCRSfXyM/+9Jc9pmdbBvBVrGm7d/malIBCRSROnFwA2JgSk9hQEInLaSm7iXqB97jJa2qY37QqejUxBICITFm89f6Or+5oxz/xLfVEQiMiE5Iey7H7krjIbuRszF61QD6ABKAhEJJbRm8AQbNByoG99yRBI63LOjSpWEJjZ5cCSwvPd/asJ1SQidSY/lGX3w3cyOvnrUPbxEiGgYaBGVDEIzOxfgPOAXmB05ScHFAQiKbF/67i1gLSpS1OJ0yPoAbrdyz4PJiJNZnRW8InjeY6/uLf4hExLuBmM0bFk5ZglIaSxxAmCJ4AFwO6EaxGRKiq1AczoxT/33MaS9wA0I7i5xAmCOcA2M3sEODra6O5vSawqEUnUmCd+LMNZK98FVNgAJtQ6Y+7JT/8KgOYQJwj+KukiRKS6xjzx4yMcfGYDbbNeUWIDGAu/OpBhzgWrq1SlVEvFIHD3H5vZfODSsOkRd48YMBSRejb6+OexF/eP2QkM4NiLB5i19LJwA5iCHoFl6HrVG7W/b5OL89TQO4C/A35E8NHg82b2YXf/RsK1icgkyfX3MrhtXcnjU6fPZlrnwpMbwGRazxiz0TtoGKiZxRka+jPg0tFegJnNBb4PKAhEGkDpDWFGGbPODfb91QYw6RQnCDLjhoIGgUxC9YjIJMr195YNAT37LxAvCNaZ2f3A18LXvw7cl1xJInK6cv29HBrYzPHD+yOPKwCkUJybxR82s18FXktwj+A2d//3xCsTkQnZs3ltyW0hraWNBT3vUADIGLHWGnL3bwLfTLgWETlN5UIAYPbyKxUCUqRkEJjZf7r768zsEGMWGcEAd/eOxKsTkYpGh4Hchzl+aF/kOVM7zmLmohVaDE4ilQwCd39d+HVm9coRkVNRqQfQOmMecy64Rr0AKavi0z/h6qMV20SkevJDWXY9fGfZEGhf0M2i1/6OQkAqinOP4ILCF2Y2Bfj5ZMoRkXLibA2pYSA5VeXuEXwM+B/AGWaWG20GjgG3VaE2EQkN9q3n8O5tnDj6ImNv2b1Mw0AyUeXuEXwC+ISZfcLdP1bFmkQklB/Ksn/rOo6/GH0TeFTHklXaD0AmLM7Q0HfN7Irxje7+YAL1iEho/PaQUTQxTCZDnCD4cMH304CVwKPAGxKpSESAcKnoiBBonTGXaZ0LmbHw1QoAmRRxZha/ufC1mZ0NfCqxikRSbnRewLFc8aaA7Qu6mb9Ce0LJ5Io1s3icAeDCyS5EJM1y/b0c3tNHpvWMko+EtrR1KAQkEXH2I/g8L/dPM8BrgM0J1iSSGrn+Xg4+u5HhI4MVz+087/IqVCRpFKdHsKng+2Hga+7+f+O8uZmtBj4HtABfdvdPRpzzeuCzQCuw391/Mc57izSqOJ/+R7XOnIvZFM0LkETFuUfwFTObCpxP0DPoi/PGZtYCfBG4mmA4aaOZrXX3bQXndAL/AKx2951mNu/U/xNEGkelJSEguA8wcvwlps9frou/VEWcoaHrgC8BTxNMKFtqZr/v7t+t8KMrge3uviN8n7uBNUDhv4IbgHvdfSeA9kKWZpUfynKgb33RXsGFMq3tnLnsCl38periDA19BrjS3bcDmNl5wHeASkGwEOgveD0ArBp3ziuBVjP7ETAT+Jy7f3X8G5nZjcCNAIsXL45Rskh9iLMkRCDD/Et+VY+DSk3ECYK9oyEQ2gHE+eRuEW3jH4oeXbfoKuAM4L/MbIO7PzXmh9xvI1zWoqenp/TsGpE6Ummv4PYF3cw65+fJH9g5ZpN4kWort9bQ28Jvt5rZfcA9BBfyXwM2xnjvAeDsgteLgF0R5+x398PAYTN7EFgBPIVIA6u0V3DhkhAKAKm1cj2Cwolke4DRp3n2AWfGeO+NwDIzWwpkgXcS3BMo9C3gC+GKplMJho7+PsZ7i9St/FCWA0+tL3HU6Oq+RvcBpK6UW3TuPafzxu4+bGbvB+4neHz0dnffambvC4/f6u5Pmtk64HFghOAR0ydO5/eK1FLJp4Iyrcx8xQVaFkLqkrlHD7mb2Ufc/VPjJpSd5O4fTLq4KD09Pb5p06bKJ4pUUaVVQru6V6sXIDVlZo+6e0/UsXJDQ0+GX3XVFSmj0iqhHUtWKQSkrpUbGvp2OCnsQnf/cKnzRNIsP5Rlz0/vJXqVUG0UI42h7OOj7n7CzLQtpUiB/FCWF7NbOHH0MEf2bScqBLRKqDSSOPMIfmpma4GvA4dHG9393sSqEqlTuf5eBretK3uOdguTRhMnCGYDg4zdiMYBBYGkSqUJYhD0BBQC0mjiBMGXx682amavTagekbpUbrG4ts5F+MgJrRAqDStOEHweuCRGm0hDyw9lyR/YSab1DEaOv3Ry2Ydcf2+JENDkMGkO5ZaY+AXgcmCumf1JwaEOggliIk0jGPZ5hMIbv5aZwoJLr+fwnuKV11umdTBvxRo9ESRNoVyPYCowIzxnZkF7Dnh7kkWJVEuuv5ehpx/ixNFc0TEfOUH+wE6mz19OfvCZMccUAtJMys0j+DHwYzO7w92fAzCzDDDD3Yv/1Yg0mPKbxBiWaRmzKuihgc1MmTaDWUsvUwhIU4lzj+AT4fpAJ4BHgVlm9hl3/7tkSxNJTrkQaF/QTdvMuWNCoOPs1+hegDStOEHQ7e45M3sXcB/wUYJAUBBIwxidBAZgU9pKhoDmAEgaxQmCVjNrBX4F+IK7HzczbQ4jDSHOFpGg5SAk3eIEwZeAZ4HNwINmdg7BDWORuhZnFjBoOQiRikHg7rcAtxQ0PWdm6jtLXSsbApkWOhb3cOzQXqbPX66xf0m9cvMIfsPd7xw3h6DQZxKqSWTCcv29HHx2I8NHBiOPt3UuYvbyKzUEJFKgXI9gevh1ZplzROpCpQAA3QgWKaXcPIIvhV8/Xr1yRE5d+fkAoKUgRMorNzR0S6ljULutKkUKVQqB9nnLNAFMpIJyQ0OPhl9fC3QD/xa+/rWCYyI1M9i3PjIEWqZ10NYxXwEgElO5oaGvAJjZbwNXuvvx8PWtwPeqUp1ICbn+3si9AfQoqMipy8Q45xWMvWE8I2wTqYn8UDby0dBMa7tCQGQC4kwo+yTBdpXrw9e/CPxVYhWJVLB/6/2R7Wcuu6LKlYg0hzgTyv7ZzL4LrAqbbnb355MtS6RYfijLwR0bOP7i3qJjHUtW6akgkQmK0yMgvPB/K+FaYtm1axcf/7ieaJVxNjwIPFjrKkQakrk31vpxPT09vmnTplqXIVUyun3kkX1Pl1w47qxVv6mng0QqMLNH3b0n6lisHoFILeSHsux+5C7wkRJnBBPFFAIipydWEJjZ64Bl4f2CuQS7lD1T6edEJirX38uBvvUlQ6B1ehdzLrxOISAyCSoGgZn9JdADLAf+GWgF7iSYaCYy6SovH51RCIhMojg9grcCFwOPAbj7LjPTQnSSiGAjmR9EHovaQlJETl+cIDjm7j66K5mZTa/0AyITkR/Ksvvhfyk+YBk6zrlUK4eKJCROENxjZl8COs3s94DfAf53smVJGh3oWx/Z3vWqN2qOgEiC4kwo+7SZXU2wPeVy4C/c/YHEK5NUyQ9lIx8PbV/QrRAQSVicm8V/DHxdF39JUtSyEa0z5mrtIJEqiLPoXAdwv5n9xMxuMrP5SRcl6ZLr741cNmLOBatrUI1I+lQMAnf/uLtfANxEsOroj83s+4lXJqkxtOOhora2zkV6MkikSuL0CEbtBZ4HBoF5yZQjabNn81pO5HNF7bP1hJBI1VQMAjP7AzP7EfADYA7we+5+UdKFSfMrtc2kegMi1RXn8dFzgA+5e2/CtUiK5Pp7S+w1bOoNiFRZuc3rO9w9B3wqfD278Li7H0i4NmlSJXcYmzqd+Re/Tb0BkSor1yP4V+BNBBvVO2AFxxw4N8G6pEnlh7Ls+em9kccUAiK1UW7z+jeFX5dWrxxpZiWXkAC6ulcrBERqJM7N4qIVwKLaRCo5+MyGyHZtMylSW+XuEUwD2oE5ZnYmLw8NdRDMJxCJbbBvPUf2bi9qb1/QrcXkRGqs3D2C3wc+RHDRf5SXgyAHfDHZsqSZ7Np4N0cPPFvUnmlt1xISInWg3D2CzwGfM7MPuPvnq1iTNJHBvvWRIQBw5rIrqluMiESKs/ro583sQqAbmFbQ/tUkC5PGl+vvJffsw0XtLdM66Dz3ct0XEKkTcbeqfD1BENwHXAv8J6AgkJIG+9ZHh8AZnSy+4n01qEhESomz1tDbgauA5939PcAKoC3RqqSh7dm8NjIEAOZd9OYqVyMilcQJgpfcfQQYNrMOgsXnNJlMIg32rS+xdITmCojUqzhBsMnMOgm2p3yUYBP7R+K8uZmtNrM+M9tuZjeXOe9SMzthZm+P875Sf/JDWfY89s2SPYGu7tW6JyBSp+LcLP7D8NtbzWwd0OHuj1f6OTNrIXjM9GpgANhoZmvdfVvEeX8LFG9RJQ0hmDF8J8HKI2Np/SCR+lduQtkl5Y65+2MV3nslsN3dd4Q/czewBhg/bvAB4JvApbEqlroTbDpfHAKg9YNEGkG5HsH/KnPMgTdUeO+FQH/B6wFgVeEJZrYQeGv4XgqCBpMfynJwx4bITefB6Oq+RiEg0gDKTSg73Xn/FtE2/mPjZ4GPuvsJs6jTwzcyuxG4EWDx4sWnWZZMhlKPh0IwT2DeijUKAZEGEWcewW9FtceYUDYAnF3wehGwa9w5PcDdYQjMAa4zs2F3/z/jftdtwG0APT090WMQUjXlQgBMISDSYOLsUFY4ZDONYE7BY1SeULYRWGZmS4Es8E7ghsITCpe4NrM7gP8YHwJSX/JD2ZIh0D5vGbOWXqYQEGkwcZ4a+kDhazObBUQvKj/254bN7P0ETwO1ALe7+1Yze194/NaJlSy1Um5TGT0eKtK44vQIxjsCLItzorvfR7AsRWFbZAC4+29PoBapkkqbyigERBpXnHsE3+blm7wZgjWH7kmyKKk/wSOixbSpjEjji9Mj+HTB98PAc+4e9bygNKn8UDbyEVFtKiPSHOLcI/gxQLjO0JTw+9nufiDh2qRORPUGWmfM1aYyIk0iztDQjcBfAy8BIwTzAxwtPNf0yk0Ym3PB6hpUJCJJiDM09GHgAnffn3QxUj9y/b0MblsXeaylrUOPiIo0kThB8DTBk0KSEuUnjEHneZdXsRoRSVqcIPgY8JCZPQwcHW109w8mVpXUTKntJQFap3fRcc6lekpIpMnECYIvAT8EthDcI5AmlntuY2S75gqINK84QTDs7n+SeCVSc/mhLMdfGipqVwiINLc4QbA+fHLo24wdGtLjo02k5GbzbR0KAZEmFycIRheK+1hBmx4fbRL5oSwH+taX2FNAN4ZF0iDOhLKllc6RxjM6R+DIvp+VPEfLR4ikQ5L7EUidqvR4KOi+gEiaJLkfgdSZSsNAAG2di5i9/EpNGBNJkcT2I5D6EiwjfSelNpnXpjIi6ZXofgRSPw4+s4FSIaBhIJF0034EKZAfynJk/46idg0DiQhoP4Kmluvv5dDAZo7ldhcda2nr4BWrfqMGVYlIvSkZBGb2c8D80f0ICtr/m5m1ufvTiVcnE1Zu9VDQ/AAReVmmzLHPAoci2l8Kj0mdyvX3MvjkAyWPty/o1j0BETmp3NDQEnd/fHyju28ysyXJlSSno+QcgUwrU2fMYeaiFQoBERmjXBBMK3PsjMkuRE5ffihbcqJY1/lXKQBEJFK5oaGNZvZ74xvN7HeBR5MrSSYqam9h0FIRIlJeuR7Bh4B/N7N38fKFvweYCrw14brkFJTbW1hzBESkkpJB4O57gMvN7ErgwrD5O+7+w6pUJhXlh7K8mN3CoYHNRE0Wa+tcpBAQkYriLDGxHogec5CayQ9l2f3IXeClN42bvfzKKlYkIo1qIktMSB3Yv/X+MiFgdHVfoxnDIhKLgqDBjK4gevzFvZHHtXiciJwqBUEDKbeCaOv0LuZceJ0CQEROWbnHR6WO5Iey7N38LUqtIKoQEJGJUo+gAZTrCWgFURE5XQqCBhBMFCsOgY4lq+jSk0Eicpo0NFTncv29HB3KFrUrBERksqhHUMdKLSCXaW1XCIjIpFGPoE6VW0DuzGVXVLkaEWlm6hHUqWCP4bEs08psrSIqIpNMPYI6lOvv5ci+4j2GFQIikgT1COrMns1rOfL8tqL2TGu7QkBEEqEeQR0pFQKg+wIikhz1COrEYN/6kj2BM5ddod6AiCRGQVAHcv29JZ8Qmn/Jr2rWsIgkSkFQY7n+Xga3rStqz0ydzvyL36YQEJHEKQhqqNSEMUAhICJVoyCogdE9BaL2GIZg+QiFgIhUi4KgykoNBY3SGkIiUm0KgioqFwIt0zqYt2KNegIiUnWaR1Al+aFsmZ6AKQREpGbUI6iCXH9vuKdAMe0xLCK1piBIWLnZwl3dqzVRTERqTkNDCcr195YMgY4lqxQCIlIXEg0CM1ttZn1mtt3Mbo44/i4zezz885CZrUiynmp7YftPItv1ZJCI1JPEhobMrAX4InA1MABsNLO17l74EfkZ4Bfd/QUzuxa4DViVVE3VMjpPYOTY4bEHrIWzVt6g+wEiUleSvEewEtju7jsAzOxuYA1wMgjc/aGC8zcAixKspyryQ1l2P3wnUZvNt885VyEgInUnyaGhhUB/weuBsK2U3wW+m2A9VbF/6/1EhQDArHMvq24xIiIxJNkjsIi2yCukmV1JEASvK3H8RuBGgMWLF09WfZNusG89x1/cW9Te1rmI2cuvVG9AROpSkkEwAJxd8HoRsGv8SWZ2EfBl4Fp3H4x6I3e/jeD+AT09PdEft2us1GbzujEsIvUuyaGhjcAyM1tqZlOBdwJrC08ws8XAvcBvuvtTCdaSuGBIaKxMa7tCQETqXmI9AncfNrP3A/cDLcDt7r7VzN4XHr8V+AugC/gHMwMYdveepGpKyp7NayOHhLS9pIg0gkRnFrv7fcB949puLfj+vcB7k6whKfmhLPkDOzlxPB85aax9QbcmjIlIQ9ASExOQH8qy+5G7wEcij7fOmMv8FW+pclUiIhOjJSYmYP/W+0uGAMCcC1ZXsRoRkdOjHsEpyvX3Rt4PCBhd3dfoMVERaSgKglMUtX5Qx5JVtLROY9rsxQoBEWk4CoJTMFhi/SA9IioijUxBEFOpfQXaZp1Vg2pERCaPbhbHUG5fgdnqDYhIg1OPIIahHQ8VtWmzeRFpFuoRVJAfynIinytqVwiISLNQEFQQtYZQW+cihYCINA0FQRml5gzovoCINBMFQRm55zYWtak3ICLNRkFQxonjLxW1qTcgIs1GQVDGyPCxsQ0treoNiEjTURCUMNi3HkaGx7RlMq01qkZEJDkKggi5/t7IbSdnLHx1DaoREUmWgmCcXH8vg9vWFbW3nNGpNYVEpCkpCAqUCgGAeRe9ucrViIhUh4IglB/KlgyBru7VukksIk1LQRCKmkEMwV4D2ntYRJqZgoDgCaGoGcQdS1bpvoCINL3UB0F+KBv5hFBb5yKFgIikQuqD4OAzGyLbNYNYRNIi9UGQH8oWtenmsIikSaqDID+UZeTYkTFtNqVNN4dFJFVSu0NZrr+XF372YFF7y9QZNahGRKR2UhkE5SaOzVpyaZWrERGprdQNDeWHshzo+0HksfYF3RoWEpHUSVWPID+UZffDdwI+9oBl6HrVGxUCIpJKqeoRBI+KelF7xzmXKgREJLVSFQRHBp8ramtf0K2JYyKSaqkYGsoPZdm/dR2cGLvjWEtbB/NXvKVGVYmI1IemD4JyTwh1nnd5lasREak/TT00VC4E2mYv0X0BERGauEdQbn+B9gXdGhISEQk1bRCU2l+gq3u1egIiIgWacmio3P4CCgERkbGarkewZ/Najjy/rahdj4mKiERrqh7BYN/6yBBonTFX9wREREpoqiA4NNAb0WrMuWB1tUsREWkYTTM0NNi3Hh8+OrbRWjhr5Q3aZEZEpIymCIKS9wXmnKsQEBGpoOGHhkrdFwCYde5lVa5GRKTxNHQQ5Pp7yT37cOQx7TssIhJPww4NlVo+IjN1OvMvfptCQEQkpobsEZRbPkIhICJyahoyCMotH6EQEBE5NQ0XBMP5Q1o+QkRkEjVcEJw4drioTctHiIhMXMMFwXiZ1nYtHyEichoaPgjOXHZFrUsQEWloiQaBma02sz4z225mN0ccNzO7JTz+uJldcirvn2lt130BEZHTlFgQmFkL8EXgWqAbuN7Museddi2wLPxzI/CPp/I71BsQETl9SfYIVgLb3X2Hux8D7gbWjDtnDfBVD2wAOs3srHhvn1FvQERkEiQZBAuB/oLXA2HbqZ6Dmd1oZpvMbNNoW0vbjEksVUQkvZIMAoto8wmcg7vf5u497t4z2tZ53uWnWZ6IiECyQTAAnF3wehGwawLnjJGZ0qYN6EVEJlGSQbARWGZmS81sKvBOYO24c9YCvxU+PXQZcNDdd5d709b2MxUCIiKTKLHVR9192MzeD9wPtAC3u/tWM3tfePxW4D7gOmA7cAR4T1L1iIhItESXoXb3+wgu9oVttxZ878BNSdYgIiLlNfzMYhEROT0KAhGRlFMQiIiknIJARCTlFAQiIimnIBARSTkFgYhIyikIRERSTkEgIpJyFkzubRxmdgjoq3Udp2gOsL/WRZyCRqsXVHM1NFq9oJoLnePuc6MOJLrEREL6CpejbgRmtqmRam60ekE1V0Oj1QuqOS4NDYmIpJyCQEQk5RoxCG6rdQET0Gg1N1q9oJqrodHqBdUcS8PdLBYRkcnViD0CERGZRA0VBGa22sz6zGy7md1c63rKMbOzzWy9mT1pZlvN7I9qXVNcZtZiZj81s/+odS1xmFmnmX3DzP5f+Pf9C7WuqRwz++Pw/4knzOxrZjat1jWNZ2a3m9leM3uioG22mT1gZj8Lv55ZyxrHK1Hz34X/XzxuZv9uZp01LHGMqHoLjv2pmbmZzalGLQ0TBGbWAnwRuBboBq43s+7aVlXWMPDf3f1VwGXATXVeb6E/Ap6sdRGn4HPAOnc/H1hBHdduZguBDwI97n4hwTau76xtVZHuAFaPa7sZ+IG7LwN+EL6uJ3dQXPMDwIXufhHwFPCxahdVxh0U14uZnQ1cDeysViENEwTASmC7u+9w92PA3cCaGtdUkrvvdvfHwu8PEVycFta2qsrMbBHwy8CXa11LHGbWAVwB/BOAux9z96GaFlXZFOAMM5sCtAO7alxPEXd/EDgwrnkN8JXw+68Av1LNmiqJqtndv+fuw+HLDcCiqhdWQom/Y4C/Bz4CVO0GbiMFwUKgv+D1AA1wYQUwsyXAxcDDNS4ljs8S/E84UuM64joX2Af8czic9WUzm17rokpx9yzwaYJPe7uBg+7+vdpWFdt8d98NwQcdYF6N6zlVvwN8t9ZFlGNmbwGy7r65mr+3kYLAItrq/pEnM5sBfBP4kLvnal1POWb2JmCvuz9a61pOwRTgEuAf3f1i4DD1N2RxUjiuvgZYCrwCmG5mv1Hbqpqfmf0ZwXDtXbWupRQzawf+DPiLav/uRgqCAeDsgteLqMMudSEzayUIgbvc/d5a1xPDa4G3mNmzBENvbzCzO2tbUkUDwIC7j/a2vkEQDPXql4Bn3H2fux8H7gUur3FNce0xs7MAwq97a1xPLGb2buBNwLu8vp+XP4/gA8Lm8N/gIuAxM1uQ9C9upCDYCCwzs6VmNpXgBtvaGtdUkpkZwbj1k+7+mVrXE4e7f8zdF7n7EoK/3x+6e11/WnX354F+M1seNl0FbKthSZXsBC4zs/bw/5GrqOOb2+OsBd4dfv9u4Fs1rCUWM1sNfBR4i7sfqXU95bj7Fnef5+5Lwn+DA8Al4f/jiWqYIAhv+LwfuJ/gH8497r61tlWV9VrgNwk+VfeGf66rdVFN6gPAXWb2OPAa4H/WtpzSwp7LN4DHgC0E/wbrbvarmX0N+C9guZkNmNnvAp8ErjaznxE81fLJWtY4XomavwDMBB4I/w3eWtMiC5Sotza11HdPSUREktYwPQIREUmGgkBEJOUUBCIiKacgEBFJOQWBiEjKKQhERFJOQSAiknIKAhHAzNaY2UW1rmO8eq1LmsuUWhcgUifOAdaa2RnA3wBtwAvu/ue1Latu65Imoh6BNDwz+1G41Pfo67eGuzudH3HuNWb2EzPbZGZbzOyOcBeoZ8IFyT4A/Ku73wQU/fxp1lmVusb/fYhUoiCQZnQ9sIlxO3+Z2a8BnwLe7e49BOsS/QyY5u7fDk+7ANgSLmw42YuU1WtdknJaa0ganpn9CPhtd3823P/haYJF0b7u7svDc6aH7VeVW6zQzH4ZeAfBxfYWd5+UlUGrWVfh38dk1C7NT/cIpNn8CvB9d3/czA6b2SXhlqHXAZsrrVjr7t8BvpOiukQ0NCRN53rgnvD7e8LXEAytPDF6kpndYmZPmNmGif4iM/t++B7j/0TtpV21ukROlXoE0jTMrAtYCbwtbPo34Mdm9hHgJYJ16QFw9w+Gm5a8N+Z7n+nuLxS2ufsv1boukcmgHoE0k7cD97n7UQB3fwZ4HngdwYZGbzOzV8DJHeSuJtggJo6/r5e6zOzLp1GLSBH1CKSZXA9cFO73OqoLuMHd/8DM/hxYZ2YngOMET/D8S7i39MeBdmCqu/+hmZ1NsIn4QeBHwPlm9qfu/ukq1lU0dyBsO9/M/orgMdIPF9S5zt2/P4H6JOUUBNI03P31FY7fBdw1vt3MbgLOAIaAc8Pm84FjwC3APOBOd/9Clev6CMHcgU1m9o2w+WLgG+7+WTP7EnDZaJ3uvnMi9YkoCESCi+tNo0M3AO7+gJn1E+x5+zDwYA3qugD43Li5AyuBx8Pv293962a2BfiCmf2Bu2drUKc0OAWBNIM7CD7NT9S3gDvCC/8P3X2dmf0t0ALsJHiq571mtn+y5hXEdA/BxvZHgE+EbRcAC8zsHcA/jatzb3jOHZze34ekjCaUiYiknJ4aEhFJOQWBiEjKKQhERFJOQSAiknIKAhGRlFMQiIiknIJARCTlFAQiIimnIBARSbn/D9n8eepQ2WDjAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ac = loadmat('./data/dGPredictor_stereo.mat')\n",
"\n",
"S = ac['train_S']\n",
"\n",
"df_S = pd.DataFrame(ac['train_S'])\n",
"df_S_unique = df_S.T.drop_duplicates().T\n",
"unque_cols = df_S_unique.columns.values.tolist()\n",
"S = S[:, unque_cols]\n",
"\n",
"G = ac['G']\n",
"\n",
"b_list = json.load(open('./data/median_b_extended.json'))\n",
"b = np.asarray(b_list)\n",
"b = np.reshape(b,(-1,1))\n",
"\n",
"m, n = S.shape\n",
"assert G.shape[0] == m\n",
"assert b.shape == (n, 1)\n",
"\n",
"STG = np.dot(S.T,G)\n",
"\n",
"X = STG\n",
"y = b\n",
"\n",
"alphas = np.logspace(-6, 6, 200)\n",
"\n",
"clf = RidgeCV(alphas=alphas, fit_intercept=False).fit(X, y)\n",
"# print(clf.alpha_)\n",
"clf_new = Ridge(alpha=clf.alpha_,fit_intercept=False)\n",
"\n",
"# y_pred = clf.predict(X)\n",
"scores = -cross_val_score(clf_new, X, y, cv=LeaveOneOut(), scoring='neg_mean_absolute_error')\n",
"\n",
"print('median of cv is: ', median(scores))\n",
"print('mean of cv is: ', mean(scores))\n",
"\n",
"x = np.sort(scores)\n",
"y = 1. * np.arange(len(x)) / (len(x) - 1)\n",
"\n",
"fig = plt.figure(figsize=(6,6))\n",
"plt.xlim(right=15)\n",
"plt.plot(x,y,marker='.',linestyle='none',color=\"burlywood\")\n",
"plt.axhline(y=0.5,linewidth=1,color='grey')\n",
"plt.xlabel('|$\\Delta G^{\\'o}_{est} - \\Delta G^{\\'o}_{obs}$|')\n",
"plt.ylabel('Cumulative distribution')\n",
"# fig.savefig('./figures/cross_validation_ridge.jpg')\n",
"# plt.show()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## M2-linearmodel regression analysis "
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean squared error: 24.60\n"
]
},
{
"data": {
"text/plain": [
"Text(0.7, 0.25, '$R^2$ = 0.9994')"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"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": [
"grp_inc = loadmat('./data/radius2_mat_data_modified_manual.mat')\n",
"\n",
"b = grp_inc['b']\n",
"G = grp_inc['G_inc_r2_compar'] #group incidence matrix for training data\n",
"X = grp_inc['X_train']\n",
"\n",
"\n",
"# G = grp_inc['G_inc'] #group incidence matrix for KEGG data \n",
"# X = grp_inc['X_all']\n",
"\n",
"y = b\n",
"\n",
"alphas = np.logspace(-6, 6, 200)\n",
"reg = RidgeCV(alphas=alphas, fit_intercept=False ).fit(X, y)\n",
"\n",
"\n",
"plt.hist(reg.coef_[0][0:1420], bins=50, color = 'tomato')#for ridgeCV\n",
"\n",
"\n",
"plt.xlabel('$\\Delta_g G^o$')\n",
"plt.ylabel('Count')\n",
"# plt.savefig('./figures/ridge_group_info_radius2_manual_correct_new_color.png')\n",
"\n",
"predicted= reg.predict(X)\n",
"\n",
"mse = mean_squared_error(y, predicted)\n",
"r2 = r2_score(y, predicted)\n",
"\n",
"print('Mean squared error: %.2f'\n",
" % mse)\n",
"# The coefficient of determination: 1 is perfect prediction\n",
"# print('Coefficient of determination: %.4f'\n",
"# % r2)\n",
"\n",
"fig, ax = plt.subplots()\n",
"# ax.scatter(y, predicted, color = 'burlywood')\n",
"ax.scatter(y, predicted, color = 'tomato')\n",
"ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=1,)\n",
"ax.set_xlabel('Measured $\\Delta_r G^o$')\n",
"ax.set_ylabel('Predicted $\\Delta_r G^o$')\n",
"plt.figtext(.7, .2, \"MSE = %.2f\" % mse)\n",
"plt.figtext(.7, .25, \"$R^2$ = %.4f\" % r2)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## M2-linear cross-validation "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.46595256686646774\n",
"median of cv is: 15.459406503468742\n",
"mean of cv is: 35.96342098706781\n"
]
},
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Cumulative distribution')"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ac = loadmat('./data/radius2_mat_data_modified_manual.mat')\n",
"S = ac['train_S']\n",
"\n",
"G = grp_inc['G_inc_r2_compar']\n",
"\n",
"df_S = pd.DataFrame(ac['train_S'])\n",
"df_S_unique = df_S.T.drop_duplicates().T\n",
"unque_cols = df_S_unique.columns.values.tolist()\n",
"S = S[:, unque_cols]\n",
"\n",
"\n",
"b_list = json.load(open('./data/median_b_manual_correction_r2.json'))\n",
"b = np.asarray(b_list)\n",
"b = np.reshape(b,(-1,1))\n",
"\n",
"m, n = S.shape\n",
"assert G.shape[0] == m\n",
"assert b.shape == (n, 1)\n",
"\n",
"STG = np.dot(S.T,G)\n",
"\n",
"X = STG\n",
"y = b\n",
"\n",
"alphas = np.logspace(-6, 6, 200)\n",
"\n",
"clf = RidgeCV(alphas=alphas, fit_intercept=False).fit(X, y)\n",
"print(clf.alpha_)\n",
"clf_new = Ridge(alpha=clf.alpha_,fit_intercept=False)\n",
"\n",
"scores = -cross_val_score(clf_new, X, y, cv=LeaveOneOut(), scoring='neg_mean_absolute_error')\n",
"print('median of cv is: ', median(scores))\n",
"print('mean of cv is: ', mean(scores))\n",
"\n",
"x = np.sort(scores)\n",
"y = 1. * np.arange(len(x)) / (len(x) - 1)\n",
"\n",
"fig = plt.figure(figsize=(6,6))\n",
"plt.xlim(right=40)\n",
"# plt.plot(x,y,marker='.',linestyle='none',color=\"burlywood\")\n",
"plt.plot(x,y,marker='.',linestyle='none',color=\"tomato\")\n",
"plt.axhline(y=0.5,linewidth=1,color='grey')\n",
"plt.xlabel('|$\\Delta G^{\\'o}_{est} - \\Delta G^{\\'o}_{obs}$|')\n",
"plt.ylabel('Cumulative distribution')\n",
"# fig.savefig('./figures/cross_validation_ridge_radius2.jpg')\n",
"# plt.show()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## M-1,2-Linear model regression "
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"radius 1+2 linear model\n",
"Mean squared error: 9.60\n",
"Coefficient of determination: 0.9998\n"
]
},
{
"data": {
"text/plain": [
"Text(0.7, 0.25, '$R^2$ = 0.9998')"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAELCAYAAAA2mZrgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAWNklEQVR4nO3dfZBdd33f8fcHGctgoEh4pSqSqeSpSrCY4sDGNbhNGoxjhabIpHEqtylKa6o+OCQkTRq5bod0UrVO8zDkyTCqoQhKcBWKawVSG0XBtJ0hFusHbMu2KtkCeyNF2niSAiEjIvfbP+7R8fVqV7qyde7d1b5fM3fOOb/zO9ffn+9qP3vOPQ+pKiRJAnjJqAuQJM0dhoIkqWUoSJJahoIkqWUoSJJahoIkqXXeqAt4MS666KJavXr1qMuQpHnlvvvu+6OqGptp3bwOhdWrVzMxMTHqMiRpXkny1dnWefhIktQyFCRJLUNBktQyFCRJLUNBktQyFCRJLUNBktQyFCRJrXl98ZqkBeY962duv+2u4dZxDnNPQZLUMhQkSS1DQZLUMhQkSS1DQZLU6jQUkvxEkr1JHknyySQXJFmaZFeS/c10SV//m5IcSLIvyTVd1iZJOllnoZBkJfBjwHhVvQFYBGwEtgC7q2otsLtZJsmlzfp1wHrg1iSLuqpPknSyrg8fnQe8LMl5wMuBQ8AGYHuzfjtwbTO/Abi9qo5V1UHgAHB5x/VJkvp0FgpV9QfALwJPAYeB/1tVnwOWV9Xhps9hYFmzyUrg6b63mGzanifJ5iQTSSampqa6Kl+SFqQuDx8toffX/xrg24ALk/zwqTaZoa1OaqjaVlXjVTU+NjbjI0YlSS9Ql4eP3g4crKqpqvpz4NPAW4EjSVYANNOjTf9J4OK+7VfRO9wkSRqSLkPhKeCKJC9PEuAq4DFgJ7Cp6bMJuLOZ3wlsTLI4yRpgLbCnw/okSdN0dkO8qro3yaeA+4HjwAPANuAVwI4kN9ALjuua/nuT7AAebfrfWFXPdlWfJOlknd4ltareD7x/WvMxensNM/XfCmztsiZJ0uy8olmS1DIUJEktQ0GS1DIUJEktQ0GS1DIUJEktQ0GS1DIUJEktQ0GS1DIUJEktQ0GS1DIUJEktQ0GS1DIUJEktQ0GS1OryGc2vS/Jg3+trSd6XZGmSXUn2N9MlfdvclORAkn1JrumqNknSzDoLharaV1WXVdVlwJuBbwJ3AFuA3VW1FtjdLJPkUmAjsA5YD9yaZFFX9UmSTjasw0dXAU9U1VeBDcD2pn07cG0zvwG4vaqOVdVB4ABw+ZDqkyQxvFDYCHyymV9eVYcBmumypn0l8HTfNpNNmyRpSDoPhSTnA+8Efut0XWdoqxneb3OSiSQTU1NTZ6NESVJjGHsK3wfcX1VHmuUjSVYANNOjTfskcHHfdquAQ9PfrKq2VdV4VY2PjY11WLYkLTzDCIXree7QEcBOYFMzvwm4s699Y5LFSdYAa4E9Q6hPktQ4r8s3T/Jy4Grgn/Q13wLsSHID8BRwHUBV7U2yA3gUOA7cWFXPdlmfJOn5Og2Fqvom8Jppbc/QOxtppv5bga1d1iRJmp1XNEuSWoaCJKllKEiSWoaCJKllKEiSWoaCJKllKEiSWoaCJKllKEiSWoaCJKllKEiSWoaCJKllKEiSWoaCJKllKEiSWoaCJKnVaSgkeXWSTyV5PMljSd6SZGmSXUn2N9Mlff1vSnIgyb4k13RZmyTpZF3vKfwKcFdVfTvwRuAxYAuwu6rWArubZZJcCmwE1gHrgVuTLOq4PklSn85CIcmrgO8CPgxQVd+qqj8BNgDbm27bgWub+Q3A7VV1rKoOAgeAy7uqT5J0si73FC4BpoD/nOSBJLcluRBYXlWHAZrpsqb/SuDpvu0nmzZJ0pB0GQrnAW8CPlhV3wH8Kc2hollkhrY6qVOyOclEkompqamzU6kkCeg2FCaByaq6t1n+FL2QOJJkBUAzPdrX/+K+7VcBh6a/aVVtq6rxqhofGxvrrHhJWog6C4Wq+kPg6SSva5quAh4FdgKbmrZNwJ3N/E5gY5LFSdYAa4E9XdUnSTrZeR2//3uBTyQ5H3gS+If0gmhHkhuAp4DrAKpqb5Id9ILjOHBjVT3bcX2SpD6dhkJVPQiMz7Dqqln6bwW2dlmTJGl2XtEsSWoZCpKklqEgSWoZCpKklqEgSWoZCpKklqEgSWoZCpKklqEgSWoZCpKklqEgSWoZCpKklqEgSWoZCpKklqEgSWoZCpKkVqehkOQrSR5O8mCSiaZtaZJdSfY30yV9/W9KciDJviTXdFmbJOlkw9hT+J6quqyqTjyBbQuwu6rWArubZZJcCmwE1gHrgVuTLBpCfZKkxigOH20Atjfz24Fr+9pvr6pjVXUQOABcPvzyJGnh6joUCvhckvuSbG7allfVYYBmuqxpXwk83bftZNP2PEk2J5lIMjE1NdVh6ZK08JzX8ftfWVWHkiwDdiV5/BR9M0NbndRQtQ3YBjA+Pn7SeknSC9fpnkJVHWqmR4E76B0OOpJkBUAzPdp0nwQu7tt8FXCoy/okSc83UCgkuXKQtmnrL0zyyhPzwPcCjwA7gU1Nt03Anc38TmBjksVJ1gBrgT2D1CdJOjsGPXz0a8CbBmjrtxy4I8mJ/85vVtVdSb4E7EhyA/AUcB1AVe1NsgN4FDgO3FhVzw48EknSi3bKUEjyFuCtwFiSn+xb9SrglKeLVtWTwBtnaH8GuGqWbbYCW09TsySpI6fbUzgfeEXT75V97V8DfrCroiRJo3HKUKiqLwBfSPLRqvrqkGqSJI3IoN8pLE6yDVjdv01Vva2LoiRJozFoKPwW8CHgNsAvfyXpHDVoKByvqg92WokkaeQGvXjtt5P88yQrmrucLk2ytNPKJElDN+iewomLzX66r62AS85uOZKkURooFKpqTdeFSJJGb6BQSPLumdqr6mNntxxJ0igNevjoO/vmL6B3RfL9gKEgSeeQQQ8fvbd/OclfAD7eSUWSpJF5obfO/ia9u5hKks4hg36n8Ns898CbRcDrgR1dFSVJGo1Bv1P4xb7548BXq2qyg3okSSM00OGj5sZ4j9O7U+oS4FtdFiVJGo1Bn7z2Q/SegnYd8EPAvUm8dbYknWMG/aL5ZuA7q2pTVb2b3rOW/80gGyZZlOSBJJ9plpcm2ZVkfzNd0tf3piQHkuxLcs2ZDkaS9OIMGgovqaqjfcvPnMG2Pw481re8BdhdVWuB3c0ySS4FNgLrgPXArUlO+XQ3SdLZNegv9ruS3J3kR5L8CPBZ4HdOt1GSVcDfonfL7RM2ANub+e3AtX3tt1fVsao6CBygt0ciSRqS0z2j+S8Dy6vqp5P8APDXgQBfBD4xwPt/APiXPP9Rnsur6jBAVR1OsqxpXwn8fl+/yaZtek2bgc0Ar33tawcoQZI0qNPtKXwA+DpAVX26qn6yqn6C3l7CB061YZLvB45W1X0D1pIZ2uqkhqptVTVeVeNjY2MDvrUkaRCnu05hdVU9NL2xqiaSrD7NtlcC70zyDnr3S3pVkv8CHEmyotlLWAGc+K5iEri4b/tVwKFBBiFJOjtOt6dwwSnWvexUG1bVTVW1qqpW0/sC+feq6oeBnTz3fIZNwJ3N/E5gY5LFSdbQu43GntPUJ0k6i04XCl9K8o+nNya5ARj0sNB0twBXJ9kPXN0sU1V76d0641HgLuDGqvJ50JI0RKc7fPQ+4I4kf5/nQmAcOB9416D/kaq6B7inmX+G3q23Z+q3Fdg66PtKks6uU4ZCVR0B3prke4A3NM2frarf67wySdLQDfo8hc8Dn++4FknSiL3Q5ylIks5BhoIkqWUoSJJahoIkqWUoSJJahoIkqWUoSJJahoIkqWUoSJJahoIkqWUoSJJahoIkqWUoSJJanYVCkguS7Eny5SR7k/zbpn1pkl1J9jfTJX3b3JTkQJJ9Sa7pqjZJ0sy63FM4Brytqt4IXAasT3IFsAXYXVVrgd3NMkkupffYznXAeuDWJIs6rE+SNE1noVA932gWX9q8CtgAbG/atwPXNvMbgNur6lhVHQQOAJd3VZ8k6WSdfqeQZFGSB4GjwK6quhdYXlWHAZrpsqb7SuDpvs0nmzZJ0pB0GgpV9WxVXQasAi5P8oZTdM9Mb3FSp2RzkokkE1NTU2epUkkSDOnso6r6E+Aeet8VHEmyAqCZHm26TQIX9222Cjg0w3ttq6rxqhofGxvrsmxJWnC6PPtoLMmrm/mXAW8HHgd2ApuabpuAO5v5ncDGJIuTrAHWAnu6qk+SdLLzOnzvFcD25gyilwA7quozSb4I7EhyA/AUcB1AVe1NsgN4FDgO3FhVz3ZYnyRpms5CoaoeAr5jhvZngKtm2WYrsLWrmiRJp+YVzZKkVpeHjyTphXnP+lFXsGAZCpLmv9lC5La7hlvHOcDDR5KklqEgSWoZCpKklqEgSWoZCpKklqEgSWoZCpKklqEgSWoZCpKklqEgSWoZCpKklqEgSWoZCpKkVpeP47w4yeeTPJZkb5Ifb9qXJtmVZH8zXdK3zU1JDiTZl+SarmqTJM2syz2F48C/qKrXA1cANya5FNgC7K6qtcDuZplm3UZgHbAeuLV5lKckaUg6C4WqOlxV9zfzXwceA1YCG4DtTbftwLXN/Abg9qo6VlUHgQPA5V3VJ0k62VC+U0iymt7zmu8FllfVYegFB7Cs6bYSeLpvs8mmTZI0JJ2HQpJXAP8NeF9Vfe1UXWdoqxneb3OSiSQTU1NTZ6tMSRIdh0KSl9ILhE9U1aeb5iNJVjTrVwBHm/ZJ4OK+zVcBh6a/Z1Vtq6rxqhofGxvrrnhJWoC6PPsowIeBx6rql/tW7QQ2NfObgDv72jcmWZxkDbAW2NNVfZKkk53X4XtfCfwD4OEkDzZt/wq4BdiR5AbgKeA6gKram2QH8Ci9M5durKpnO6xPkjRNZ6FQVf+bmb8nALhqlm22Alu7qkmSdGpe0SxJahkKkqSWoSBJahkKkqSWoSBJahkKkqSWoSBJahkKkqSWoSBJahkKkqSWoSBJahkKkqSWoSBJahkKkqSWoSBJahkKkqRWl4/j/EiSo0ke6WtbmmRXkv3NdEnfupuSHEiyL8k1XdUlSZpdl3sKHwXWT2vbAuyuqrXA7maZJJcCG4F1zTa3JlnUYW2SpBl0+TjO/5lk9bTmDcDfbOa3A/cAP9O0315Vx4CDSQ4AlwNf7Ko+SQvAe6b/Xdq47a7h1jGPDPs7heVVdRigmS5r2lcCT/f1m2zaTpJkc5KJJBNTU1OdFitJC81c+aI5M7TVTB2raltVjVfV+NjYWMdlSdLCMuxQOJJkBUAzPdq0TwIX9/VbBRwacm2StOANOxR2Apua+U3AnX3tG5MsTrIGWAvsGXJtkrTgdfZFc5JP0vtS+aIkk8D7gVuAHUluAJ4CrgOoqr1JdgCPAseBG6vq2a5qkyTNrMuzj66fZdVVs/TfCmztqh5J0ul1FgqSdFqznTKqkZkrZx9JkuYAQ0GS1DIUJEktQ0GS1DIUJEktQ0GS1DIUJEktQ0GS1DIUJEktr2iW1D2vXJ433FOQJLUMBUlSy8NHkhYen908K0NB0pnzO4JzloePJEmtObenkGQ98CvAIuC2qrplxCVJWig8rDS3QiHJIuA3gKuBSeBLSXZW1aOjrUxagDxEtCDNqVAALgcOVNWTAEluBzbQe3azdOZ/yc3Fv/y6rslf5noR5loorASe7lueBP5af4ckm4HNzeI3kuwbUm1ny0XAH426iLNs9GP6cM5m/9GM50zHcGZG/xmdfcMbU7efTb9hjekvzbZiroXCTP/n63kLVduAbcMp5+xLMlFV46Ou42w618Z0ro0HHNN8MRfGNNfOPpoELu5bXgUcGlEtkrTgzLVQ+BKwNsmaJOcDG4GdI65JkhaMOXX4qKqOJ/lR4G56p6R+pKr2jriss23eHvo6hXNtTOfaeMAxzRcjH1Oq6vS9JEkLwlw7fCRJGiFDQZLUMhQ6kuQXkjye5KEkdyR5dd+6m5IcSLIvyTV97W9O8nCz7leTDO3k6EEkuS7J3iT/L8l4X/vqJH+W5MHm9aG+dfNyTM26efk59Uvys0n+oO+zeUffuhnHNx8kWd/UfSDJllHX80Il+Urzs/RgkommbWmSXUn2N9MlQy2qqnx18AK+Fzivmf954Oeb+UuBLwOLgTXAE8CiZt0e4C30rtf4H8D3jXoc08b0euB1wD3AeF/7auCRWbaZr2Oat5/TtPH9LPBTM7TPOr65/qJ3EsoTwCXA+c04Lh11XS9wLF8BLprW9h+BLc38lhO/O4b1ck+hI1X1uao63iz+Pr1rLqB3247bq+pYVR0EDgCXJ1kBvKqqvli9n4aPAdcOu+5TqarHqmrgK8jn+Zjm7ec0oBnHN+KaBtXeDqeqvgWcuB3OuWIDsL2Z386Qf74MheH4R/T+ooSZb+WxsnlNztA+X6xJ8kCSLyT5G03bfB7TufQ5/WhzGPMjfYciZhvffDCfa5+ugM8lua+5hQ/A8qo6DNBMlw2zoDl1ncJ8k+R3gb84w6qbq+rOps/NwHHgEyc2m6F/naJ9qAYZ0wwOA6+tqmeSvBn470nWMb/HNKc/p36nGh/wQeDn6NX4c8Av0fsjZc6N4wzM59qnu7KqDiVZBuxK8vioCzIUXoSqevup1ifZBHw/cFVzqAFmv5XHJM8dYupvH6rTjWmWbY4Bx5r5+5I8AfwV5vGYmOOfU79Bx5fkPwGfaRbn8y1l5nPtz1NVh5rp0SR30Ds0diTJiqo63ByuPDrMmjx81JHmYUE/A7yzqr7Zt2onsDHJ4iRrgLXAnmY38etJrmjOZnk3MNtfsXNKkrHmWRgkuYTemJ6cz2PiHPmcml8qJ7wLeKSZn3F8w67vBTonboeT5MIkrzwxT+/klEfojWVT020Tw/75GvW37+fqi94Xd08DDzavD/Wtu5ne2RP76DtzBRin90PxBPDrNFecz5UXvV8qk/T2Co4AdzftfwfYS+8skPuBvz3fxzSfP6dp4/s48DDwEL1fNitON7758ALeAfyfpv6bR13PCxzDJc2/mS83/35ubtpfA+wG9jfTpcOsy9tcSJJaHj6SJLUMBUlSy1CQJLUMBUlSy1CQJLUMBUlSy1CQzlCSdyWpJN8+QN9rkvyvJBPNLZI/muSiZt3Lkvxykt9I8u+6r1w6PUNBOnPXAxP0rqSdVZLr6N0GeVNVjQOX0bsg6YKmy3uB36yqG4HTBow0DIaCdAaSvAL4buAGeuEwW78LgV8D/l5VPQlQVc9W1daqOnGX1XXAw82tGr45y1tJQ+UN8aQzcy3wu1X1UJI/TfKmqrp/hn7vAL5cVXtP8V47gG30AuE/nP1SpTNnKEhn5np6v8ih90v9enr3e5puHc/dfI4kvwq8DfhGVV0BUFWfBT7babXSGfLwkTSgJK+hd2vju5qm/wr83Vme0fxn/QtV9WPAT/H8B/RIc46hIA3uB4Hfqd7zI6jeYyz/EPiuJB9M8u+bJ88tAe4GfiDJtwE0wXE1M+9VSHOGh4+kwV0P/NUkX+lrew29PYfvrqo9Se6oqj8G/jjJvwbuSvIs8Of0zlj6+LCLls6Et86WXqQkHwX+Kb0/sn6hqv7ZaCuSXjj3FKQX727gw8DXgAdGXIv0ohgK0ov3UnrPCA7wsRHXIr0oHj6SJLU8+0iS1DIUJEktQ0GS1DIUJEktQ0GS1DIUJEktQ0GS1DIUJEmt/w8dC/59wObuRgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"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": [
"ac = loadmat('./data/Train_comb_NN_model.mat')\n",
"\n",
"y = ac['y']\n",
"y = y.flatten()\n",
"\n",
"alphas = np.logspace(-6, 6, 200)\n",
"\n",
"\n",
"Xrc = ac['X_comb_train']\n",
"regr_rcombined = RidgeCV(alphas=alphas,fit_intercept= False).fit(Xrc, y)\n",
"\n",
"y_pred_rc = regr_rcombined.predict(Xrc)\n",
"mse_rc = mean_squared_error(y, y_pred_rc)\n",
"r2 = r2_score(y, y_pred_rc)\n",
"\n",
"\n",
"print('radius 1+2 linear model')\n",
"print('Mean squared error: %.2f'\n",
" % mse_rc)\n",
"print('Coefficient of determination: %.4f'\n",
" % r2)\n",
"\n",
"plt.hist(regr_rcombined.coef_[0:1730], bins=50, color = 'tomato')#for ridgeCV\n",
"\n",
"plt.xlabel('$\\Delta_g G^o$')\n",
"plt.ylabel('Count')\n",
"# plt.savefig('./figures/ridge_group_info_radius2_manual_correct_new_color.png')\n",
"\n",
"fig, ax = plt.subplots()\n",
"# ax.scatter(y, predicted, color = 'burlywood')\n",
"ax.scatter(y, y_pred_rc, color = 'tomato')\n",
"ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=1,)\n",
"ax.set_xlabel('Measured $\\Delta_r G^o$')\n",
"ax.set_ylabel('Predicted $\\Delta_r G^o$')\n",
"plt.figtext(.7, .2, \"MSE = %.2f\" % mse_rc)\n",
"plt.figtext(.7, .25, \"$R^2$ = %.4f\" % r2)\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Leave one out cross-validation for M-1,2-linear model "
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"cross-validataion result : radius 1 + 2\n",
"median of cv is: 5.484989593126512\n",
"mean of cv is: 16.256106507029173\n"
]
}
],
"source": [
"r1_d = loadmat('./data/dGPredictor_stereo.mat')\n",
"r2_d = loadmat('./data/radius2_mat_data_modified_manual.mat')\n",
"S = r1_d['train_S']\n",
"\n",
"Gr1 = r1_d['G']\n",
"Gr2 = r2_d['G_inc_r2_compar']\n",
"\n",
"df_S = pd.DataFrame(r1_d['train_S'])\n",
"df_S_unique = df_S.T.drop_duplicates().T\n",
"unque_cols = df_S_unique.columns.values.tolist()\n",
"S = S[:, unque_cols]\n",
"\n",
"b_list = json.load(open('./data/median_b_manual_correction_r2.json')) # it will be same for both radius, it just remove all the repeated data points from the training data\n",
"b = np.asarray(b_list)\n",
"b = np.reshape(b,(-1,1))\n",
"\n",
"STG1 = np.dot(S.T, Gr1)\n",
"STG2 = np.dot(S.T, Gr2)\n",
"\n",
"\n",
"X1 = STG1\n",
"X2 = STG2\n",
"yy = b\n",
"yy = yy.flatten()\n",
"\n",
"\n",
"## cross validation combined moiety model\n",
"\n",
"XX = np.concatenate((X1, X2), axis =1)\n",
"\n",
"alphas = np.logspace(-6, 6, 200)\n",
"regr = RidgeCV(alphas=alphas,fit_intercept= False).fit(XX, yy)\n",
"\n",
"regr_cv = Ridge(alpha=regr.alpha_,fit_intercept=False)\n",
"scores_cv = -cross_val_score(regr_cv, XX, yy, cv=LeaveOneOut(), scoring='neg_mean_absolute_error')\n",
"\n",
"\n",
"print('cross-validataion result : radius 1 + 2')\n",
"print('median of cv is: ', median(scores_cv))\n",
"print('mean of cv is: ', mean(scores_cv))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## regression M1, M2, M1-2 non linear model "
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"radius 1 non-linear model\n",
"Mean squared error: 20.85\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\vuu10\\AppData\\Local\\Continuum\\anaconda3\\envs\\dGPredictor_py3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
" self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n"
]
}
],
"source": [
"ac = loadmat('./data/Train_comb_NN_model.mat')\n",
"\n",
"# M1 non-linear model \n",
"\n",
"y = ac['y']\n",
"y = y.flatten()\n",
"\n",
"Xr1 = ac['X_r1_train']\n",
"max_i = 1000\n",
"regrr1 = MLPRegressor(solver = 'lbfgs', max_iter = max_i).fit(Xr1, y)\n",
"y_predr1 = regrr1.predict(Xr1)\n",
"mser1 = mean_squared_error(y, y_predr1)\n",
"\n",
"print('radius 1 non-linear model')\n",
"print('Mean squared error: %.2f'\n",
" % mser1)\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"radius 2 non-linear model\n",
"Mean squared error: 6.91\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\vuu10\\AppData\\Local\\Continuum\\anaconda3\\envs\\dGPredictor_py3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
" self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n"
]
}
],
"source": [
"# M2 non-linear model \n",
"\n",
"Xr2 = ac['X_r2_train']\n",
"regrr2 = MLPRegressor(solver = 'lbfgs', max_iter = max_i).fit(Xr2, y)\n",
"y_predr2 = regrr2.predict(Xr2)\n",
"mser2 = mean_squared_error(y, y_predr2)\n",
"\n",
"print('radius 2 non-linear model')\n",
"print('Mean squared error: %.2f'\n",
" % mser2)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"radius 1+2 non-linear model\n",
"Mean squared error: 6.92\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\vuu10\\AppData\\Local\\Continuum\\anaconda3\\envs\\dGPredictor_py3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
" self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n"
]
}
],
"source": [
"## M1-2 non-linear model \n",
"\n",
"Xrc = ac['X_comb_train']\n",
"regr_rcombined = MLPRegressor(solver = 'lbfgs', max_iter = max_i).fit(Xrc, y)\n",
"y_pred_rc = regr_rcombined.predict(Xrc)\n",
"mse_rc = mean_squared_error(y, y_pred_rc)\n",
"\n",
"print('radius 1+2 non-linear model')\n",
"print('Mean squared error: %.2f'\n",
" % mse_rc)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## cross-validation NN models"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\vuu10\\AppData\\Local\\Continuum\\anaconda3\\envs\\dGPredictor_py3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
" self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n",
"C:\\Users\\vuu10\\AppData\\Local\\Continuum\\anaconda3\\envs\\dGPredictor_py3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
" self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n",
"C:\\Users\\vuu10\\AppData\\Local\\Continuum\\anaconda3\\envs\\dGPredictor_py3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
" self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n",
"C:\\Users\\vuu10\\AppData\\Local\\Continuum\\anaconda3\\envs\\dGPredictor_py3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
" self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n",
"C:\\Users\\vuu10\\AppData\\Local\\Continuum\\anaconda3\\envs\\dGPredictor_py3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
" self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n",
"C:\\Users\\vuu10\\AppData\\Local\\Continuum\\anaconda3\\envs\\dGPredictor_py3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
" self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n",
"C:\\Users\\vuu10\\AppData\\Local\\Continuum\\anaconda3\\envs\\dGPredictor_py3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
" self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n",
"C:\\Users\\vuu10\\AppData\\Local\\Continuum\\anaconda3\\envs\\dGPredictor_py3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
" self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n",
"C:\\Users\\vuu10\\AppData\\Local\\Continuum\\anaconda3\\envs\\dGPredictor_py3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
" self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n",
"C:\\Users\\vuu10\\AppData\\Local\\Continuum\\anaconda3\\envs\\dGPredictor_py3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
"\n",
"Increase the number of iterations (max_iter) or scale the data as shown in:\n",
" https://scikit-learn.org/stable/modules/preprocessing.html\n",
" self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n"
]
}
],
"source": [
"r1_d = loadmat('./data/dGPredictor_stereo.mat')\n",
"r2_d = loadmat('./data/radius2_mat_data_modified_manual.mat')\n",
"S = r1_d['train_S']\n",
"\n",
"Gr1 = r1_d['G']\n",
"Gr2 = r2_d['G_inc_r2_compar']\n",
"\n",
"df_S = pd.DataFrame(r1_d['train_S'])\n",
"df_S_unique = df_S.T.drop_duplicates().T\n",
"unque_cols = df_S_unique.columns.values.tolist()\n",
"S = S[:, unque_cols]\n",
"\n",
"b_list = json.load(open('./data/median_b_manual_correction_r2.json')) # it will be same for both radius, it just remove all the repeated data points from the training data\n",
"b = np.asarray(b_list)\n",
"b = np.reshape(b,(-1,1))\n",
"\n",
"STG1 = np.dot(S.T, Gr1)\n",
"STG2 = np.dot(S.T, Gr2)\n",
"\n",
"\n",
"X1 = STG1\n",
"X2 = STG2\n",
"yy = b\n",
"yy = yy.flatten()\n",
"\n",
"## cross validation r =1\n",
"regr_cvr1 = MLPRegressor(solver = 'lbfgs', max_iter = 1000).fit(X1, yy)\n",
"\n",
"scores_cv1 = -cross_val_score(regr_cvr1, X1, yy, cv=LeaveOneOut(), scoring='neg_mean_absolute_error')\n",
"\n",
"print('cross-validataion result : radius 1')\n",
"print('median of cv is: ', median(scores_cv1))\n",
"print('mean of cv is: ', mean(scores_cv1))\n",
"\n",
"\n",
"## cross validation r =2 \n",
"regr_cvr2 = MLPRegressor(solver = 'lbfgs', max_iter = 1000).fit(X2, yy)\n",
"\n",
"scores_cv2 = -cross_val_score(regr_cvr2, X2, yy, cv=LeaveOneOut(), scoring='neg_mean_absolute_error')\n",
"\n",
"print('cross-validataion result : radius 2')\n",
"print('median of cv is: ', median(scores_cv2))\n",
"print('mean of cv is: ', mean(scores_cv2))\n",
"\n",
"\n",
"## cross validation combined moiety model\n",
"\n",
"XX = np.concatenate((X1, X2), axis =1)\n",
"\n",
"regr_cv = MLPRegressor(solver = 'lbfgs', max_iter = 1000).fit(XX, yy)\n",
"scores_cv = -cross_val_score(regr_cv, XX, yy, cv=LeaveOneOut(), scoring='neg_mean_absolute_error')\n",
"\n",
"print('cross-validataion result : radius 1 + 2')\n",
"print('median of cv is: ', median(scores_cv))\n",
"print('mean of cv is: ', mean(scores_cv))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
|