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

14 篇文章 0 订阅
12 篇文章 0 订阅

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

首先,我们需要定义一个代价函数,在此我们选用均方误差代价函数 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])

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

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

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值