You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

167 lines
14 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"from __future__ import division, print_function\n",
"from sympy import Symbol, diff, solve, lambdify, simplify\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Model parameters: We look for a line y = b1*x + b2.\n",
"b1 = Symbol('b1')\n",
"b2 = Symbol('b2')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Data points\n",
"data = [(1,14), (2, 13), (3, 12), (4, 10), (5,9), (7,8), (9,5)]"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Function to minimize: S = 185*b1**2 + 62*b1*b2 - 524*b1 + 7*b2**2 - 142*b2 + 779\n"
]
}
],
"source": [
"# S is the function to minimize:\n",
"#\n",
"# For each data point the vertical error/residual is x*b1 + b2 - y. We want to\n",
"# minimize the sum of the squared residuals (least squares).\n",
"S = sum((p[0] * b1 + b2 - p[1]) ** 2 for p in data)\n",
"S = simplify(S)\n",
"print(\"Function to minimize: S = {}\".format(S))\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"S is minimal for b1 = -367/334, b2 = 5013/334\n"
]
}
],
"source": [
"# Minimize S by setting its partial derivatives to zero.\n",
"d1 = diff(S, b1)\n",
"d2 = diff(S, b2)\n",
"solutions = solve([d1, d2], [b1, b2])\n",
"print(\"S is minimal for b1 = {}, b2 = {}\".format(solutions[b1], solutions[b2]))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fitted line: y = -367*x/334 + 5013/334\n"
]
}
],
"source": [
"# Construct fitted line from the solutions\n",
"x = Symbol('x')\n",
"fitted_line = solutions[b1] * x + solutions[b2]\n",
"print(\"Fitted line: y = {}\".format(fitted_line))\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Construct something we can plot with matplotlib\n",
"fitted_line_func = lambdify(x, fitted_line, modules=['numpy'])\n",
"x_plot = np.linspace(min(p[0] for p in data),\n",
" max(p[0] for p in data), 100)\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fdb7f6c8b70>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot data points and fitted line\n",
"plt.scatter([p[0] for p in data], [p[1] for p in data], marker=\"+\")\n",
"plt.plot(x_plot, fitted_line_func(x_plot), 'r')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"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.6.2"
}
},
"nbformat": 4,
"nbformat_minor": 1
}