Python 梯度下降

为了实现监督学习,我们选择采用自变量x1、x2的线性函数来评估因变量y值,得到:

这里,sita1、sita2代表自变量x1、x2的权重(weights),sita0代表偏移量。为了方便,我们将评估值写作h(x),令x0=1,则h(x)可以写作:

其中n为输入样本数的数量。为了得到weights的值,我们需要令我们目前的样本数据评估出的h(x)尽可能的接近真实y值。我们定义误差函数(cost function)来表示h(x)和y值相接近的程度:



这里的系数1/2是为了后面求解偏导数时可以与系数相互抵消,一般用2m,算法更优化。这里更新算法我们选择梯度下降算法,利用初始化的weights并且反复更新weights:

这里a代表学习率,表示每次向着J最陡峭的方向迈步的大小。为了更新weights,我们需要求出函数J的偏导数。首先计算只有一个数据样本(x,y)时,如何计算J的偏导数:

对于只含有一组数据的训练样本,我们可以得到更新weights的规则为:

扩展到多组数据样本,更新公式为:


该算法又叫做随机梯度下降法,这种算法不停的更新weights,每次使用一个样本数据进行更新。当数据量较大时,一般使用后者算法进行更新。


Python中实现梯度下降法的步骤如下: 1. 首先,导入所需的库,例如numpy和matplotlib.pyplot。这些库将帮助我们进行数值计算和可视化。 2. 声明要优化的目标函数。这个函数可以是任何可微函数,我们希望通过梯度下降法找到它的极小值/极大值。 3. 初始化模型参数(例如权重和偏置)和学习率。学习率控制每次更新参数时的步长。 4. 在一个循环中,迭代更新参数直到满足停止条件。停止条件可以是达到最大迭代次数或参数变化的阈值。 5. 在每次迭代中,计算目标函数关于参数的梯度。这可以通过利用链式法则和导数规则来实现。 6. 使用计算得到的梯度和学习率,更新参数的值。根据梯度的方向和学习率的大小,我们可以向极小值或极大值方向移动。 7. 在每次迭代后,可以计算并记录目标函数的值,以便在训练过程中进行可视化或评估模型的性能。 8. 最后,返回最优参数的值,并可选地进行进一步的分析或使用。 需要注意的是,在使用梯度下降法时,我们通常需要对特征进行标准化,以保证它们的大小比例差不多。这可以使用sklearn中的StandartScaler类来实现。 下面是一个简单的示例代码,演示了如何在Python中使用梯度下降法: ```python import numpy as np import matplotlib.pyplot as plt # 定义目标函数 def target_function(x): return (x - 2.5)**2 - 1 # 初始化参数和学习率 theta = 0 learning_rate = 0.1 # 迭代更新参数 for _ in range(100): # 计算梯度 gradient = 2 * (theta - 2.5) # 更新参数 theta = theta - learning_rate * gradient # 可选:绘制目标函数和优化后的结果 plot_x = np.linspace(-1, 6, 141) plot_y = target_function(plot_x) plt.plot(plot_x, plot_y) plt.scatter(theta, target_function(theta), color='red') plt.show() # 返回最优参数的值 print("Optimal theta:", theta) ``` 通过以上代码,我们可以看到在迭代更新参数后,我们得到了最优参数的值。这就是使用梯度下降法在Python中求解目标函数极小值的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值