用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文件读写操作与linux shell变量命令交互执行的方法
Jan 14 Python
Python导入txt数据到mysql的方法
Apr 08 Python
使用Django的模版来配合字符串翻译工作
Jul 27 Python
python实现多进程代码示例
Oct 31 Python
python url 参数修改方法
Dec 26 Python
pycharm修改界面主题颜色的方法
Jan 17 Python
用Python写一个自动木马程序
Sep 17 Python
python科学计算之narray对象用法
Nov 25 Python
python装饰器代替set get方法实例
Dec 19 Python
Python Tornado批量上传图片并显示功能
Mar 26 Python
python基于pygame实现飞机大作战小游戏
Nov 19 Python
python 使用tkinter与messagebox写界面和弹窗
Mar 20 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中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
基于PHP后台的Android新闻浏览客户端
2016/05/23 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
JavaScript 常用函数
2009/12/30 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
jquery实现div阴影效果示例代码
2013/09/16 Javascript
javascript日期对象格式化为字符串的实现方法
2014/01/14 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
2016/03/01 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
Vue中的v-cloak使用解读
2017/03/27 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
jQuery分组选择器简单用法示例
2019/04/04 jQuery
vue实现todolist功能、todolist组件拆分及todolist的删除功能
2019/04/11 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
python局部赋值的规则
2013/03/07 Python
python的socket编程入门
2018/01/29 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
python如何变换环境
2020/07/21 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
python如何实现图片压缩
2020/09/11 Python
HTTP状态码详解
2021/03/18 杂记
大学生入党自我鉴定
2013/10/31 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
mysql如何查询连续记录
2022/05/11 MySQL