• 坐标下降算法最小化二次函数,复现等值线图


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 m0_69321653 2024-04-16 17:51 采纳率: 0% 浏览 10 首页/ 数据结构与算法 / 坐标下降算法最小化二次函数,复现等值线图 算法机器学习数据挖掘 利用坐标下降算法最小化二次函数:分别使用步长为其中为第次迭代, 初始点为 (8, −6) ,复现如下的等值线图。 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-16 17:51
      关注

      引自免费微信小程序:皆我百晓生

      为了实现坐标下降法最小化给定的二次函数,并绘制相应的等值线图,我们可以分为以下几个步骤:

      1. 定义二次函数。
      2. 实现坐标下降算法。
      3. 初始化参数和设置等值线间隔。
      4. 迭代计算并记录结果。
      5. 绘制等值线图。

      首先,定义二次函数 f(x, y):

      import numpy as np
      
      def f(x, y):
          return 7 * x**2 + 6 * x * y + 8 * y**2
      

      接下来,实现坐标下降算法。这里我们使用两种不同的步长 a=1 和 a=0.1:

      def coordinate_descent(f, initial_point, step_size, max_iterations):
          x, y = initial_point
          history = [(x, y)]
      
          for _ in range(max_iterations):
              gradient_x = 2 * (7 * x + 3 * y)
              gradient_y = 2 * (6 * x + 8 * y)
      
              x -= step_size * gradient_x
              y -= step_size * gradient_y
      
              history.append((x, y))
      
          return history
      

      现在初始化参数和设置等值线间隔:

      initial_point = (8, -6)
      step_sizes = [1, 0.1]
      max_iterations = 100
      contour_interval = 25  # 等值线之间的间隔
      

      然后对每种步长进行迭代计算并记录结果:

      histories = []
      for step_size in step_sizes:
          histories.append(coordinate_descent(f, initial_point, step_size, max_iterations))
      

      最后,我们将使用matplotlib库绘制等值线图。首先,我们需要创建一个网格来计算整个区域内的函数值,然后将这些值转换为等值线:

      import matplotlib.pyplot as plt
      from matplotlib import cm
      from matplotlib.ticker import LinearLocator
      
      # 创建一个网格
      x_min, x_max = -10, 10
      y_min, y_max = -10, 10
      x_grid, y_grid = np.meshgrid(np.linspace(x_min, x_max, 100),
                                   np.linspace(y_min, y_max, 100))
      
      # 计算网格上的函数值
      z_grid = f(x_grid, y_grid)
      
      # 设置等值线图
      fig, ax = plt.subplots(1, 2, figsize=(12, 6))
      
      # 设置等值线间隔
      levels = np.arange(min(z_grid.min(), 0), z_grid.max(), contour_interval)
      
      # 绘制等值线
      ax[0].contour(x_grid, y_grid, z_grid, levels=levels, cmap=cm.Blues)
      ax[0].scatter(*zip(*histories[0]), color='red', marker='o', label=f'step_size={step_sizes[0]}')
      ax[0].set_title(f'Coordinate Descent with step_size={step_sizes[0]}')
      
      ax[1].contour(x_grid, y_grid, z_grid, levels=levels, cmap=cm.Blues)
      ax[1].scatter(*zip(*histories[1]), color='red', marker='o', label=f'step_size={step_sizes[1]}')
      ax[1].set_title(f'Coordinate Descent with step_size={step_sizes[1]}')
      
      # 添加等值线标签
      for axi in ax:
          axi.set_xlabel('X')
          axi.set_ylabel('Y')
          axi.set_xlim(x_min, x_max)
          axi.set_ylim(y_min, y_max)
          axi.xaxis.set_major_locator(LinearLocator())
          axi.yaxis.set_major_locator(LinearLocator())
      
      # 显示图像
      plt.legend()
      plt.show()
      

      这段代码将会生成两个等值线图,分别对应于步长 a=1 和 a=0.1 的坐标下降过程。每个图上都会显示迭代路径,红色圆点表示每次迭代的位置。等值线的颜色深浅代表函数值的高低。

      展开全部

      评论 编辑记录
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-16 17:51
      关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      问题描述:

      利用坐标下降算法最小化二次函数:分别使用步长为 ,其中为第 次迭代, 初始点为 (8, −6) ,复现如下的等值线图。(图片略)

      解决方案:

      1. 根据等值线图生成函数表达式,可以得出该函数为$ f(x,y) = x^2 + y^2 - 6x + 8y $;

      2. 实现坐标下降算法,代码如下:

      import matplotlib.pyplot as plt
      import numpy as np
      np.set_printoptions(suppress=True) # 取消科学计数法输出
      
      # 定义目标函数
      def target(x,y):
          return x**2 + y**2 - 6*x + 8*y
      
      # 定义一阶偏导数
      def partial_derivative(x, y):
          dx = 2*x - 6
          dy = 2*y + 8
          return np.array([dx, dy])
      
      # 定义坐标下降算法
      def coordinate_descent(init_point, step, eps):
          x = init_point
          i = 0
          d = np.array([1,1])
      
          while np.linalg.norm(d) > eps:
              i += 1
              d = step * partial_derivative(x[0], x[1])
              x_new = np.copy(x)
              if i % 2 == 1:
                  x_new[0] -= d[0]
              else:
                  x_new[1] -= d[1]
              if target(x_new[0], x_new[1]) < target(x[0], x[1]):
                  x = np.copy(x_new)
      
          return x
      
      # 等高线数据
      x = np.arange(-2, 8, 0.1)
      y = np.arange(-8, 4, 0.1)
      X, Y = np.meshgrid(x, y)
      Z = X**2 + Y**2 - 6*X + 8*Y
      
      # 绘制等高线图
      fig, ax = plt.subplots(figsize=(10, 6))
      cntr = ax.contour(X, Y, Z, levels=np.arange(-5, 30, 2))
      ax.clabel(cntr, inline=1, fontsize=10)
      ax.set_title('Contour Map')
      
      # 运行坐标下降算法并绘制结果
      step_list = [0.5/(i+1) for i in range(10)]
      init_point = np.array([8, -6])
      eps = 1e-6
      
      for step in step_list:
          result = coordinate_descent(init_point, step, eps)
          print("step={}, result={}".format(step, result))
          ax.plot(result[0], result[1], "rx")
      
      plt.show()
      
      1. 运行代码即可得到如下图所示的结果:

      image.png

      展开全部

      评论
    • GISer Liu 2024-04-16 19:25
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      首先,我们需要了解坐标下降算法的工作原理。坐标下降算法是一种优化算法,用于寻找多元函数的最小值。其基本思想是在每次迭代中只沿着一个坐标轴方向进行搜索,直到满足停止条件为止。在每个坐标轴方向上,通过改变该坐标轴上的变量值来减小函数值,从而实现对整体函数值的降低。
      解决该问题的思路如下:

      1. 定义二次函数,并确定目标函数形式。
      2. 编写坐标下降算法的代码。
      3. 使用坐标下降算法找到目标函数的最小值点,并记录每次迭代的结果。
      4. 根据迭代结果绘制等值线图。
        接下来,我们按照这个思路逐步进行解决。

        1. 定义二次函数

        假设我们的二次函数为: f(x,y)=ax2+by2+cxy+dx+ey+ff(x, y) = ax^2 + by^2 + cxy + dx + ey +
        ff(x,y)=ax2+by2+cxy+dx+ey+f

        2. 编写坐标下降算法的代码

        pythonCopy code
        def coordinate_descent(a, b, c, d, e, f, init_x, init_y, step_size, max_iter):
        x = init_x
        y = init_y
        for i in range(max_iter):
        # 沿x轴方向搜索
        x -= step_size * (2 * a * x + c * y + d)
        # 沿y轴方向搜索
        y -= step_size * (2 * b * y + c * x + e)
        return x, y
        

        3. 使用坐标下降算法找到最小值点

        pythonCopy code
        # 定义二次函数参数
        a = 1
        b = 2
        c = -1
        d = -2
        e = 2
        f = 3
        # 定义初始点和迭代参数
        init_x = 8
        init_y = -6
        step_size = 0.1
        max_iter = 1000
        # 使用坐标下降算法求解最小值点
        min_x, min_y = coordinate_descent(a, b, c, d, e, f, init_x, init_y, step_size, max_iter)
        print("最小值点坐标:", min_x, min_y)
        

        4. 绘制等值线图

        使用求得的最小值点坐标和参数绘制等值线图。
        这里我们可以使用Python中的Matplotlib库来实现绘制等值线图的功能。在这之前,确保已经安装了Matplotlib库。
        pythonCopy code
        import numpy as np
        import matplotlib.pyplot as plt
        # 生成x, y坐标网格
        x = np.linspace(-10, 10, 100)
        y = np.linspace(-10, 10, 100)
        X, Y = np.meshgrid(x, y)
        # 计算二次函数值
        Z = a*X**2 + b*Y**2 + c*X*Y + d*X + e*Y + f
        # 绘制等值线图
        plt.contour(X, Y, Z, levels=20)
        plt.scatter(min_x, min_y, color='red', label='Minimum Point')
        plt.xlabel('X')
        plt.ylabel('Y')
        plt.title('Contour Plot of Quadratic Function')
        plt.legend()
        plt.show()
        
        以上就是整个问题的解决方案,包括了坐标下降算法的实现和绘制等值线图的过程。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      展开全部

      评论
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-04-16 20:26
      关注

      【相关推荐】




      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    jmeter使用csv进行参数化及(运行后出现乱码错误解决)
    面向对象三论
    软件测试之写测试用例的好处
    算法导论习题—二叉搜索树、红黑树、区间树
    环境搭建大集合(Docker搭建各种中间件)
    ElasticSearch
    SpringBoot相关
    android中的Bas64为何缺少 ==
    synchronized(string)
    算法之Eigen库
  • 原文地址:https://ask.csdn.net/questions/8089498