Tensorflow 线性回归预测房价实例
在本节中将通过一个预测房屋价格的实例来讲解利用线性回归预测房屋价格,以及在tensorflow中如何实现
1.1. 准备工作
从网上得到的数据可以看到房屋价格与房屋尺寸的一个对比关系,如下图:

我们假设x轴(房屋尺寸)而Y轴(房屋价格)依据上表数据绘制折线图

现在我们使用简单的线性模型来预测,
- 红线表述我们的预测曲线 : $$y_p=ax+b$$
- 蓝线表述房屋价格与尺寸的实际关系
- 预测与实际的不同用黄线表示

接下来需要通过数据来找到a,b的最佳值从而使预测与实际的误差最小。此次我们采用SSE(和方差)来判别误差。该统计参数计算的是拟合数据和原始数据对应点的误差的平方和,计算公式如下
\]
在拿到原始的数据后,为方便运算,我们将数据进行归一化处理,归一化计算公式如下
\]
1.2. 归一化数据
我们将原始的数据进行归一化处理,归一化处理后的结果如图:

def normalize(arr):
arr_min = np.min(arr)
arr_max = np.max(arr)
arr_out = []
for item in arr:
out = np.divide(np.subtract(item, arr_min), np.subtract(arr_max, arr_min))
arr_out = np.append(arr_out, np.array(out))
return arr_out
1.3. 用随机的值填充a,b并计算误差,误差采用上文所使用SSE(和方差)

def model(x, b, a):
# linear regression is just b*x + a, so this model line is pretty simple
return tf.multiply(x, b) + a
loss = tf.multiply(tf.square(Y - y_model), 0.5)
1.4. 计算误差梯度
对sse分别求a,b的偏微分
\]
\]

1.5. 调整参数直到SSE参数最小

新 a = a – r * ∂SSE/∂a = 0.45-0.01*3.300 = 0.42
新 b = b – r * ∂SSE/∂b= 0.75-0.01*1.545 = 0.73
(r是学习率,表示调整的步长)
# construct an optimizer to minimize cost and fit line to mydata
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
然后再重复上一步骤计算,直到所设定的次数完成

for i in range(500):
for (x, y) in zip(trX, trY):
output = sess.run(train_op, feed_dict={X: x, Y: y})
通过刚才几步的组合,程序便能计算出最合适的a,b的值,完成代码清单如下:
import tensorflow as tf
import numpy as np
sess = tf.Session()
# 线性模型 y=bx+a
def model(x, b, a):
return tf.multiply(x, b) + a
# 归一化函数
def normalize(arr):
arr_min = np.min(arr)
arr_max = np.max(arr)
arr_out = []
for item in arr:
out = np.divide(np.subtract(item, arr_min), np.subtract(arr_max, arr_min))
arr_out = np.append(arr_out, np.array(out))
return arr_out
# 原始数据
trX_i = [1100., 1400., 1425., 1550., 1600., 1700., 1700., 1875., 2350., 2450.]
trY_i = [199000., 245000., 319000., 240000., 312000., 279000., 310000., 308000., 405000., 324000.]
# 数据归一化
trX = normalize(trX_i)
trY = normalize(trY_i)
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
# 设一个权重变量b,和一个偏差变量a
b = tf.Variable(0.0, name="weights")
# create a variable for biases
a = tf.Variable(0.0, name="biases")
y_model = model(X, b, a)
# 损失函数
loss = tf.multiply(tf.square(Y - y_model), 0.5)
# 梯度下降
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
init = tf.global_variables_initializer()
sess.run(init)
# 训练数据
for i in range(500):
for (x, y) in zip(trX, trY):
output = sess.run(train_op, feed_dict={X: x, Y: y})
print('b:' + str(sess.run(b)) + ' || a:' + str(sess.run(a)))
---result
b:0.682465 || a:0.1512
1.6. 概念
1.6.1. 简单线性回归
在房价预测例子中,我们发现房价数据呈一种比较明显的线性关系,那么自然我们可能会选择简单线性回归对数据进行拟合,首先从线性模型着手:
\]
从上面的二元一次方程看出,我们的输入x是已知向量,只要我们求出a,b的值,就能通过上述公式进行房价预测了,这就是简单线性回归的思想。
1.6.2. 梯度下降
梯度
如上一节中讲的我们需要找出SSE最小化时的a,b的值,采用的这种方法就叫做梯度下降。梯度下降不仅仅局限于最小化这个函数,也可能根据实际情况需要最大化某个函数,这种情况叫做梯度上升。单纯从数学上讲,对一个函数来说,梯度表示某个向量的偏导数,同时还代表了该向量的方向,在这个方向上,函数增加得最快,在相反的方向上,函数减小得最快。
利用梯度这一性质,我们采用梯度下降算法去最小化我们的损失函数,我们在梯度的反方向跨域一小步,再从一个新起点开始重复这个过程,直到我们找到损失函数的最小值,最后确定我们的a, b值。
我们需要最小化的函数为(又称为损失函数):
\]
对a,b分别求偏导,并令偏导等于0:
\]
\]
最后,输入已知的x和y值(均为向量),解两个一次方程就计算出a,b的确切值。
步长
为了求SSE的最小值,我们需要向梯度相反的方法移动,每移动一步,梯度逐渐降低,但是移动多少才合适呢,这需要我们谨慎的选择步长。目前,主流的选择方法有:
• 使用固定步长
• 随时间增长逐步减小步长
• 在每一步中通过最小化目标函数的值来选择合适的步长
在上一例子中,我们选择固定步长r=0.01,其实,最后一种方法很好,但它的计算代价很大。我们还可以尝试一系列步长,并选出使目标函数值最小的那个步长来求其近似值。
stepSizes=[10, 1, 0.1, 0.01, 0.001]
1.6.3 损失函数
损失函数是用来评价模型的预测值与真实值的不一致程度,它是一个非负实值函数。通常使用L(Y,f(x))来表示,损失函数越小,模型的性能就越好。
在预测房价的例子中,我们使用了和方差来计算误差,并把该函数称为损失函数,即计算实际值和预测值的误差平方和。为什么要选择这一函数来计算误差,而不采用绝对值误差,或误差的三次方,四次方来定义误差函数是因为:
- 相对于绝对值误差,误差平方和计算更加方便。
- 这里的损失函数使用的是“最小二乘法”的思想,假定我们的误差满足均值为0的高斯分布,这样符合一般的统计规律,然后根据最大似然函数估计进行推导,就得出了求导结果,平方和最小公式:
\]
除上面提到的损失函数外,还有其他的一些常见的损失函数:
0-1 Loss
如果预测值与标值不等,则记为1;如果相等,则标记为0
1 & \textrm{$Y\neq f(x)$}\\
0 & \textrm{$Y= f(x)$}
\end{array} \right.
\]
Log对数损失函数
在逻辑回归中损失函数的推导是假设样本服从伯努利分布(0-1分布),然后求满足该分布的似然函数,最后推导出顺势函数的公式为:$$L(Y,P(Y|X)) = -logP(Y|X)$$
指数损失函数
出现在Adaboost算法中
\]
Hinge损失函数
在线性支持向量机中,Hinge的损失函数标准形式为:
\]
绝对值损失函数
\]
1.6.4 特征归一化
对于多属性的样本,我们在做分类预测的时候,应该把每个属性看作同等重要,不能让某个属性的计算结果严重影响模型的预测结果。例如,以下有一个样本数据:
| 玩游戏所耗时间百分比 | 描述每年获得的飞行常客里程数 | 每周消费的冰淇淋公升数 |
|---|---|---|
| 0.8 | 400 | 0.5 |
| 12 | 134000 | 0.9 |
| 0 | 20000 | 1.1 |
| 67 | 32000 | 0.1 |
如果我们采用KNN算法做分类预测,在计算欧式距离的时候,比如计算样本3和样本4之间的距离,很明显我们发现每年获得的飞行常客里程数由于本身数值很大,其计算结果的影响将远远大于其他两个特征值的影响,对于三个等权重的特征之一,我们不能让它严重的影响计算结果,所以,我们通常会采用特征归一化的方法把值处理为0到1或者-1到1之间。
\]
即上面提到的公式:
\]
其中\(x_{min}\)和\(x_{max}\)是特征向量x的最小值和最大值,这样通过对每个特征向量进行归一化处理,所有特征值的计算都统一了,而计算得到的结果就更加准确。
在之前预测房价的例子中,我们对已有的特征向量,即房屋大小和实际价格做了归一化处理,即便是只有一个特征向量,我们仍然需要这样做,其目的与上面的样本数据一样,比如假设我们需要在该房屋预测中增加房间数量或房屋年龄等特征进行房屋价格预测,我们都可以采用同一类方法进行处理,以减少各特征值对计算结果的影响。
参考链接
【1】:http://www.kdnuggets.com/2017/04/simple-understand-gradient-descent-algorithm.html
Tensorflow 线性回归预测房价实例的更多相关文章
- 机器学习01:使用scikit-learn的线性回归预测Google股票
这是机器学习系列的第一篇文章. 本文将使用Python及scikit-learn的线性回归预测Google的股票走势.请千万别期望这个示例能够让你成为股票高手.下面按逐步介绍如何进行实践. 准备数据 ...
- C# chart.DataManipulator.FinancialFormula()公式的使用 线性回归预测方法
最近翻阅资料,找到 chart.DataManipulator.FinancialFormula()公式的使用,打开另一扇未曾了解的窗,供大家分享一下. 一 DataManipulator类 运行时, ...
- [机器学习实战-Logistic回归]使用Logistic回归预测各种实例
目录 本实验代码已经传到gitee上,请点击查收! 一.实验目的 二.实验内容与设计思想 实验内容 设计思想 三.实验使用环境 四.实验步骤和调试过程 4.1 基于Logistic回归和Sigmoid ...
- TensorFlow笔记二:线性回归预测(Linear Regression)
代码: import tensorflow as tf import numpy as np import xlrd import matplotlib.pyplot as plt DATA_FILE ...
- 使用TensorFlow实现回归预测
这一节使用TF搭建一个简单的神经网络用于回归预测,首先随机生成一组数据 import tensorflow as tf import numpy as np import matplotlib.pyp ...
- tensorflow seq2seq.py接口实例
以简单英文问答问题为例测试tensorflow1.4 tf.contrib.legacy_seq2seq中seq2seq文件的几个seq2seq接口 github:https://github.com ...
- Tensorflow实现Mask R-CNN实例分割通用框架,检测,分割和特征点定位一次搞定(多图)
Mask R-CNN实例分割通用框架,检测,分割和特征点定位一次搞定(多图) 导语:Mask R-CNN是Faster R-CNN的扩展形式,能够有效地检测图像中的目标,同时还能为每个实例生成一个 ...
- tensorflow knn 预测房价 注意有 Min-Max Scaling
示例数据: 0.00632 18.00 2.310 0 0.5380 6.5750 65.20 4.0900 1 296.0 15.30 396.90 4.98 24.00 0.02731 0.00 ...
- 线性回归预测PM2.5----台大李宏毅机器学习作业1(HW1)
一.作业说明 给定训练集train.csv,要求根据前9个小时的空气监测情况预测第10个小时的PM2.5含量. 训练集介绍: (1)CSV文件,包含台湾丰原地区240天的气象观测资料(取每个月前20天 ...
随机推荐
- java集合练习
分组练习: List<List<Student>> list=new ArrayList<List<Student>>();这个是二维集合,分组的时候 ...
- 类似818tu.co微信小说分销系统设计之多公众号网页授权自动登录源码
/** 转载请保留原地址以及版权声明,请勿恶意修改 * 作者:杨浩瑞 QQ:1420213383 独立博客:http://www.yxxrui.cn * [后台]http://xiaoshuo. ...
- Java大数据人才应用领域广,就业薪酬高
互联网创造了大数据应用的规模化环境,大数据应用成功的案例大都是在互联网上发生的, 互联网业务提供了数据,互联网企业开发了处理软件,互联网企业的创新带来了大数据应用 的活跃,没有互联网便没有今天的大数据 ...
- 一步一步学习Vue(十一)
本篇继续学习vuex,还是以实例为主:我们以一步一步学Vue(四)中讲述的例子为基础,对其改造,基于vuex重构一遍,这是原始的代码: todolist.js ; (function () { var ...
- Shopex如何清理缓存
一.进入后台,点击 右上角 的"关于" 二.点击:缓存系统: 三.点击"清空缓存" 四.清除成功!
- 双向循环链表(C语言描述)(四)
下面以一个电子英汉词典程序(以下简称电子词典)为例,应用双向循环链表.分离数据结构,可以使逻辑代码独立于数据结构操作代码,程序结构更清晰,代码更简洁:电子词典的增.删.查.改操作分别对应于链表的插入. ...
- Canvas: 优雅的代码作图系列:中国国旗
Canvas: 优雅的代码作图系列:中国国旗 有很多个这练手的,好的差的都有.这次,我演示下用极客的代码,画出最标准的中国国旗,并详细说明代码是怎么写出来的. 绘制规范: 一.严格按照绘制说明: 二. ...
- 【转载】跟我一起学习VIM - vim插件
目录 写在前面:Life Changing Editor 什么是VIM 为什么选VIM 为什么选其它 为什么犹豫选择它们 VIM >= SUM(现代编辑器) 如何学习VIM 一秒钟变记事本 VI ...
- 开源社群系统ThinkSNS+PC端最新播报!
亲爱的粉丝,授权客户,企业创业者们,这一次,我们将为你们打造最好用的社交软件系统. 在这里你将看到TSer们本周研发.优化.设计的动态即时播报,可评论留言提出您的问题及建议与我们互动. 同时,研发已经 ...
- 轻松学JVM(四)——垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...