A series of experiments with Julia and Python
0

Configure Feed

Select the types of activity you want to include in your feed.

Vectorization makes delta_w can't benefit from new w until next iteration

+248 -22
+248 -22
dl/hello_svm.ipynb
··· 480 480 }, 481 481 { 482 482 "cell_type": "code", 483 - "execution_count": 48, 483 + "execution_count": 159, 484 + "metadata": {}, 485 + "outputs": [], 486 + "source": [ 487 + "def cost(y, t, w, ld): return np.sum(is_misclassified(w, x, t)) + ld * np.sum(w ** 2, 0)" 488 + ] 489 + }, 490 + { 491 + "cell_type": "code", 492 + "execution_count": 161, 484 493 "metadata": {}, 485 494 "outputs": [], 486 495 "source": [ 487 - "def cost(y, t, w, ld): return np.sum(is_misclassified(w, x, t)) + ld * np.linalg.norm(w, ord=2)" 496 + "def cost(y, t, w, ld): return np.sum(is_misclassified(w, x, t)) + ld * (np.linalg.norm(w, ord=2) ** 2)" 488 497 ] 489 498 }, 490 499 { 491 500 "cell_type": "code", 492 - "execution_count": 26, 501 + "execution_count": 151, 493 502 "metadata": {}, 494 503 "outputs": [], 495 504 "source": [ ··· 498 507 }, 499 508 { 500 509 "cell_type": "code", 501 - "execution_count": 27, 510 + "execution_count": 152, 502 511 "metadata": {}, 503 512 "outputs": [], 504 513 "source": [ 505 - "def gradient(w, x, t, ld): \n", 506 - " return np.sum((2 * ld * w) - x * t.reshape(-1, 1) * is_misclassified(w, x, t), 0)" 514 + "def is_misclassified(w, x, t): return (np.multiply(t, np.dot(x, w)) < 1).astype(int).reshape(-1,1)" 515 + ] 516 + }, 517 + { 518 + "cell_type": "code", 519 + "execution_count": 127, 520 + "metadata": {}, 521 + "outputs": [], 522 + "source": [ 523 + "def gradient(w, x, t, ld): return np.sum((2 * ld * w) - x * t.reshape(-1, 1) * is_misclassified(w, x, t), 0)" 507 524 ] 508 525 }, 509 526 { ··· 518 535 }, 519 536 { 520 537 "cell_type": "code", 521 - "execution_count": 100, 538 + "execution_count": 165, 522 539 "metadata": {}, 523 540 "outputs": [ 524 541 { 525 542 "data": { 526 - "image/png": "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\n", 543 + "image/png": "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\n", 527 544 "text/plain": [ 528 - "<matplotlib.figure.Figure at 0x7f55ca5a42b0>" 545 + "<matplotlib.figure.Figure at 0x7f55c8109748>" 529 546 ] 530 547 }, 531 548 "metadata": {}, ··· 535 552 "data": { 536 553 "text/plain": [ 537 554 "(0,\n", 538 - " -0.5,\n", 539 - " 0.00020508697946143667,\n", 540 - " array([ 1.58876117, 3.17458055, 11.11863105]),\n", 541 - " array([ 3.19010824, 3.70734226, 19.91675431]))" 555 + " 0.0052996987356410084,\n", 556 + " array([ 1.75528648, 3.4784601 , 12.25751563]),\n", 557 + " array([0.87026183, 1.81400873, 6.99597773]))" 542 558 ] 543 559 }, 544 - "execution_count": 100, 560 + "execution_count": 165, 545 561 "metadata": {}, 546 562 "output_type": "execute_result" 547 563 } 548 564 ], 549 565 "source": [ 550 - "learning_rate = 1; nb_of_iterations = 100000\n", 566 + "learning_rate = 1; nb_of_iterations = 10000\n", 551 567 "\n", 552 568 "w = np.zeros(n_features)\n", 553 569 "costs = []\n", ··· 561 577 "\n", 562 578 "for epoch in range(1, nb_of_iterations):\n", 563 579 " ld = 1 / epoch\n", 580 + " \n", 581 + " # print((- learning_rate * ((2 * ld * w) - x * t.reshape(-1, 1) * is_misclassified(w, x, t))))\n", 582 + " \n", 564 583 " w = w - delta_w(w, x, t, learning_rate, ld)\n", 565 584 " w_cost.append((w, is_misclassified(w, x, t), delta_w(w, x, t, learning_rate, ld), cost(nn(x, w), t, w, ld)))\n", 566 585 " costs_mis.append(np.max(is_misclassified(w, x, t)) - 0.5)\n", ··· 569 588 " mis = is_misclassified(w_ref, x, t).reshape(-1, )\n", 570 589 " cost_ref = 0\n", 571 590 " not_same = 0.0\n", 572 - " for i, x_ in enumerate(x):\n", 591 + " delta_w_ref_sum = []\n", 592 + " for i, x_ in enumerate(x): \n", 573 593 " if (t[i] * np.dot(x[i], w_ref)) < 1:\n", 574 - " w_ref = w_ref + learning_rate * ( (x[i] * t[i]) + (-2 * ld * w_ref) )\n", 594 + " delta_w_ref = learning_rate * ( (x[i] * t[i]) + (-2 * ld * w_ref) )\n", 575 595 " cost_ref = 1\n", 576 596 " if mis[i] != 1:\n", 577 597 " not_same = 1.3\n", 578 598 " else:\n", 579 - " w_ref = w_ref + learning_rate * (-2 * ld * w_ref)\n", 599 + " delta_w_ref = learning_rate * (-2 * ld * w_ref)\n", 580 600 " if mis[i] != 0:\n", 581 601 " not_same = 1.3\n", 582 602 " \n", 603 + " w_ref = w_ref + delta_w_ref\n", 604 + " delta_w_ref_sum.append(delta_w_ref)\n", 605 + " # print(delta_w_ref)\n", 606 + " # print(delta_w_ref_sum) \n", 607 + " \n", 583 608 " costs_ref.append(cost_ref)\n", 584 609 " not_sames.append(not_same)\n", 585 - "\n", 586 - "plt.plot(costs_mis, 'o')\n", 610 + " \n", 611 + "# plt.plot(costs_mis, 'o')\n", 587 612 "plt.plot(costs, '.')\n", 588 613 "plt.plot(costs_ref, '|') \n", 589 - "plt.plot(not_sames, 's')\n", 614 + "# plt.plot(not_sames, 's')\n", 590 615 "plt.ylim(0.25, 1.5)\n", 591 616 "# plt.axes().set_yticklabels([])\n", 592 617 "plt.xlabel('Epoch')\n", 593 618 "plt.ylabel('Misclassified')\n", 594 619 "plt.show()\n", 595 620 "\n", 596 - "costs_ref[-1], costs_mis[-1], costs[-1], w_ref, w" 621 + "costs_ref[-1], costs[-1], w_ref, w" 597 622 ] 598 623 }, 599 624 { ··· 727 752 ], 728 753 "source": [ 729 754 "mis_raw.reshape(-1, 1).reshape(-1, )" 755 + ] 756 + }, 757 + { 758 + "cell_type": "code", 759 + "execution_count": 103, 760 + "metadata": {}, 761 + "outputs": [ 762 + { 763 + "data": { 764 + "text/plain": [ 765 + "array([0, 0, 0, 0, 0])" 766 + ] 767 + }, 768 + "execution_count": 103, 769 + "metadata": {}, 770 + "output_type": "execute_result" 771 + } 772 + ], 773 + "source": [ 774 + "(np.multiply(t, np.dot(x, w)) < 1).astype(int)" 775 + ] 776 + }, 777 + { 778 + "cell_type": "code", 779 + "execution_count": 104, 780 + "metadata": {}, 781 + "outputs": [ 782 + { 783 + "data": { 784 + "text/plain": [ 785 + "array([[0.],\n", 786 + " [0.],\n", 787 + " [0.],\n", 788 + " [0.],\n", 789 + " [0.]])" 790 + ] 791 + }, 792 + "execution_count": 104, 793 + "metadata": {}, 794 + "output_type": "execute_result" 795 + } 796 + ], 797 + "source": [ 798 + "np.fmax(np.sign(1 - np.multiply(t, np.dot(x, w))), 0).reshape(-1,1)" 799 + ] 800 + }, 801 + { 802 + "cell_type": "code", 803 + "execution_count": 108, 804 + "metadata": {}, 805 + "outputs": [ 806 + { 807 + "data": { 808 + "text/plain": [ 809 + "array([[0, 0, 0],\n", 810 + " [0, 0, 0],\n", 811 + " [0, 0, 0],\n", 812 + " [0, 0, 0],\n", 813 + " [0, 0, 0]])" 814 + ] 815 + }, 816 + "execution_count": 108, 817 + "metadata": {}, 818 + "output_type": "execute_result" 819 + } 820 + ], 821 + "source": [ 822 + "x * t.reshape(-1, 1) * is_misclassified(w, x, t)" 823 + ] 824 + }, 825 + { 826 + "cell_type": "code", 827 + "execution_count": 111, 828 + "metadata": {}, 829 + "outputs": [ 830 + { 831 + "data": { 832 + "text/plain": [ 833 + "(array([[6.38028029e-05, 7.41475867e-05, 3.98339070e-04],\n", 834 + " [6.38028029e-05, 7.41475867e-05, 3.98339070e-04],\n", 835 + " [6.38028029e-05, 7.41475867e-05, 3.98339070e-04],\n", 836 + " [6.38028029e-05, 7.41475867e-05, 3.98339070e-04],\n", 837 + " [6.38028029e-05, 7.41475867e-05, 3.98339070e-04]]),\n", 838 + " array([0.00031901, 0.00037074, 0.0019917 ]))" 839 + ] 840 + }, 841 + "execution_count": 111, 842 + "metadata": {}, 843 + "output_type": "execute_result" 844 + } 845 + ], 846 + "source": [ 847 + "a = (2 * ld * w) - x * t.reshape(-1, 1) * is_misclassified(w, x, t)\n", 848 + "b = np.sum(a, 0)\n", 849 + "a, b" 850 + ] 851 + }, 852 + { 853 + "cell_type": "code", 854 + "execution_count": 114, 855 + "metadata": {}, 856 + "outputs": [ 857 + { 858 + "data": { 859 + "text/plain": [ 860 + "4.206066914461575e-08" 861 + ] 862 + }, 863 + "execution_count": 114, 864 + "metadata": {}, 865 + "output_type": "execute_result" 866 + } 867 + ], 868 + "source": [ 869 + "cost(nn(x, w), t, w, ld)" 870 + ] 871 + }, 872 + { 873 + "cell_type": "code", 874 + "execution_count": 116, 875 + "metadata": {}, 876 + "outputs": [ 877 + { 878 + "data": { 879 + "text/plain": [ 880 + "(array([0.00010177, 0.00013745, 0.00396681]), 0)" 881 + ] 882 + }, 883 + "execution_count": 116, 884 + "metadata": {}, 885 + "output_type": "execute_result" 886 + } 887 + ], 888 + "source": [ 889 + "ld * w ** 2, 0" 890 + ] 891 + }, 892 + { 893 + "cell_type": "code", 894 + "execution_count": 125, 895 + "metadata": {}, 896 + "outputs": [ 897 + { 898 + "data": { 899 + "text/plain": [ 900 + "(array([ 3.19010824, 3.70734226, 19.91675431]),\n", 901 + " 420.5982793543892,\n", 902 + " 420.59827935438926)" 903 + ] 904 + }, 905 + "execution_count": 125, 906 + "metadata": {}, 907 + "output_type": "execute_result" 908 + } 909 + ], 910 + "source": [ 911 + "w, np.sum(w ** 2, 0), np.linalg.norm(w, ord=2) ** 2" 912 + ] 913 + }, 914 + { 915 + "cell_type": "code", 916 + "execution_count": 168, 917 + "metadata": {}, 918 + "outputs": [ 919 + { 920 + "data": { 921 + "text/plain": [ 922 + "(array([ 3.19010824, 3.70734226, 19.91675431]),\n", 923 + " [101.0, 1015.5, 4819.0, 8617.687500000002, 8072.150000000001],\n", 924 + " [0.004209559656618149,\n", 925 + " 0.004208675664246879,\n", 926 + " 0.004207791866348653,\n", 927 + " 0.004206908262878743,\n", 928 + " 0.004206024853792431])" 929 + ] 930 + }, 931 + "execution_count": 168, 932 + "metadata": {}, 933 + "output_type": "execute_result" 934 + } 935 + ], 936 + "source": [ 937 + "def nn(x, w): return np.sign(np.dot(x, w)).astype(int)\n", 938 + "x = np.array([[-2,4,-1], [4,1,-1], [1, 6, -1], [2, 4, -1], [6, 2, -1]])\n", 939 + "t = np.array([-1, -1, 1, 1, 1])\n", 940 + "def cost(y, t, w, ld): return np.sum(is_misclassified(w, x, t)) + ld * (np.linalg.norm(w, ord=2) ** 2)\n", 941 + "def is_misclassified(w, x, t): return (np.multiply(t, np.dot(x, w)) < 1).astype(int).reshape(-1,1)\n", 942 + "def gradient(w, x, t, ld): return np.sum((2 * ld * w) - x * t.reshape(-1, 1) * is_misclassified(w, x, t), 0)\n", 943 + "def delta_w(w, x, t, learning_rate, ld): return learning_rate * gradient(w, x, t, ld)\n", 944 + "\n", 945 + "learning_rate = 1; nb_of_iterations = 100000\n", 946 + "\n", 947 + "w = np.zeros(n_features)\n", 948 + "costs = []\n", 949 + "\n", 950 + "for epoch in range(1, nb_of_iterations):\n", 951 + " ld = 1 / epoch \n", 952 + " w = w - delta_w(w, x, t, learning_rate, ld)\n", 953 + " costs.append(cost(nn(x, w), t, w, ld))\n", 954 + "\n", 955 + "w, costs[:5], costs[-5:]" 730 956 ] 731 957 }, 732 958 {