用TensorFlow实现戴明回归算法的示例


Posted in Python onMay 02, 2018

如果最小二乘线性回归算法最小化到回归直线的竖直距离(即,平行于y轴方向),则戴明回归最小化到回归直线的总距离(即,垂直于回归直线)。其最小化x值和y值两个方向的误差,具体的对比图如下图。

用TensorFlow实现戴明回归算法的示例 

线性回归算法和戴明回归算法的区别。左边的线性回归最小化到回归直线的竖直距离;右边的戴明回归最小化到回归直线的总距离。

线性回归算法的损失函数最小化竖直距离;而这里需要最小化总距离。给定直线的斜率和截距,则求解一个点到直线的垂直距离有已知的几何公式。代入几何公式并使TensorFlow最小化距离。

损失函数是由分子和分母组成的几何公式。给定直线y=mx+b,点(x0,y0),则求两者间的距离的公式为:

用TensorFlow实现戴明回归算法的示例

# 戴明回归
#----------------------------------
#
# This function shows how to use TensorFlow to
# solve linear Deming regression.
# y = Ax + b
#
# We will use the iris data, specifically:
# y = Sepal Length
# x = Petal Width

import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from sklearn import datasets
from tensorflow.python.framework import ops
ops.reset_default_graph()

# Create graph
sess = tf.Session()

# Load the data
# iris.data = [(Sepal Length, Sepal Width, Petal Length, Petal Width)]
iris = datasets.load_iris()
x_vals = np.array([x[3] for x in iris.data])
y_vals = np.array([y[0] for y in iris.data])

# Declare batch size
batch_size = 50

# Initialize placeholders
x_data = tf.placeholder(shape=[None, 1], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)

# Create variables for linear regression
A = tf.Variable(tf.random_normal(shape=[1,1]))
b = tf.Variable(tf.random_normal(shape=[1,1]))

# Declare model operations
model_output = tf.add(tf.matmul(x_data, A), b)

# Declare Demming loss function
demming_numerator = tf.abs(tf.subtract(y_target, tf.add(tf.matmul(x_data, A), b)))
demming_denominator = tf.sqrt(tf.add(tf.square(A),1))
loss = tf.reduce_mean(tf.truediv(demming_numerator, demming_denominator))

# Declare optimizer
my_opt = tf.train.GradientDescentOptimizer(0.1)
train_step = my_opt.minimize(loss)

# Initialize variables
init = tf.global_variables_initializer()
sess.run(init)

# Training loop
loss_vec = []
for i in range(250):
  rand_index = np.random.choice(len(x_vals), size=batch_size)
  rand_x = np.transpose([x_vals[rand_index]])
  rand_y = np.transpose([y_vals[rand_index]])
  sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})
  temp_loss = sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})
  loss_vec.append(temp_loss)
  if (i+1)%50==0:
    print('Step #' + str(i+1) + ' A = ' + str(sess.run(A)) + ' b = ' + str(sess.run(b)))
    print('Loss = ' + str(temp_loss))

# Get the optimal coefficients
[slope] = sess.run(A)
[y_intercept] = sess.run(b)

# Get best fit line
best_fit = []
for i in x_vals:
 best_fit.append(slope*i+y_intercept)

# Plot the result
plt.plot(x_vals, y_vals, 'o', label='Data Points')
plt.plot(x_vals, best_fit, 'r-', label='Best fit line', linewidth=3)
plt.legend(loc='upper left')
plt.title('Sepal Length vs Pedal Width')
plt.xlabel('Pedal Width')
plt.ylabel('Sepal Length')
plt.show()

# Plot loss over time
plt.plot(loss_vec, 'k-')
plt.title('L2 Loss per Generation')
plt.xlabel('Generation')
plt.ylabel('L2 Loss')
plt.show()

结果:

用TensorFlow实现戴明回归算法的示例 

用TensorFlow实现戴明回归算法的示例 

本文的戴明回归算法与线性回归算法得到的结果基本一致。两者之间的关键不同点在于预测值与数据点间的损失函数度量:线性回归算法的损失函数是竖直距离损失;而戴明回归算法是垂直距离损失(到x轴和y轴的总距离损失)。

注意,这里戴明回归算法的实现类型是总体回归(总的最小二乘法误差)。总体回归算法是假设x值和y值的误差是相似的。我们也可以根据不同的理念使用不同的误差来扩展x轴和y轴的距离计算。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python写的ARP攻击代码实例
Jun 04 Python
Python初学时购物车程序练习实例(推荐)
Aug 08 Python
python skimage 连通性区域检测方法
Jun 21 Python
快速排序的四种python实现(推荐)
Apr 03 Python
python中如何实现将数据分成训练集与测试集的方法
Sep 13 Python
Python如何优雅获取本机IP方法
Nov 10 Python
python标识符命名规范原理解析
Jan 10 Python
ansible动态Inventory主机清单配置遇到的坑
Jan 19 Python
Django 解决阿里云部署同步数据库报错的问题
May 14 Python
python 使用elasticsearch 实现翻页的三种方式
Jul 31 Python
Python Process创建进程的2种方法详解
Jan 25 Python
python实现会员信息管理系统(List)
Mar 18 Python
用TensorFlow实现lasso回归和岭回归算法的示例
May 02 #Python
Python实现确认字符串是否包含指定字符串的实例
May 02 #Python
详解用TensorFlow实现逻辑回归算法
May 02 #Python
Python获取指定字符前面的所有字符方法
May 02 #Python
Python 查找字符在字符串中的位置实例
May 02 #Python
python 巧用正则寻找字符串中的特定字符的位置方法
May 02 #Python
Python 在字符串中加入变量的实例讲解
May 02 #Python
You might like
PHP聊天室技术
2006/10/09 PHP
php学习 函数 课件
2008/06/15 PHP
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
ThinkPHP实现一键清除缓存方法
2014/06/26 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
初识PHP中的Swoole
2016/04/05 PHP
php简单处理XML数据的方法示例
2017/05/19 PHP
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
jquery京东商城双11焦点图多图广告特效代码分享
2015/09/06 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
使用vue2实现购物车和地址选配功能
2018/03/29 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
node使用Mongoose类库实现简单的增删改查
2018/11/08 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
Python subprocess模块详细解读
2018/01/29 Python
使用python爬取B站千万级数据
2018/06/08 Python
详解Python字符串切片
2019/05/20 Python
Python缓存技术实现过程详解
2019/09/25 Python
python selenium循环登陆网站的实现
2019/11/04 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
Python实现疫情地图可视化
2021/02/05 Python
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
学校花圃的标语
2014/06/18 职场文书
教师自查自纠工作情况报告
2014/10/29 职场文书
酒店员工辞职信范文
2015/02/28 职场文书
2015迎新晚会开场白
2015/05/29 职场文书
八年级英语教学反思
2016/02/15 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书