数据样本

数据背景

假设有一组数据样本,其输入和输出可以用两个数值来表示,其格式为(x,y),具体如下: (-1,-3),(0,-1),(1,1),(2,3),(3,5)(4,7)。那么如何得到一个模型,对未来的数据进行预测呢?也就是说,能否通过样本数据来计算得到一个几乎正确的模型呢?

目的

  • 通过tensorflow 2.0对上述几个数据样本,来拟合一个简单的模型,然后输入数据x’预测输出y’,将预测出的数据y’和y进行比较,看看一个非常简单模型的准确性。

  • 通过不到10行的代码,演示tensorflow 2.0 从数据的理解、整理、模型定义、模型编译、模型训练、预测(泛化),这种更为简单的方法来进行机器学习(深度学习)。

数据分析

通过分析,我们可以得出,该组数据符合 y = 2x-1 关系式,即 y = (2 * x) - 1

TIPS: 机器学习与传统方法的思路不同。传统方法是有输入,有模型(规则),然后来计算输出;而机器学习则是有输入、有输出,然后计算模型(规则),从而用模型来预测未来(泛化,Generalization)。

模型与实现

思路

  • 利用已有数据,为模型准备训练数据
  • 定义模型、编译、训练
  • 预测

编码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#引入类库
import tensorflow as tf
import numpy as np
from tensorflow import keras

#使用下述语句来查看tensorflow版本,以下代码都是2.0版的
print(tf.__version__)

#使用array来组织数据整理
xs = np.array([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)

#定义模型model,该模型是具有一个输入(input_shape[1])和一个神经元输出的全连接(Dense)模型。
model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
#使用SGD优化器、和均方误差来编译模型。SGD和mean_squared_error后面脑补
model.compile(optimizer='sgd', loss='mean_squared_error')
#开始训练, 500次
model.fit(xs, ys, epochs=500)
1
2
3
4
#用训练好的model预测10.0,打印其预测值是多少
print(model.predict([10.0]))
#输出
>> 18.170927

总结

使用训练好的模型,可以得到预测结果。当喂入数据10时,其输出为18.17,和直接用关系式y = (2 * x) - 1 得到19还是有很大差距。但是,当随着样本数量的增加,其误差会越来越小。可以肯定得是,机器学习还是比较靠谱的。

计算过程附图