# -*- coding: utf-8 -*-
import numpy as np
import warnings
warnings.filterwarnings("ignore")

def gradient_descent(initial_theta, eta=0.05, n_iters=1000, epsilon=1e-8):
    """
    通用梯度下降算法
    :param initial_theta: 参数初始值, 类型为 float
    :param eta: 学习率, 类型为 float
    :param n_iters: 最大训练轮数, 类型为 int
    :param epsilon: 容忍的最小变化范围, 类型为 float
    :return: 训练后得到的参数
    """
    # ********** Begin **********#
    theta = float(initial_theta)
    
    # 示例目标函数 J(θ) = (θ - 5)^2
    # 它的梯度/导数是 dJ/dθ = 2 * (θ - 5)
    def dj(theta_val):
        return 2 * (theta_val - 5)

    current_iter = 0
    while current_iter < n_iters:
        # 计算梯度
        gradient = dj(theta)
        # 记录旧的 theta 值，用于比较变化量
        last_theta = theta
        # 更新 theta
        theta = theta - eta * gradient
        
        # 如果参数变化非常小，则认为已收敛，提前结束
        if abs(theta - last_theta) < epsilon:
            break
        
        current_iter += 1
        
    return theta
    # ********** End **********#