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以及PHP安装环境
开学前想把web的知识系统掌握一下,跟着极客学院学html5. 安装了intellij idead.xampp.jdk.eclipse for php. 下面列举一些安装过程中会出现的问题,以及解决. ...
- 一种轻便且灵活的js模板的思路
一种轻便且灵活的js模板的思路 项目地址:https://github.com/j20041426/template 思路背景 在Vue.React.Angular等大前端框架异军突起的今天,写前端时 ...
- zookeeper-3.4.5安装&3台机器安装之后 ./zkServer.sh status 之后会显示“Error contacting service. It is probably not running.”的解决办法
安装文件上传工具:yum install lrzsz成功安装后有如下的提示:Complete![root@server01 apps]# yum install lrzszLoaded plugins ...
- [补档][Poi2010]Monotonicity 2
[Poi2010]Monotonicity 2 题目 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. 选出一个长度为L的子序列(不要求连续),要求这个子序列 ...
- 数据结构随笔-php实现队列
队列(Queue): 满足先进先出(FIFO)的规则: 下面使用php实现一个简单的循环队列模型: 初始状态的队列,队列长度为0,队头和队尾的指针相同均位于队列的开始: 入队操作:队尾指针向后移动,长 ...
- echarts 支持svg格式
今天研究了下echarts的svg格式.发现用ai生成svg格式的图片,echarts上面显示不了. 经过了多次的百度和谷歌终于找到了用Method Draw画出来的svg格式,echarts就能加载 ...
- vue-router的使用
关于vue-router的基本使用方法 首先,需要下载vue-router npm install vue-router --save vue-router在html或组件中的展现 ``` &l ...
- 数据结构二叉树的所有基本功能实现。(C++版)
本人刚学数据结构,对树的基本功能网上找不到C++代码 便自己写了一份,贴出方便大家进行测试和学习. 大部分功能未测试,如有错误或者BUG,请高手们指教一下,谢谢. 结点声明: BinTreeNode. ...
- 喂,前端,你应该知道的chrome插件
最近,优点闲. 压力,有点大,回顾,曾今被问,你怎么查看内存泄露,然后,一脸蒙. 工欲善其事, 必先利其器 最近在研究chrome devtools,发现,其实他很强.而且chrome6周一次的更新, ...
- let const 下篇
1.不存在变量提升 在之前的js代码中,声明一个变量或者是函数,会存在变量提升的现象,也就是说变量可以在声明之前使用,值为undefined: es5: console.log(a); //undef ...