Skip to content

Instantly share code, notes, and snippets.

@chaobin
Created November 17, 2014 08:32
Show Gist options
  • Save chaobin/5fe5044bb6589ba9b5f9 to your computer and use it in GitHub Desktop.
Save chaobin/5fe5044bb6589ba9b5f9 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:6ce96623aa99d389925e6c1bf87c4613ae70c1e055642dcff2483f90c2b7f737"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"# the plot setup\n",
"%pylab inline\n",
"#import mpld3\n",
"#mpld3.enable_notebook()\n",
"import matplotlib.pyplot as plt\n",
"from pylab import rcParams\n",
"rcParams['figure.figsize'] = 8, 5"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"prompt_number": 56
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# data tools\n",
"\n",
"import math\n",
"import numpy as np\n",
"import pandas as pd\n",
"from pandas import DataFrame, Series"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# use data below to experiment with\n",
"# http://onlinestatbook.com/2/case_studies/data/sat.txt\n",
"\n",
"URL_GPA = \"http://onlinestatbook.com/2/case_studies/data/sat.txt\"\n",
"\n",
"def online_gpa():\n",
" import urllib2\n",
" source = urllib2.urlopen(URL_GPA)\n",
" df = DataFrame.from_csv(source, sep=' ', header=0, index_col=None)\n",
" return df\n",
"df_gpa = online_gpa()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"df_gpa.head()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>high_GPA</th>\n",
" <th>math_SAT</th>\n",
" <th>verb_SAT</th>\n",
" <th>comp_GPA</th>\n",
" <th>univ_GPA</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> 3.45</td>\n",
" <td> 643</td>\n",
" <td> 589</td>\n",
" <td> 3.76</td>\n",
" <td> 3.52</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> 2.78</td>\n",
" <td> 558</td>\n",
" <td> 512</td>\n",
" <td> 2.87</td>\n",
" <td> 2.91</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 2.52</td>\n",
" <td> 583</td>\n",
" <td> 503</td>\n",
" <td> 2.54</td>\n",
" <td> 2.40</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td> 3.67</td>\n",
" <td> 685</td>\n",
" <td> 602</td>\n",
" <td> 3.83</td>\n",
" <td> 3.47</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td> 3.24</td>\n",
" <td> 592</td>\n",
" <td> 538</td>\n",
" <td> 3.29</td>\n",
" <td> 3.47</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"text": [
" high_GPA math_SAT verb_SAT comp_GPA univ_GPA\n",
"0 3.45 643 589 3.76 3.52\n",
"1 2.78 558 512 2.87 2.91\n",
"2 2.52 583 503 2.54 2.40\n",
"3 3.67 685 602 3.83 3.47\n",
"4 3.24 592 538 3.29 3.47"
]
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def std_deviation(data):\n",
" \"\"\"\n",
" Calculates the standard deviation of data.\n",
" \n",
" Note pandas has std() itself.\n",
" \n",
" data\n",
" pandas.DataFrame\n",
" \n",
" return\n",
" numpy.float\n",
" \"\"\"\n",
" normalizer = data.shape[0] - 1 # because the data could be a sample of a larger parent set\n",
" std = (data - data.mean()).pow(2).sum() / normalizer\n",
" assert np.round(np.sqrt(std), 6) == np.round(data.std(), 6)\n",
" return np.sqrt(std)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"std_deviation(df_gpa.high_GPA)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 5,
"text": [
"0.51659782715214253"
]
}
],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def pearson_r(col_x, col_y):\n",
" \"\"\"\n",
" Calculate the Pearson Correlation between x and y.\n",
" \n",
" http://onlinestatbook.com/2/describing_bivariate_data/calculation.html\n",
" \n",
" col_x and col_y\n",
" pandas.DataFrame, or pandas.Series\n",
" \n",
" return\n",
" float, r\n",
" \"\"\"\n",
" \n",
" # calulate the variances\n",
" var_x = col_x - col_x.mean()\n",
" # assert var_x == col_x.var()\n",
" var_y = col_y - col_y.mean()\n",
" # assert var_y == col_y.var()\n",
" \n",
" # calculate Pearson's r\n",
" r = (var_x * var_y).sum() / (np.sqrt(var_x.pow(2).sum() * var_y.pow(2).sum()))\n",
" return r\n",
"\n",
"# the correlation with itself should always be 1.0\n",
"assert pearson_r(df_gpa.univ_GPA, df_gpa.univ_GPA) == 1.0"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"pearson_r(df_gpa.univ_GPA, df_gpa.high_GPA)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": [
"0.77956312054891597"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"df_gpa.high_GPA.corr(df_gpa.univ_GPA, method=\"pearson\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": [
"0.77956312054891608"
]
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# now the regression\n",
"def fit(X, Y):\n",
" \"\"\"\n",
" Calculate a straigt line that best fits the Xs and Ys.\n",
" The definition of a line being best fitting is that this line\n",
" minimizes the sum of all squared errors (the distance between the predicted\n",
" value and its actual value).\n",
" \n",
" X and Y\n",
" pandas.DataFrame, or pandas.Series\n",
" \n",
" return\n",
" a function, the straigt line function.\n",
" \n",
" The function of a straight line is given below:\n",
" \n",
" Y' = bX + A\n",
" \n",
" where b is the slope, and A being the intercept.\n",
" \"\"\"\n",
" \n",
" # b = r * (std(Y) / std(X))\n",
" r = pearson_r(X, Y)\n",
" std_x = std_deviation(X)\n",
" std_y = std_deviation(Y)\n",
" \n",
" b = r * (std_y / std_x)\n",
" \n",
" # A = M(Y) - bM(X)\n",
" A = Y.mean() - b * X.mean()\n",
" \n",
" def line(x):\n",
" \"\"\"\n",
" The function of the best fitting line.\n",
" \n",
" return\n",
" float, a prediction\n",
" \"\"\"\n",
" return b * x + A\n",
" \n",
" return line"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"predictor = fit(df_gpa.high_GPA, df_gpa.univ_GPA)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# plot our best fitting line against the original data\n",
"# I better leave this here to help draw the line : )\n",
"# ('o', 'v', '^', '<', '>', '8', 's', 'p', '*', 'h', 'H', 'D', 'd')\n",
"plot(df_gpa.high_GPA, df_gpa.univ_GPA, 'ko', fillstyle='none')\n",
"plot(df_gpa.high_GPA, df_gpa.high_GPA.apply(predictor), 'g-')\n",
"\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nQRolAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x10b4285d0>"
]
}
],
"prompt_number": 62
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"predictor(2.78)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 12,
"text": [
"2.9728504133781488"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# now a wrapped up version of the fitting function using\n",
"# linear algebra tools from inside Pandas\n",
"# as you can see just how little of code you need\n",
"# to write to train a predictor\n",
"\n",
"def fit2(X, Y):\n",
" b = X.corr(Y, method=\"pearson\") * (Y.std() / X.std())\n",
" A = (Y.mean() - b * X.mean())\n",
" \n",
" def line(x):\n",
" return b*x + A\n",
" return line\n",
"\n",
"# a pure Python implementation\n",
"\n",
"def fit3(X, Y):\n",
" \n",
" def mean(Xs):\n",
" return sum(Xs) / len(Xs)\n",
" m_X = mean(X)\n",
" m_Y = mean(Y)\n",
" \n",
" def std(Xs, m):\n",
" normalizer = len(Xs) - 1\n",
" return math.sqrt(sum((pow(x - m, 2) for x in Xs)) / normalizer)\n",
" # assert np.round(Series(X).std(), 6) == np.round(std(X, m_X), 6)\n",
" \n",
" def pearson_r(Xs, Ys):\n",
" \n",
" sum_xy = 0\n",
" sum_sq_v_x = 0\n",
" sum_sq_v_y = 0\n",
" \n",
" for (x, y) in zip(Xs, Ys):\n",
" var_x = x - m_X\n",
" var_y = y - m_Y\n",
" sum_xy += var_x * var_y\n",
" sum_sq_v_x += pow(var_x, 2)\n",
" sum_sq_v_y += pow(var_y, 2)\n",
" return sum_xy / math.sqrt(sum_sq_v_x * sum_sq_v_y)\n",
" # assert np.round(Series(X).corr(Series(Y)), 6) == np.round(pearson_r(X, Y), 6)\n",
" \n",
" r = pearson_r(X, Y)\n",
"\n",
" b = r * (std(Y, m_Y) / std(X, m_X))\n",
" A = m_Y - b * m_X\n",
" \n",
" def line(x):\n",
" return b * x + A\n",
" return line"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"predictor2 = fit2(df_gpa.high_GPA, df_gpa.univ_GPA)\n",
"predictor3 = fit3(df_gpa.high_GPA, df_gpa.univ_GPA)\n",
"predictor2(2.78), predictor3(2.78)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 14,
"text": [
"(2.972850413378147, 2.9728504133781488)"
]
}
],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# plot the two\n",
"\n",
"plt.xlabel(\"High School GPA\")\n",
"plt.ylabel(\"University GPA\")\n",
"plot(df_gpa.high_GPA, df_gpa.univ_GPA, \"ko\", fillstyle='none'),\n",
"plot(df_gpa.high_GPA, df_gpa.high_GPA.apply(predictor2), 'r-', antialiased=True)\n",
"plot(df_gpa.high_GPA, df_gpa.high_GPA.apply(predictor3), 'g-', antialiased=True)\n",
"\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x10b409590>"
]
}
],
"prompt_number": 57
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# To Do\n",
"# Perhaps to perform an amount of prediction using the trained\n",
"# predictor. Observe the correlation between:\n",
"# \n",
"# 1. training data set size, mean(sum of squared errors)\n",
"# 2. std(x), mean(sum of squared errors)"
],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment