Skip to content

Instantly share code, notes, and snippets.

@vene
Created June 30, 2016 15:27
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vene/ebfcdb7e50676d391cc407e780948d21 to your computer and use it in GitHub Desktop.
Save vene/ebfcdb7e50676d391cc407e780948d21 to your computer and use it in GitHub Desktop.
simple cd solver for l2-regularized linear models
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# CD for simple linear model with L2 regularization\n",
"# Author: Vlad Niculae <vlad@vene.ro>\n",
"# License: Simplified BSD"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"rng = np.random.RandomState(0)\n",
"X = rng.randn(50, 10)\n",
"w_true = rng.randn(10)\n",
"w_init = np.zeros_like(w_true)\n",
"\n",
"y = np.dot(X, w_true)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class SquaredLoss(object):\n",
" def loss(self, pred, true):\n",
" return (pred - true) ** 2\n",
" \n",
" def dloss(self, pred, true):\n",
" return (pred - true)\n",
" \n",
" mu = 1\n",
" \n",
"class LogisticLoss(object):\n",
" def loss(self, pred, true):\n",
" return np.log(1 + np.exp(-pred * true))\n",
" \n",
" def dloss(self, pred, true):\n",
" return true * ((1 / (1 + np.exp(-pred * true))) - 1)\n",
" \n",
" mu = 1 / 4\n",
" \n",
"class SquaredHinge(object):\n",
" def loss(self, pred, true):\n",
" return np.maximum(1 - pred * true, 0) ** 2\n",
" \n",
" def dloss(self, pred, true):\n",
" return -2 * true * np.maximum(1 - pred * true, 0)\n",
" \n",
" mu = 2"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def cd(w_init, X, y, alpha=1, loss=SquaredLoss(), max_iter=10):\n",
" y_pred = np.dot(X, w_init)\n",
" \n",
" n_samples, n_features = X.shape\n",
" \n",
" w = w_init.copy()\n",
" \n",
" losses = []\n",
" viols = []\n",
" \n",
" for n_iter in range(max_iter):\n",
" viol_sum = 0\n",
" for j in range(n_features):\n",
" grad_loss = loss.dloss(y_pred, y)\n",
" grad = np.dot(grad_loss, X[:, j]) + 2 * alpha * w[j]\n",
" inv_step_size = loss.mu * (X[:, j] ** 2).sum() + 2 * alpha\n",
" step = grad / inv_step_size\n",
" w[j] -= step\n",
" viol_sum += np.abs(step)\n",
" # y_pred = np.dot(X, w)\n",
" y_pred -= step * X[:, j]\n",
" \n",
" viols.append(viol_sum)\n",
" losses.append(np.sum(loss.loss(y_pred, y)) + alpha * np.sum(w ** 2))\n",
" \n",
" return w, losses, viols"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"w_fit, losses, viols = cd(w_init, X, y, max_iter=100, alpha=0.1)"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x1c725045d30>"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1c724ffde80>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.semilogy(losses, label=\"loss\")\n",
"plt.semilogy(viols, label=\"violation sum\")\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"w_fit, losses, viols = cd(w_init, X, np.sign(y), max_iter=1000, alpha=0.1, loss=LogisticLoss())"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1.0"
]
},
"execution_count": 92,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.mean(np.sign(np.dot(X, w_fit)) == np.sign(y))"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x1c727761e48>"
]
},
"execution_count": 93,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1c7276ae438>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.semilogy(losses, label=\"loss\")\n",
"plt.semilogy(viols, label=\"violation sum\")\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"w_fit, losses, viols = cd(w_init, X, np.sign(y), max_iter=1000, alpha=0.1, loss=SquaredHinge())"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x1c7278009b0>"
]
},
"execution_count": 95,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1c72507a828>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.semilogy(losses, label=\"loss\")\n",
"plt.semilogy(viols, label=\"violation sum\")\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1.0"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.mean(np.sign(np.dot(X, w_fit)) == np.sign(y))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment