在上一篇博客中,简单介绍了一下人工智能的直观理解。
接下来就用一个最简单的例子来演示一下机器学习中最常用的梯度下降的用法。

梯度下降本身还是有很多理论干货的,但是因为实际代码中都浓缩成了一个函数去调用,所以有时候不太了解也不影响使用。
不过几种常用的优化函数还是要知道的,可以参考这篇博客:

我们假如要买房:房价=每平米价格* 面积+固定费用(手续费、物业费等)
用一个简单方程表示:y=a* x+b

我们假设实际情况是y=0.5x+0.7,我们现在就要通过梯度下降算出参数a、b的值是0.5和0.7

代码如下

# -*- coding=UTF-8 -*-

# 本代码在mac电脑,python3.6环境测试通过
# 第一行表示本脚本文本文件存盘使用的代码是utf-8,并且字符串使用的编码也是utf-8,
# 在本源码中,这一点其实没有什么区别,但如果需要中文输出的时候,这一行就必须要加了。

# 引入TensorFlow库
import tensorflow as tf
# 引入数值计算库
import numpy as np

# 使用 NumPy 生成假数据集x,代表房间的平米数,这里的取值范围是0-1的浮点数,
# 生成的数据共100个,式样是100行,每行1个数据
x = np.float32(np.random.rand(100, 1))
# 我们假设每平米0.5万元,基础费用0.7万,我们给定了这个事件的规律是:y=0.5x+0.7
# 如果最终运行的结果,求出了ab的值分别为0.5/0.7,就代表计算成功
# 计算最终房价y,x和y一同当做我们的样本数据
# np.dot的意思就是向量x * 0.5
y = np.dot(x, 0.5) + 0.7

# ---------------------------------数据集准备完成
# 以下使用TensorFlow构建数学模型,在这个过程中,
# 直到调用.run之前,实际上都是构造模型,而没有真正的运行。
# 这跟上面的numpy库每一次都是真正执行是截然不同的区别
# 我们假定房价的公式为:y=a*x+b

# tf.Variable是在TensorFlow中定义一个变量的意思
# 赋初始值:这里简单起见,人为给a/b两个初始值,都是0.3,
b = tf.Variable(np.float32(0.3))
a = tf.Variable(np.float32(0.3))

# 这是定义主要的数学模型,模型来自于上面的公式
# 注意这里必须使用tf的公式,这样的公式才是模型
# 上面使用np的是直接计算,而不是定义模型
# TensorFlow的函数名基本就是完整英文,应当能读懂
y_value = tf.multiply(x, a) + b

# 这里是代价函数,同我们文中所讲的唯一区别是用平方来取代求绝对值,
# 目标都是为了得到一个正数值,功能完全相同,
# 平方计算起来会更快更容易,这种方式也称为“方差“
loss = tf.reduce_mean(tf.square(y_value - y))
# TensorFlow内置的梯度下降算法,每步长0.5
optimizer = tf.train.GradientDescentOptimizer(0.5)
# 代价函数值最小化的时候,代表求得解
train = optimizer.minimize(loss)

# 初始化所有变量,也就是上面定义的a/b两个变量
init = tf.global_variables_initializer()

# 启动图
sess = tf.Session()
# 真正的执行初始化变量,还是老话,上面只是定义模型,并没有真正开始执行
sess.run(init)

# 重复梯度下降200次,每隔5次打印一次结果
for step in range(0, 200):
    sess.run(train)
    if step % 5 == 0:
        print(step, sess.run(loss), sess.run(a), sess.run(b))

运行结果为:

java实现梯度下降算法 梯度下降算法代码_梯度下降


可以看出,得到了我们想要的结果。