梯度下降在机器学习中作为一种优化算法,通常要最小化一个损失函数来优化模型的参数。
梯度下降算法的基本思路是:通过计算损失函数关于模型参数的梯度(也就是变化率的方向),然后沿着梯度的反方向逐步调整参数,使得损失函数的值不断减小。
简单来说,它就像是在一个参数空间的山坡上,我们要找到山底(即最小的损失值),通过不断沿着最陡峭的方向往下走(即根据梯度调整参数)来逐步接近目标。
在实际应用中,有不同的梯度下降变体,如批量梯度下降、随机梯度下降和小批量梯度下降等,它们在计算效率和收敛性等方面各有特点。
以下是一个简单的梯度下降算法示例代码(以线性回归为例):
x = [(2, 0, 3), (1, 0, 3), (1, 1, 3), (1,4, 2), (1, 2, 4)] # 定义输入数据 x
y = [5, 6, 8, 10, 11] # 定义目标值 y
epsilon = 0.002 # 允许的误差阈值
alpha = 0.02 # 学习率
diff = [0, 0] # 用于存储差值的列表
max_itor = 1000 # 最大迭代次数
error0 = 0 # 上一次的误差
error1 = 0 # 当前误差
cnt = 0 # 迭代计数
m = len(x) # 数据数量
theta0 = 0 # 模型参数 theta0
theta1 = 0 # 模型参数 theta1
theta2 = 0 # 模型参数 theta2
while True:
cnt += 1
for i in range(m): # 遍历数据
diff[0] = (theta0 * x[i][0] + theta1 * x[i][1] + theta2 * x[i][2]) - y[i] # 计算预测值与真实值的差值
theta0 -= alpha * diff[0] * x[i][0] # 根据梯度下降更新 theta0
theta1 -= alpha * diff[0] * x[i][1] # 根据梯度下降更新 theta1
theta2 -= alpha * diff[0] * x[i][2] # 根据梯度下降更新 theta2
error1 = 0 # 重置当前误差为 0
for lp in range(len(x)): # 再次遍历数据计算总误差
error1 += (y[lp] - (theta0 * x[lp][0] + theta1 * x[lp][1] + theta2 * x[lp][2])) ** 2 / 2 # 计算单个样本的误差平方和并累加到总误差
if abs(error1 - error0) < epsilon: # 如果误差变化小于阈值
break # 退出循环
else: # 否则
error0 = error1 # 更新上一次误差为当前误差
print('最终: theta0 : %f, theta1 : %f, theta2 : %f' % (theta0, theta1, theta2))
print('迭代次数: %d' % cnt)
运行结果如下:
拟合的目标函数可表示为:
f
(
x
0
,
x
1
,
x
2
)
=
θ
0
x
0
+
θ
1
x
1
+
θ
2
x
2
f({{x}_{0}},{{x}_{1}},{{x}_{2}})={{\theta }_{0}}{{x}_{0}}+{{\theta }_{1}}{{x}_{1}}+{{\theta }_{2}}{{x}_{2}}
f(x0,x1,x2)=θ0x0+θ1x1+θ2x2,通过迭代更新参数的方式来逐渐逼近最优解