{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Deming Regression\n",
"-------------------------------\n",
"\n",
"This function shows how to use TensorFlow to solve linear Deming regression.\n",
"\n",
"$y = Ax + b$\n",
"\n",
"We will use the iris data, specifically:\n",
"\n",
"y = Sepal Length and x = Petal Width.\n",
"\n",
"Deming regression is also called total least squares, in which we minimize the shortest distance from the predicted line and the actual (x,y) points.\n",
"\n",
"If least squares linear regression minimizes the vertical distance to the line, Deming regression minimizes the total distance to the line. This type of regression minimizes the error in the y values and the x values. See the below figure for a comparison.\n",
"\n",
"\n",
"\n",
"To implement this in TensorFlow, we start by loading the necessary libraries."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import tensorflow as tf\n",
"from sklearn import datasets\n",
"from tensorflow.python.framework import ops\n",
"ops.reset_default_graph()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Start a computational graph session:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"sess = tf.Session()\n",
"\n",
"# Set a random seed\n",
"tf.set_random_seed(42)\n",
"np.random.seed(42)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We load the iris data."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Load the data\n",
"# iris.data = [(Sepal Length, Sepal Width, Petal Length, Petal Width)]\n",
"iris = datasets.load_iris()\n",
"x_vals = np.array([x[3] for x in iris.data]) # Petal Width\n",
"y_vals = np.array([y[0] for y in iris.data]) # Sepal Length"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we declare the batch size, model placeholders, model variables, and model operations."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Declare batch size\n",
"batch_size = 125\n",
"\n",
"# Initialize placeholders\n",
"x_data = tf.placeholder(shape=[None, 1], dtype=tf.float32)\n",
"y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)\n",
"\n",
"# Create variables for linear regression\n",
"A = tf.Variable(tf.random_normal(shape=[1,1]))\n",
"b = tf.Variable(tf.random_normal(shape=[1,1]))\n",
"\n",
"# Declare model operations\n",
"model_output = tf.add(tf.matmul(x_data, A), b)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the demming loss, we want to compute:\n",
"\n",
"$$ \\frac{\\left| A \\cdot x + b - y \\right|}{\\sqrt{A^{2} + 1}} $$\n",
"\n",
"Which will give us the shortest distance between a point (x,y) and the predicted line, $A \\cdot x + b$."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# Declare Deming loss function\n",
"deming_numerator = tf.abs(tf.subtract(tf.add(tf.matmul(x_data, A), b), y_target))\n",
"deming_denominator = tf.sqrt(tf.add(tf.square(A),1))\n",
"loss = tf.reduce_mean(tf.truediv(deming_numerator, deming_denominator))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we declare the optimization function and initialize all model variables."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# Declare optimizer\n",
"my_opt = tf.train.GradientDescentOptimizer(0.25)\n",
"train_step = my_opt.minimize(loss)\n",
"\n",
"# Initialize variables\n",
"init = tf.global_variables_initializer()\n",
"sess.run(init)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we train our Deming regression for 250 iterations."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Step #100 A = [[3.0726142]] b = [[1.7809945]]\n",
"Loss = 0.47351116\n",
"Step #200 A = [[2.4791956]] b = [[2.522906]]\n",
"Loss = 0.4120035\n",
"Step #300 A = [[1.7441005]] b = [[3.6184309]]\n",
"Loss = 0.37118915\n",
"Step #400 A = [[1.0046556]] b = [[4.5442853]]\n",
"Loss = 0.26205948\n",
"Step #500 A = [[0.9638405]] b = [[4.605]]\n",
"Loss = 0.24394163\n",
"Step #600 A = [[0.96017563]] b = [[4.6268764]]\n",
"Loss = 0.26399365\n",
"Step #700 A = [[1.0218917]] b = [[4.6011143]]\n",
"Loss = 0.28519714\n",
"Step #800 A = [[1.0040245]] b = [[4.5968676]]\n",
"Loss = 0.27684262\n",
"Step #900 A = [[1.043581]] b = [[4.606966]]\n",
"Loss = 0.29077518\n",
"Step #1000 A = [[1.0042043]] b = [[4.6473894]]\n",
"Loss = 0.25255314\n",
"Step #1100 A = [[1.0124936]] b = [[4.635666]]\n",
"Loss = 0.27939135\n",
"Step #1200 A = [[0.97916406]] b = [[4.575562]]\n",
"Loss = 0.25290507\n",
"Step #1300 A = [[1.0078632]] b = [[4.581728]]\n",
"Loss = 0.2552546\n",
"Step #1400 A = [[1.0334944]] b = [[4.626392]]\n",
"Loss = 0.25675926\n",
"Step #1500 A = [[0.96745807]] b = [[4.6006155]]\n",
"Loss = 0.2478789\n"
]
}
],
"source": [
"# Training loop\n",
"loss_vec = []\n",
"for i in range(1500):\n",
" rand_index = np.random.choice(len(x_vals), size=batch_size)\n",
" rand_x = np.transpose([x_vals[rand_index]])\n",
" rand_y = np.transpose([y_vals[rand_index]])\n",
" sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})\n",
" temp_loss = sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})\n",
" loss_vec.append(temp_loss)\n",
" if (i+1)%100==0:\n",
" print('Step #' + str(i+1) + ' A = ' + str(sess.run(A)) + ' b = ' + str(sess.run(b)))\n",
" print('Loss = ' + str(temp_loss))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Retrieve the optimal coefficients (slope and intercept)."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# Get the optimal coefficients\n",
"[slope] = sess.run(A)\n",
"[y_intercept] = sess.run(b)\n",
"\n",
"# Get best fit line\n",
"best_fit = []\n",
"for i in x_vals:\n",
" best_fit.append(slope*i+y_intercept)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here is matplotlib code to plot the best fit Deming regression line and the Demming Loss."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"