图文详解梯度下降算法的原理及Python实现

  • Post category:Python

图文详解梯度下降算法的原理及Python实现

梯度下降算法是一种常用的优化算法,用于求解函数的最小值。本文将详细绍梯度下降算法的原理及Python实现,并提供两个示例说明。

梯度下降算法的原理

梯度下降算法的基本思想是通过不地迭代,沿着函数的负梯度方向逐步逼近函数的最小值。具体来说,梯度下降算法的迭代式如下:

$$
\theta_{i+1} = \theta_i – \alpha \nabla J(\theta_i)
$$

其中,$\theta_i$表示第$i$次迭代的参数向量,$\alpha$表示学习率,$\nabla J(\theta_i)$表示目标函数$J$在$\theta_i$处的梯度向量。梯度向量的每个分量表示目标函数在对应参数方向上的变化率,即函数在该方向上的斜率。

梯度下降算法的迭代过程如下:

  1. 初始化参数向量$\theta_0$;
  2. 计算目标函数在$\theta_0$处的梯度向量nabla J(\theta_0)$;
  3. 更新参数向量$\theta_1 = \theta_0 – \alpha \nabla J(\theta_0)$;
  4. 重复步骤2和3,直到满足停止条件。

停止条件可以是达到最大迭代次数、目标函数的变化量小于某个阈值等。

梯度下降算法的Python实现

在Python中,我们可以使用numpy库实现梯度下降算法。下面是一个简单的示例代码,用于求解一个简单的优化。

import numpy as np

# 定义目标函数
def objective_function(x):
    return x ** 2

# 定义目标函数的梯度
def gradient(x):
    return 2 * x

# 定义梯度下降算法
def gradient_descent(objective_function, gradient, x0, learning_rate, max_iterations, tolerance):
    x = x0
    for i in range(max_iterations):
        grad = gradient(x)
        if np.linalg.norm(grad) < tolerance:
            break
        x -= learning_rate * grad
    return x, objective_function(x)

# 运行梯度下降算法
x0 = 10
learning_rate = 0.1
max_iterations = 100
tolerance = 1e-6
best_solution, best_fitness = gradient_descent(objective_function, gradient, x0, learning_rate, max_iterations, tolerance)

# 输出结果
print("Best solution: ", best_solution)
print("Best fitness: ", best_fitness)

在这个示例中,我们首先定义了一个简单的目标函数,即$f(x)=x^2$。然后,我们使用numpy库实现了梯度下降算法。在梯度下降算法中,我们首先初始化参数向量$x_0$,然后不断迭代寻找最优解。在每一迭代中,我们计算目标函数在当前参数向量处的梯度向量,并根据学习率更新参数向量。最后,我们输出优解和最优解的适应度值。

示例1:使用梯度下降算法进行线性回归

在这个示例中,我们使用梯度下降算法对一个线性回归模型进行优化。我们首先定义一个简单的线性回归模型,然后使用梯度下降算法对该模型进行化。

import numpy as np
import matplotlib.pyplot as plt

# 定义线性回归模型
class LinearRegression:
    def __init__(self):
        self.w = None

    def fit(self, X, y, learning_rate=0.01, max_iterations=1000, tolerance=1e-6):
        n_samples, n_features = X.shape
        self.w = np.zeros(n_features)
        for i in range(max_iterations):
            y_pred = X.dot(self.w)
            grad = X.T.dot(y_pred - y) / n_samples
            if np.linalg.norm(grad) < tolerance:
                break
            self.w -= learning_rate * grad

    def predict(self, X):
        return X.dot(self.w)

# 加载数据集
X = np.array([[1, 2], [2, 4], [3, 6], [4, 8]])
y = np.array([2, 4, 6, 8])

# 运行线性回归模型
model = LinearRegression()
model.fit(X, y)

# 输出结果
print("Weights: ", model.w)

# 绘制结果
plt.scatter(X[:, 0], y)
plt.plot(X[:, 0], model.predict(X))
plt.show()

在这个示例中,我们首先定义了一个简单的线性回归模型,包含一个权重向量$w$。然后,我们使用numpy库加载训练数据,并使用梯度下降算法对该模型进行优化。最后,我们输出模型的权重向量,并使用matplotlib库绘制了模型的拟合曲线。

示例2:使用梯度下降算法进行逻辑回归

在这个示例中,我们将使用梯度下降算法对一个逻辑回归模型进行优化。我们首先定义一个简单的逻辑回归模型,然后使用梯下降算法对该模型进行优化。

import numpy as np
import matplotlib.pyplot as plt

# 定义逻辑回归模型
class LogisticRegression:
    def __init__(self):
        self.w = None

    def sigmoid(self, z):
        return 1 / (1 + np.exp(-z))

    def fit(self, X, y, learning_rate=0.01, max_iterations=1000, tolerance=1e-6):
        n_samples, n_features = X.shape
        self.w = np.zeros(n_features)
        for i in range(max_iterations):
            z = X.dot(self.w)
            y_pred = self.sigmoid(z)
            grad = X.T.dot(y_pred - y) / n_samples
            if np.linalg.norm(grad) < tolerance:
                break
            self.w -= learning_rate * grad

    def predict(self, X):
        z = X.dot(self.w)
        y_pred = self.sigmoid(z)
        return (y_pred > 0.5).astype(int)

# 加载数据集
X = np.array([[1, 2], [2, 4], [3, 6], [4, 8]])
y = np.array([0, 0, 1, 1])

# 运行逻辑回归模型
model = LogisticRegression()
model.fit(X, y)

# 输出结果
print("Weights: ", model.w)

# 绘制结果
plt.scatter(X[:, 0], y)
plt.plot(X[:, 0], model.predict(X))
plt.show()

在这个示例中,我们首先定义了一个简单的逻辑回归模型,包含一个权重向$w$和一个sigmoid函数。然后,我们使用numpy库加载训练数据,并使用梯度下降算法对该模型进行优化。最后,我们输出模型的权重量,并使用matplotlib库绘制了模型的拟合曲线。