用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网络编程学习笔记(五):socket的一些补充
Jun 09 Python
用Python制作检测Linux运行信息的工具的教程
Apr 01 Python
python获取本地计算机名字的方法
Apr 29 Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
Jun 27 Python
python 爬虫百度地图的信息界面的实现方法
Oct 27 Python
将pytorch转成longtensor的简单方法
Feb 18 Python
Django ORM filter() 的运用详解
May 14 Python
Python脚本实现监听服务器的思路代码详解
May 28 Python
完美解决keras保存好的model不能成功加载问题
Jun 11 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 Python
python脚本定时发送邮件
Dec 22 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
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
php设计模式 Delegation(委托模式)
2011/06/26 PHP
实用的简单PHP分页集合包括使用方法
2013/10/21 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
Mootools 1.2教程 同时进行多个形变动画
2009/09/15 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
JS实现简单的tab切换选项卡效果
2016/09/21 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
浅析JavaScript动画模拟拖拽原理
2016/12/09 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
浅析Python中的join()方法的使用
2015/05/19 Python
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
python实现微信自动回复机器人功能
2019/07/11 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
Django在Model保存前记录日志实例
2020/05/14 Python
Python类及获取对象属性方法解析
2020/06/15 Python
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
西班牙在线光学:Visual-Click
2020/06/22 全球购物
DIY手工制作经营店创业计划书
2014/02/01 职场文书
药品采购员岗位职责
2014/02/08 职场文书
主题实践活动总结
2014/05/08 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL