用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 datetime时间格式化去掉前导0
Jul 31 Python
python保存网页图片到本地的方法
Jul 24 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
Python异步编程之协程任务的调度操作实例分析
Feb 01 Python
Python内置函数locals和globals对比
Apr 28 Python
Python中常见的数制转换有哪些
May 27 Python
PyInstaller运行原理及常用操作详解
Jun 13 Python
Python dict的常用方法示例代码
Jun 23 Python
Python爬虫分析微博热搜关键词的实现代码
Feb 22 Python
Python趣味实战之手把手教你实现举牌小人生成器
Jun 07 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 set_time_limit()函数的使用详解
2013/06/05 PHP
Yii使用Captcha验证码的方法
2015/12/28 PHP
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
javascript异步编程的4种方法
2014/02/19 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
2018/07/07 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
jquery+css实现Tab栏切换的代码实例
2019/05/14 jQuery
js 对象使用的小技巧实例分析
2019/11/08 Javascript
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
Python while 循环使用的简单实例
2016/06/08 Python
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
Tensorflow 实现释放内存
2020/02/03 Python
Python Numpy中数据的常用保存与读取方法
2020/04/01 Python
python 下载m3u8视频的示例代码
2020/11/11 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
CSS3中利用animation属性创建雪花飘落特效
2014/05/14 HTML / CSS
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
互联网创业计划书的书写步骤
2014/01/28 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
城南旧事电影观后感
2015/06/16 职场文书
2016年教师节感言
2015/12/09 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
MySQL基础(一)
2021/04/05 MySQL
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js