用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多线程抓取天涯帖子内容示例
Apr 03 Python
python中实现php的var_dump函数功能
Jan 21 Python
python以环状形式组合排列图片并输出的方法
Mar 17 Python
Python中优化NumPy包使用性能的教程
Apr 23 Python
Python中使用支持向量机SVM实践
Dec 27 Python
spark: RDD与DataFrame之间的相互转换方法
Jun 07 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
Python中的十大图像处理工具(小结)
Jun 10 Python
python配置文件写入过程详解
Oct 19 Python
浅谈Python中的生成器和迭代器
Jun 19 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 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管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
php获取字段名示例分享
2014/03/03 PHP
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
js的toUpperCase方法用法实例
2015/01/27 Javascript
nodejs实现获取某宝商品分类
2015/05/28 NodeJs
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
JS生成和下载二维码的代码
2016/12/07 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
Vue实现用户自定义字段显示数据的方法
2018/08/28 Javascript
JS实现放烟花效果
2020/03/10 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
Python语言描述机器学习之Logistic回归算法
2017/12/21 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
HTML5的语法变化介绍
2013/08/13 HTML / CSS
意大利团购网站:Groupon意大利
2016/10/11 全球购物
全球度假村:Club Med
2017/11/27 全球购物
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
英国电信商店:BT Shop
2019/12/17 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
优秀大学生职业生涯规划书
2014/02/27 职场文书
中式结婚主持词
2014/03/14 职场文书
给校长的建议书400字
2014/05/15 职场文书
关于群众路线的心得体会
2014/11/05 职场文书
老龙头导游词
2015/02/11 职场文书
毕业生自荐信范文
2015/03/05 职场文书
2015年结对帮扶工作总结
2015/05/04 职场文书
高三物理教学反思
2016/02/20 职场文书
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL
python实现简单聊天功能
2021/07/07 Python
Ajax实现三级联动效果
2021/10/05 Javascript