用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自定义解析简单xml格式文件的方法
May 11 Python
Python使用ntplib库同步校准当地时间的方法
Jul 02 Python
Python中装饰器学习总结
Feb 10 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
python中update的基本使用方法详解
Jul 17 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
Aug 17 Python
Python爬虫爬取Bilibili弹幕过程解析
Oct 10 Python
Python sep参数使用方法详解
Feb 12 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
python删除文件、清空目录的实现方法
Sep 23 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 05 Python
python实现黄金分割法的示例代码
Apr 28 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中定时计划任务的实现原理
2013/01/08 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
基于javascript编写简单日历
2016/05/02 Javascript
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
Python sklearn KFold 生成交叉验证数据集的方法
2018/12/11 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
解决python3 安装不了PIL的问题
2019/08/16 Python
python dataframe NaN处理方式
2019/12/26 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
CSS3提交意见输入框样式代码
2014/10/30 HTML / CSS
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
六查六看剖析材料
2014/02/15 职场文书
高一学生评语大全
2014/04/25 职场文书
2014年导购员工作总结
2014/11/18 职场文书
关于成立领导小组的通知
2015/04/23 职场文书
2015年档案室工作总结
2015/05/23 职场文书
教师节获奖感言
2015/07/31 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
python-for x in range的用法(注意要点、细节)
2021/05/10 Python
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python