当前位置:   article > 正文

梯度下降算法的实现【python,算法,机器学习】

梯度下降算法的实现【python,算法,机器学习】

场景是一个简单的线性回归的例子:假设现在我们有一系列的点,我们将用梯度下降法来拟合出这条直线!

首先,我们需要定义一个代价函数,在此我们选用均方误差代价函数 J ( θ ) = 1 2 n ∑ i = 0 n ( y i − y ^ i ) 2 J(\theta) = \frac{1}{2n} \sum\limits_{i=0}^n (y_i - \hat{y}_i)^2 J(θ)=2n1i=0n(yiy^i)2
这个公式的参数解释如下:

  1. n是数据集中点的个数。
  2. ½ 是一个常量,这样是为了在求梯度的时候,二次方乘下来就和这里的½抵消了,自然就没有多余的常数系数,方便后续的计算,同时对结果不会有影响。
  3. y ^ i \hat{y}_i y^i 是数据集中每个点的真实y坐标的值。
  4. y i y_i yi 是我们的预测函数,根据每一个输入xΘ计算得到预测的 y i y_i yi值,即 y i = θ 0 + θ 1 x i y_i=\theta_0 + \theta_1 x_i yi=θ0+θ1xi

然后对这个代价函数求偏导数,根据偏导公式,进行迭代计算,当梯度下降到一定程度,完成计算,获取最后的 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1

下面是利用梯度下降法求解线性回归函数的示例代码:

import numpy as np

# Size of the points dataset.
m = 20

# Points x-coordinate and dummy value (x0, x1).
X0 = np.ones((m, 1))
X1 = np.arange(1, m + 1).reshape(m, 1)
X = np.hstack((X0, X1))

# Points y-coordinate
y = np.array([
	3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12,
	11, 13, 13, 16, 17, 18, 17, 19, 21
]).reshape(m, 1)

# The Learning Rate alpha.
alpha = 0.01


# 代价函数
def error_function(theta, X, y):
	diff = np.dot(X, theta) - y
	# 利用矩阵乘法计算
	return (1. / 2 * m) * np.dot(np.transpose(diff), diff)


# 梯度函数
def gradient_function(theta, X, y):
	diff = np.dot(X, theta) - y
	# 将两个梯度公式柔和到一起,可以使用矩阵解决,X 转置后 theta0的偏导系数都是 1, theta1 的偏导系数是一系列 x
	return (1. / m) * np.dot(np.transpose(X), diff)


# 梯度下降算法
def gradient_descent(X, y, alpha):
	# 初始化 theta 的值
	theta = np.array([1, 1]).reshape(2, 1)
	gradient = gradient_function(theta, X, y)
	# 如果梯度值很小了,结束下降搜索
	while not np.all(np.absolute(gradient) <= 1e-5):
		theta = theta - alpha * gradient
		gradient = gradient_function(theta, X, y)
	return theta


# 求解 theta0 和 theta1
optimal = gradient_descent(X, y, alpha)
print('optimal:', optimal)
# 计算代价函数的最小值
print('error function:', error_function(optimal, X, y)[0, 0])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

上述代码中,巧妙的利用矩阵乘法规则实现了求和计算,这样使得梯度计算更加简便,最后计算得出的(\theta0, \theta1)便是所求直线的参数。

注意,代码中xy表示实测的数据集,你可以根据实际情况进行替换。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/604167
推荐阅读
相关标签
  

闽ICP备14008679号