Skip to content

Instantly share code, notes, and snippets.

@austinogilvie
Created October 30, 2013 19:30
Show Gist options
  • Select an option

  • Save austinogilvie/7238736 to your computer and use it in GitHub Desktop.

Select an option

Save austinogilvie/7238736 to your computer and use it in GitHub Desktop.
Fit a loess curve with Python. Posted to bitbucket by Jure Zbontar - http://bit.ly/1aIyNaH.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This code was originally shared on Bitbucket by [Jure \u017dbontar](https://bitbucket.org/jzbontar). \n",
"\n",
"You can checkout the original source here: [http://bit.ly/1aIyNaH](http://bit.ly/1aIyNaH)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%bash\n",
"\n",
"URL=\"https://bitbucket.org/jzbontar/ml-class/raw/7a2b7e7233280a70a5e9e1963b82859614b84388/data\"\n",
"FETCH_FILES=(\"ex1data1.txt\" \"ex2data1.txt\" \"q2y.dat\" \"q2x.dat\")\n",
"\n",
"for FILE_NAME in \"${FETCH_FILES[@]}\"; do\n",
" FILE_URL=\"${URL}/${FILE_NAME}\"\n",
" echo \"${FILE_URL}\"\n",
" echo\n",
" curl -O $FILE_URL\n",
"done"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"https://bitbucket.org/jzbontar/ml-class/raw/7a2b7e7233280a70a5e9e1963b82859614b84388/data/ex1data1.txt\n",
"\n",
"https://bitbucket.org/jzbontar/ml-class/raw/7a2b7e7233280a70a5e9e1963b82859614b84388/data/ex2data1.txt\n",
"\n",
"https://bitbucket.org/jzbontar/ml-class/raw/7a2b7e7233280a70a5e9e1963b82859614b84388/data/q2y.dat\n",
"\n",
"https://bitbucket.org/jzbontar/ml-class/raw/7a2b7e7233280a70a5e9e1963b82859614b84388/data/q2x.dat\n",
"\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
" Dload Upload Total Spent Left Speed\n",
"\r",
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r",
"100 1359 100 1359 0 0 1970 0 --:--:-- --:--:-- --:--:-- 4686\n",
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
" Dload Upload Total Spent Left Speed\n",
"\r",
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r",
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r",
"100 3775 100 3775 0 0 11107 0 --:--:-- --:--:-- --:--:-- 13062\n",
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
" Dload Upload Total Spent Left Speed\n",
"\r",
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r",
"100 1700 100 1700 0 0 7427 0 --:--:-- --:--:-- --:--:-- 9189\n",
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
" Dload Upload Total Spent Left Speed\n",
"\r",
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r",
"100 1700 100 1700 0 0 6710 0 --:--:-- --:--:-- --:--:-- 8457\n"
]
}
],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# %load https://bitbucket.org/jzbontar/ml-class/raw/7a2b7e7233280a70a5e9e1963b82859614b84388/mlclass/linear_regression.py"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"import scipy.sparse\n",
"from scipy.optimize import fmin_l_bfgs_b\n",
"\n",
"class LinearRegressionGD:\n",
" def __init__(self, lambda_=1, **fmin_args):\n",
" self.lambda_ = lambda_\n",
" self.fmin_args = fmin_args\n",
"\n",
" def cost_grad(self, theta, X, y):\n",
" m = X.shape[0]\n",
" theta1 = theta[1:]\n",
"\n",
" t = X.dot(theta) - y\n",
" j = (t.dot(t) + self.lambda_ * theta1.dot(theta1)) / (2.0 * m)\n",
"\n",
" grad = X.T.dot(t) / m\n",
" grad[1:] += self.lambda_ * theta1 / m\n",
"\n",
" return j, grad\n",
"\n",
" def fit(self, X, y):\n",
" theta = np.zeros(X.shape[1])\n",
" self.theta, j, ret = fmin_l_bfgs_b(self.cost_grad, theta, args=(X, y),\n",
" **self.fmin_args)\n",
"\n",
" def predict(self, X):\n",
" return X.dot(self.theta)\n",
"\n",
"\n",
"class LinearRegressionNE:\n",
" def __init__(self, lambda_=1):\n",
" self.lambda_ = lambda_\n",
"\n",
" def fit(self, X, y):\n",
" eye = np.eye(X.shape[1])\n",
" eye[0, 0] = 0.0\n",
" reg_term = self.lambda_ * eye\n",
" self.theta = np.linalg.pinv(X.T.dot(X) + reg_term).dot(y.dot(X))\n",
"\n",
" def predict(self, X):\n",
" return X.dot(self.theta)\n",
"\n",
"class LOESS:\n",
" def __init__(self, bandwidth):\n",
" self.bandwidth = bandwidth\n",
"\n",
" def fit(self, X, y):\n",
" self.X = X\n",
" self.y = y\n",
"\n",
" def predict(self, X_te):\n",
" X_tr, y_tr = self.X, self.y\n",
" y_te = []\n",
" for x in X_te:\n",
" ws = np.exp(-np.sum((X_tr - x)**2, axis=1) / (2 * self.bandwidth**2))\n",
" W = scipy.sparse.dia_matrix((ws, 0), shape=(X_tr.shape[0],) * 2)\n",
" theta = np.linalg.pinv(X_tr.T.dot(W.dot(X_tr))).dot(X_tr.T.dot(W.dot(y_tr)))\n",
" y_te.append(x.dot(theta))\n",
" return np.array(y_te)\n",
" \n",
"\n",
"if __name__ == '__main__':\n",
" def ex1():\n",
" import matplotlib.pyplot as plt\n",
" from data import load_txt\n",
"\n",
" X, y = load_txt('ex1data1.txt')\n",
" X = np.column_stack((np.ones(X.shape[0]), X))\n",
"\n",
" lr = LinearRegressionGD(lambda_=0)\n",
" #lr = LinearRegressionNE(lambda_=0)\n",
" lr.fit(X, y)\n",
" print(lr.predict(np.array([[1, 3.5], [1, 7]])))\n",
"\n",
" xs = [min(X[:, 1]), max(X[:, 1])]\n",
" ys = [lr.theta[0] + lr.theta[1] * x for x in xs]\n",
" plt.plot(xs, ys)\n",
"\n",
" plt.plot(X[:, 1], y, 'x')\n",
" plt.show()\n",
"\n",
" def ex1_multi():\n",
" from data import load_txt\n",
"\n",
" X, y = load_txt('ex2data1.txt')\n",
" X = (X - X.mean(axis=0)) / X.std(axis=0)\n",
" X = np.column_stack((np.ones(X.shape[0]), X))\n",
"\n",
" lr = LinearRegressionGD(lambda_=0)\n",
" #lr = LinearRegressionNE(lambda_=0)\n",
" lr.fit(X, y)\n",
"\n",
" def ps1_2():\n",
" import matplotlib.pyplot as plt\n",
"\n",
" y = np.loadtxt('q2y.dat')\n",
" X = np.loadtxt('q2x.dat')\n",
" X = np.column_stack((np.ones_like(y), X))\n",
"\n",
" cls = LOESS(0.75)\n",
" cls.fit(X, y)\n",
"\n",
" plt.plot(X[:,1], y, 'x')\n",
"\n",
" X = np.column_stack((np.ones(100), np.linspace(-5, 13, 100)))\n",
" y = cls.predict(X)\n",
" plt.plot(X[:,1], y)\n",
"\n",
" plt.show()\n",
"\n",
" ps1_2()\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x105a324d0>"
]
}
],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment