极简无复杂数学公式机器学习入门以线性模型(Linear)为例

准备工作:
        运行环境:

                Anaconda3、Spyder、Python3
                安装教程:安装Anaconda3详细步骤 - 知乎
        人工智能库:
                飞桨
                安装教程:开始使用_飞桨-源于产业实践的开源深度学习平台

假设现在面临这样一个任务:
乘坐出租车的时候,会有一个10元的起步价,只要上车就需要收取。出租车每行驶1公里,需要再支付每公里2元的行驶费用。当一个乘客坐完出租车之后,车上的计价器需要算出来该乘客需要支付的乘车费用。

接下来,把问题稍微变换一下,现在知道乘客每次乘坐出租车的公里数,也知道乘客每次下车的时候支付给出租车司机的总费用。但是并不知道乘车的起步价,以及每公里行驶费用是多少。希望让机器从这些数据当中学习出来计算总费用的规则。

即从给出的公里数对应的总车费推导出起步价及每公里的费用,可得出公式:
总车费=行驶公里数 * 行驶每公里费用 + 起步价
假设总车费用Y表示,行驶公里数用X表示,行驶每公里费用用W表示,起步价用b表示,那么可以表示为以下字母公式:
Y=XW+b
如果XY分别表示二维平面的X轴和Y轴,很明显上面公式是一个线性函数。
因为YX是已知的,我们不断尝试找到一个Wb的数,使得Y=XW+b的过程称之为机器学习。
例如我们已知:
Y=[12, 16, 20]
X=[1, 3, 5]

假设我们尝试W=2,b=10
那么根据公式Y=XW+b可得:
12=1*2+10
16=3*2+10
20=5*2+10

通过观察,我们得知上面等式两边刚好相等,所以W=2,b=10使得Y=XW+b,从而我们就求出了行驶每公里的费用和起步价,这个过程我们又称之为拟合。

# -*- coding: utf-8 -*-
import paddle

#行驶公里数
x_data = paddle.to_tensor([[1.], [3.0], [5.0], [9.0], [10.0], [20.0]])

#总车费
y_data = paddle.to_tensor([[12.], [16.0], [20.0], [28.0], [30.0], [50.0]])

#paddle.nn.Linear文档:https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/Linear_cn.html#linear
#paddle.nn.Linear:线性变换层。对于每个输入X,计算公式为:Y=XW+b,其中,W 和 b 分别为权重和偏置。
#in_features:输入特征为一个,即行驶公里数
#out_features:输出特征为一个,即总车费
linear = paddle.nn.Linear(in_features=1, out_features=1)

#paddle.nn.MSELos文档:https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/MSELoss_cn.html#mseloss
#MSE损失函数,参考:https://taiyi.blog.csdn.net/article/details/103822796
mse_loss = paddle.nn.MSELoss()

#paddle.optimizer.SGD文档:https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/optimizer/SGD_cn.html#sgd

#什么是梯度下降法,我们需要到达山底,就需要在每一步观测到此时最陡峭的地方,所以我们只要沿着最陡峭的方向一直走,就能走到山底!。
#随机梯度下降算法的优化器。为网络添加反向计算过程,并根据反向计算所得的梯度,更新 parameters 中的 Parameters,最小化网络损失值 loss。
sgd_optimizer = paddle.optimizer.SGD(learning_rate=0.001, parameters = linear.parameters())

#学习次数
total_epoch = 15000
for i in range(total_epoch):
    #使用linear进行学习
    y_predict = linear(x_data)
    
    #使用损失函数计算预测值和实值的误差
    loss = mse_loss(y_predict, y_data)
    
    #backward:误差从输出层向隐藏层反向传播,直至传播到输入层;在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。
    #在此例中实际就是根据误差重新修正paddle.nn.Linear模型中W和b的值。
    loss.backward()
    
    #执行一次优化器并进行参数更新,此处的作用实际就是更新paddle.nn.Linear模型中W和b的值
    sgd_optimizer.step()
    
    #清除需要优化的参数的梯度
    sgd_optimizer.clear_grad()
    
    if i%1000 == 0:
        print("迭代 {} 次后的误差为 {}".format(i, loss.numpy()))
    
print("完成训练, 预测值与实值的误差 {}".format(loss.numpy()))

W = linear.weight.numpy().item()
b = linear.bias.numpy().item()

print("每公里的费用 {}".format(W))
print("起步价: {}".format(b))

运行结果:
迭代 0 次后的误差为 [432.29745]
迭代 1000 次后的误差为 [8.166112]
迭代 2000 次后的误差为 [1.8258718]
迭代 3000 次后的误差为 [0.40824845]
迭代 4000 次后的误差为 [0.09128004]
迭代 5000 次后的误差为 [0.02041058]
迭代 6000 次后的误差为 [0.00456363]
迭代 7000 次后的误差为 [0.00102052]
迭代 8000 次后的误差为 [0.00022823]
迭代 9000 次后的误差为 [5.112471e-05]
迭代 10000 次后的误差为 [1.1453724e-05]
迭代 11000 次后的误差为 [2.653441e-06]
迭代 12000 次后的误差为 [6.6502554e-07]
迭代 13000 次后的误差为 [1.5586754e-07]
迭代 14000 次后的误差为 [1.5586754e-07]
完成训练, 预测值与实值的误差 [1.5586754e-07]
每公里的费用 2.0000507831573486
起步价: 9.999356269836426

你可能感兴趣的:(人工智能,算法,人工智能)