用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获取电脑硬件信息及状态的实现方法
Aug 29 Python
在Python的Flask框架中构建Web表单的教程
Jun 04 Python
Python使用matplotlib填充图形指定区域代码示例
Jan 16 Python
Python自动化完成tb喵币任务的操作方法
Oct 30 Python
Python实现元素等待代码实例
Nov 11 Python
python实现logistic分类算法代码
Feb 28 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
JAVA及PYTHON质数计算代码对比解析
Jun 10 Python
如何把python项目部署到linux服务器
Aug 26 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
Dec 21 Python
Python 中Operator模块的使用
Jan 30 Python
opencv读取视频并保存图像的方法
Jun 04 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类
2006/11/25 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
php实现JWT(json web token)鉴权实例详解
2019/11/05 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
JS文本框不能输入空格验证方法
2013/03/19 Javascript
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
微信小程序实现animation动画
2018/01/26 Javascript
Puppet的一些技巧
2018/09/17 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
Python中类的继承代码实例
2014/10/28 Python
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
Python实现的redis分布式锁功能示例
2018/05/29 Python
flask中的wtforms使用方法
2018/07/21 Python
python找出因数与质因数的方法
2019/07/25 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
2019/10/24 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
波兰家具和室内装饰品购物网站:Vivre
2018/04/10 全球购物
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
怎样写好创业计划书的内容
2014/02/06 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
地方白酒代理协议书
2014/10/25 职场文书
2014年综治维稳工作总结
2014/11/17 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书
工作保证书
2015/01/17 职场文书