用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之eval()函数危险性浅析
Jul 03 Python
深入分析在Python模块顶层运行的代码引起的一个Bug
Jul 04 Python
Pycharm 创建 Django admin 用户名和密码的实例
May 30 Python
Python爬虫之网页图片抓取的方法
Jul 16 Python
Python玩转Excel的读写改实例
Feb 22 Python
python使用wxpy实现微信消息防撤回脚本
Apr 29 Python
Django重置migrations文件的方法步骤
May 01 Python
Python画图实现同一结点多个柱状图的示例
Jul 07 Python
Python进程间通信 multiProcessing Queue队列实现详解
Sep 23 Python
Python ATM功能实现代码实例
Mar 19 Python
Pytorch转onnx、torchscript方式
May 25 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
Feb 03 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&&mysql)三
2006/10/09 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
关于PHP通用返回值设置方法
2017/03/31 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
PHP之header函数详解
2021/03/02 PHP
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
jQuery cdn使用介绍
2013/05/08 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
javascript实现二叉树遍历的代码
2017/06/08 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
javascript实现点击星星小游戏
2019/12/24 Javascript
jquery实现垂直手风琴导航栏
2020/02/18 jQuery
深入理解 ES6中的 Reflect用法
2020/07/18 Javascript
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
Python监控主机是否存活并以邮件报警
2015/09/22 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
在购买印度民族服饰:Soch
2020/09/15 全球购物
物业门卫岗位职责
2013/12/28 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
群众路线党课主持词
2014/04/01 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
皇城相府导游词
2015/02/06 职场文书