{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3 (ipykernel)", "language": "python" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Example 1:Hinge and Square Loss\n", "This example try to show how to use our PLQ Composite Decomposition tool to decompose a given loss function and use ReHLine to do classification.\n", "\n", "Given a loss function $L(z)=\\max(\\max(1-z,0)),\\frac{1}{2} (1-z)^2 )$" ], "metadata": { "id": "PbYJX0P9pIkt" } }, { "cell_type": "code", "source": [ "import numpy as np\n", "\n", "z = np.linspace(-2, 2, 100)\n", "L1 = np.maximum(1 - z, 0)\n", "L2 = 0.5 * (1 - z) ** 2" ], "metadata": { "id": "Gq5d6d1Dohb4", "ExecuteTime": { "end_time": "2025-01-03T09:29:38.399205Z", "start_time": "2025-01-03T09:29:38.334920Z" } }, "outputs": [], "execution_count": 1 }, { "cell_type": "code", "source": [ "import matplotlib.pyplot as plt\n", "\n", "plt.figure(figsize=(4, 3))\n", "plt.plot(z, L1, marker='o', label='Hinge Loss')\n", "plt.plot(z, L2, marker='s', label='Square Loss')\n", "plt.plot(z, np.maximum(L1, L2), marker='^', label='PLQ Loss')\n", "plt.legend()\n", "plt.xlabel('z')\n", "plt.ylabel('L(z)')\n", "plt.title('Hinge Loss and Square Loss')\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 333 }, "id": "nhsfqRuypTnl", "outputId": "da9c80c0-50da-45aa-ffd2-1906cebe7e65", "ExecuteTime": { "end_time": "2025-01-03T09:29:38.801321Z", "start_time": "2025-01-03T09:29:38.499119Z" } }, "outputs": [ { "data": { "text/plain": [ "
" ], "image/png": "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" }, "metadata": {}, "output_type": "display_data" } ], "execution_count": 2 }, { "cell_type": "markdown", "source": [ "# 1.Data Generation" ], "metadata": { "id": "C5ElImTspYdZ" } }, { "cell_type": "code", "source": [ "from plqcom import PLQLoss, plq_to_rehloss, affine_transformation\n", "from rehline import ReHLine\n", "from rehline._base import _relu, _rehu" ], "metadata": { "id": "QfY_RJespVfU", "ExecuteTime": { "end_time": "2025-01-03T09:29:40.216870Z", "start_time": "2025-01-03T09:29:39.730665Z" } }, "outputs": [], "execution_count": 3 }, { "cell_type": "markdown", "source": [ "Generate a random classification dataset, where $\\mathbf{X} \\in \\mathbb{R}^{1000 \\times 3}$ and $\\mathbf{y} \\in \\mathbb\\{ -1, 1\\}^{1000}$" ], "metadata": { "id": "U5ZgBIUppmuv" } }, { "cell_type": "code", "source": [ "# Generate a random classification dataset\n", "n, d, C = 1000, 3, 0.5\n", "np.random.seed(1024)\n", "X = np.random.randn(n, d)\n", "beta = np.random.randn(d)\n", "y = np.sign(X.dot(beta) + np.random.randn(n))" ], "metadata": { "id": "17A5ayR9pgBQ", "ExecuteTime": { "end_time": "2025-01-03T09:29:40.221867Z", "start_time": "2025-01-03T09:29:40.219868Z" } }, "outputs": [], "execution_count": 4 }, { "cell_type": "markdown", "source": [ "First 10 samples of the dataset" ], "metadata": { "id": "-4OYO8UBpwFr" } }, { "cell_type": "code", "source": [ "X[:10], y[:10]" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "CFizuPc1ptq_", "outputId": "31e9258a-9039-495b-9a52-22c3551d986e", "ExecuteTime": { "end_time": "2025-01-03T09:29:40.600693Z", "start_time": "2025-01-03T09:29:40.597988Z" } }, "outputs": [ { "data": { "text/plain": [ "(array([[ 2.12444863, 0.25264613, 1.45417876],\n", " [ 0.56923979, 0.45822365, -0.80933344],\n", " [ 0.86407349, 0.20170137, -1.87529904],\n", " [-0.56850693, -0.06510141, 0.80681666],\n", " [-0.5778176 , 0.57306064, -0.33667496],\n", " [ 0.29700734, -0.37480416, 0.15510474],\n", " [ 0.70485719, 0.8452178 , -0.65818079],\n", " [ 0.56810558, 0.51538125, -0.61564998],\n", " [ 0.92611427, -1.28591285, 1.43014026],\n", " [-0.4254975 , -0.40257712, 0.60410409]]),\n", " array([ 1., -1., -1., -1., -1., 1., -1., -1., 1., 1.]))" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 5 }, { "cell_type": "code", "source": [ "X[:10].dot(beta)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4QPDq3SEpz0G", "outputId": "1d7ab75d-fb34-44f9-de3a-f5ac921f65ff", "ExecuteTime": { "end_time": "2025-01-03T09:29:40.823299Z", "start_time": "2025-01-03T09:29:40.820722Z" } }, "outputs": [ { "data": { "text/plain": [ "array([ 4.63095617, -1.53086335, -3.77183917, 1.49927261, -1.1677152 ,\n", " 0.56448038, -1.12647624, -1.09186115, 3.93541798, 1.1463427 ])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 6 }, { "cell_type": "markdown", "source": [ "# 2. Create and Decompose the PLQ Loss" ], "metadata": { "id": "uoC-YmtWp4BX" } }, { "cell_type": "markdown", "source": [ "Create the PLQ Loss object with the given quad_coef only (max form)." ], "metadata": { "id": "SCD8J7fkp6sj" } }, { "cell_type": "code", "source": [ "plqloss_1 = PLQLoss(\n", " quad_coef={'a': np.array([0., 0., 0.5]), 'b': np.array([0., -1., -1.]), 'c': np.array([0., 1., 0.5])},\n", " form='max')" ], "metadata": { "id": "M4LGj1qOp2bQ", "ExecuteTime": { "end_time": "2025-01-03T09:29:41.442925Z", "start_time": "2025-01-03T09:29:41.439763Z" } }, "outputs": [], "execution_count": 7 }, { "cell_type": "markdown", "source": [ "We can also create the PLQ Loss object with the given quad_coef and cutpoints.(plq form)" ], "metadata": { "id": "nz7pL1UoqG-r" } }, { "cell_type": "code", "source": [ "plqloss_2 = PLQLoss(\n", " quad_coef={'a': np.array([0.5, 0., 0.5]), 'b': np.array([-1., -1., -1.]), 'c': np.array([0.5, 1., 0.5])},\n", " cutpoints=np.array([-1., 1.]),\n", " form='plq')" ], "metadata": { "id": "PgOzSB9LqDVA", "ExecuteTime": { "end_time": "2025-01-03T09:29:41.866365Z", "start_time": "2025-01-03T09:29:41.864555Z" } }, "outputs": [], "execution_count": 8 }, { "cell_type": "markdown", "source": [ "Convert the PLQ Loss to ReHLoss by calling its method plq_to_rehloss)" ], "metadata": { "id": "3OWDQ85iqM1Q" } }, { "cell_type": "code", "source": [ "rehloss_1 = plq_to_rehloss(plqloss_1)\n", "rehloss_2 = plq_to_rehloss(plqloss_2)" ], "metadata": { "id": "evyg4IdlqE3M", "ExecuteTime": { "end_time": "2025-01-03T09:29:42.528252Z", "start_time": "2025-01-03T09:29:42.525885Z" } }, "outputs": [], "execution_count": 9 }, { "cell_type": "code", "source": [ "rehloss_1.relu_coef, rehloss_1.relu_intercept, rehloss_1.rehu_cut, rehloss_1.rehu_coef, rehloss_1.rehu_intercept\n", "rehloss_2.relu_coef, rehloss_2.relu_intercept, rehloss_2.rehu_cut, rehloss_2.rehu_coef, rehloss_2.rehu_intercept" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "QFwP-3CPqOuz", "outputId": "dd888a9d-b2ce-43a0-a385-b0d57875dd82", "ExecuteTime": { "end_time": "2025-01-03T09:29:42.738769Z", "start_time": "2025-01-03T09:29:42.736081Z" } }, "outputs": [ { "data": { "text/plain": [ "(array([[-1.],\n", " [-1.]]),\n", " array([[ 1.],\n", " [-1.]]),\n", " array([[inf],\n", " [inf]]),\n", " array([[-1.],\n", " [ 1.]]),\n", " array([[-1.],\n", " [-1.]]))" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 10 }, { "cell_type": "code", "source": [ "rehloss_1.rehu_coef == rehloss_2.rehu_coef" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "QsDOyXPSqQZd", "outputId": "8eb68269-1cfe-4a8f-b95b-c447ee5147b4", "ExecuteTime": { "end_time": "2025-01-03T09:29:42.949791Z", "start_time": "2025-01-03T09:29:42.947475Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[ True],\n", " [ True]])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 11 }, { "cell_type": "code", "source": [ "plt.figure(figsize=(8, 3))\n", "plt.subplot(1, 2, 1)\n", "Z = np.linspace(-2, 2, 1000)\n", "L = plqloss_1(Z)\n", "plt.plot(Z, L)\n", "plt.title('Original PLQ Loss')\n", "\n", "plt.subplot(1, 2, 2)\n", "relu_coef, relu_intercept = rehloss_1.relu_coef, rehloss_1.relu_intercept\n", "rehu_cut, rehu_coef, rehu_intercept = rehloss_1.rehu_cut, rehloss_1.rehu_coef, rehloss_1.rehu_intercept\n", "Reh = np.sum(_rehu(rehu_coef * Z + rehu_intercept, rehu_cut), axis=0) + np.sum(_relu(relu_coef * Z + relu_intercept),\n", " axis=0)\n", "plt.plot(Z, Reh)\n", "plt.title('ReLU-ReHU Composition')\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 314 }, "id": "-6RJb_ULqSOd", "outputId": "e53f84c0-79bd-4c0d-9a21-d1fd41bacdc1", "ExecuteTime": { "end_time": "2025-01-03T09:29:43.481712Z", "start_time": "2025-01-03T09:29:43.352083Z" } }, "outputs": [ { "data": { "text/plain": [ "
" ], "image/png": "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" }, "metadata": {}, "output_type": "display_data" } ], "execution_count": 12 }, { "cell_type": "markdown", "source": [ "# 3.Broadcast to all samples" ], "metadata": { "id": "XJlQKg0gqWMs" } }, { "cell_type": "markdown", "source": [ "For this classication problem,\n", "$L(z)= \\max(\\max(1-z,0)),\\frac{1}{2} (1-z)^2 )$\n", "$L_i(z_i)=\\frac{1}{2} \\max(\\max(1-y_i z_i,0)),\\frac{1}{2} (1-y_i z_i)^2 )$\n", "Compare $L_i(z_i)$ with $L(z)$, we can find that $L_i(z_i)=\\frac{1}{2}L(y_i z_i)$ which is a affine transformation of $L(z)$ with $p=y_i, q=0,c=\\frac{1}{2}$." ], "metadata": { "id": "5BN_JlvSqYNx" } }, { "cell_type": "code", "source": [ "rehloss = affine_transformation(rehloss_1, n=X.shape[0], c=C, p=y, q=0)" ], "metadata": { "id": "VNpLNa4jqT24", "ExecuteTime": { "end_time": "2025-01-03T09:29:44.847006Z", "start_time": "2025-01-03T09:29:44.843357Z" } }, "outputs": [], "execution_count": 13 }, { "cell_type": "code", "source": [ "print(rehloss.relu_coef, rehloss.relu_intercept, rehloss.rehu_cut, rehloss.rehu_coef, rehloss.rehu_intercept)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "CFtFZGs1qaNp", "outputId": "08045a5c-eb20-4a03-99db-35ec7dc6a8dd", "ExecuteTime": { "end_time": "2025-01-03T09:29:45.110054Z", "start_time": "2025-01-03T09:29:45.106936Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-0.5 0.5 0.5 ... 0.5 0.5 -0.5]\n", " [-0.5 0.5 0.5 ... 0.5 0.5 -0.5]] [[ 0.5 0.5 0.5 ... 0.5 0.5 0.5]\n", " [-0.5 -0.5 -0.5 ... -0.5 -0.5 -0.5]] [[inf inf inf ... inf inf inf]\n", " [inf inf inf ... inf inf inf]] [[-0.70710678 0.70710678 0.70710678 ... 0.70710678 0.70710678\n", " -0.70710678]\n", " [ 0.70710678 -0.70710678 -0.70710678 ... -0.70710678 -0.70710678\n", " 0.70710678]] [[-0.70710678 -0.70710678 -0.70710678 ... -0.70710678 -0.70710678\n", " -0.70710678]\n", " [-0.70710678 -0.70710678 -0.70710678 ... -0.70710678 -0.70710678\n", " -0.70710678]]\n" ] } ], "execution_count": 14 }, { "cell_type": "markdown", "source": [ "# 4. Use ReHLine to solve the problem" ], "metadata": { "id": "chLsTblOqe5b" } }, { "cell_type": "code", "source": [ "clf = ReHLine()\n", "clf.U, clf.V, clf.Tau, clf.S, clf.T, clf.C = rehloss.relu_coef, rehloss.relu_intercept, rehloss.rehu_cut, rehloss.rehu_coef, rehloss.rehu_intercept, C\n", "clf.fit(X=X)\n", "print('sol privided by rehline: %s' % clf.coef_)\n", "print('decision_function: %s' % clf.decision_function([[.1, .2, .3]]))\n", "print('precision: %s' % (np.sum(np.sign(X.dot(clf.coef_)) == y) / n))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "L2pJ5YLdqbcw", "outputId": "bd91fb33-0082-4aea-f06d-e7b37edc1766", "ExecuteTime": { "end_time": "2025-01-03T09:29:45.587977Z", "start_time": "2025-01-03T09:29:45.582893Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sol privided by rehline: [ 0.20339926 -0.00843538 0.69527244]\n", "decision_function: [0.22723458]\n", "precision: 0.868\n" ] } ], "execution_count": 15 } ] }