坐标下降/上升算法(Coordinate Decsent/Ascent)

坐标下降/上升算法(Coordinate Decsent/Ascent)

1.坐标上升/下降算法的原理:

坐标上升法(Coordinate Ascent)每次通过更新函数中的一维,通过多次的迭代以达到优化函数的目的。

举例:

过程可视化出来后大概是这样的:

在这里插入图片描述

蓝色部分就是迭代的过程,一直到达中心的最优部分

2.自己的一些理解

首先我认为坐标上升/下降算法是同一种算法(这个问题我纠结了好久!!!)因为有些函数有最大值,有些有最小值。不同的函数应用这种算法的结果显然是不一样的。当然,这个算法的主要思想也就是先达到局部最优,由局部最优达到整体最优。本算法在支持向量机中得到了应用。

python实现:

# 坐标下降算法
import numpy as np
import matplotlib.pyplot as plt

# 建立步长为0.025,即每隔0.01取一个点
delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-3.0, 3.0, delta)
# x,y =
# [ -3.00000000e+00  -2.97500000e+00  -2.95000000e+00  -2.92500000e+00
#   -2.90000000e+00  -2.87500000e+00  -2.85000000e+00  -2.82500000e+00
#   -2.80000000e+00  -2.77500000e+00  -2.75000000e+00  -2.72500000e+00
#   -2.70000000e+00  -2.67500000e+00  -2.65000000e+00  -2.62500000e+00
#   -2.60000000e+00  -2.57500000e+00  -2.55000000e+00  -2.52500000e+00
#   -2.50000000e+00  -2.47500000e+00  -2.45000000e+00  -2.42500000e+00
#   -2.40000000e+00  -2.37500000e+00  -2.35000000e+00  -2.32500000e+00
#   -2.30000000e+00  -2.27500000e+00  -2.25000000e+00  -2.22500000e+00
#   -2.20000000e+00  -2.17500000e+00  -2.15000000e+00  -2.12500000e+00
#   -2.10000000e+00  -2.07500000e+00  -2.05000000e+00  -2.02500000e+00
#   -2.00000000e+00  -1.97500000e+00  -1.95000000e+00  -1.92500000e+00
#   -1.90000000e+00  -1.87500000e+00  -1.85000000e+00  -1.82500000e+00
#   -1.80000000e+00  -1.77500000e+00  -1.75000000e+00  -1.72500000e+00
#   -1.70000000e+00  -1.67500000e+00  -1.65000000e+00  -1.62500000e+00
#   -1.60000000e+00  -1.57500000e+00  -1.55000000e+00  -1.52500000e+00
#   -1.50000000e+00  -1.47500000e+00  -1.45000000e+00  -1.42500000e+00
#   -1.40000000e+00  -1.37500000e+00  -1.35000000e+00  -1.32500000e+00
#   -1.30000000e+00  -1.27500000e+00  -1.25000000e+00  -1.22500000e+00
#   -1.20000000e+00  -1.17500000e+00  -1.15000000e+00  -1.12500000e+00
#   -1.10000000e+00  -1.07500000e+00  -1.05000000e+00  -1.02500000e+00
#   -1.00000000e+00  -9.75000000e-01  -9.50000000e-01  -9.25000000e-01
#   -9.00000000e-01  -8.75000000e-01  -8.50000000e-01  -8.25000000e-01
#   -8.00000000e-01  -7.75000000e-01  -7.50000000e-01  -7.25000000e-01
#   -7.00000000e-01  -6.75000000e-01  -6.50000000e-01  -6.25000000e-01
#   -6.00000000e-01  -5.75000000e-01  -5.50000000e-01  -5.25000000e-01
#   -5.00000000e-01  -4.75000000e-01  -4.50000000e-01  -4.25000000e-01
#   -4.00000000e-01  -3.75000000e-01  -3.50000000e-01  -3.25000000e-01
#   -3.00000000e-01  -2.75000000e-01  -2.50000000e-01  -2.25000000e-01
#   -2.00000000e-01  -1.75000000e-01  -1.50000000e-01  -1.25000000e-01
#   -1.00000000e-01  -7.50000000e-02  -5.00000000e-02  -2.50000000e-02
#   -1.06581410e-14   2.50000000e-02   5.00000000e-02   7.50000000e-02
#    1.00000000e-01   1.25000000e-01   1.50000000e-01   1.75000000e-01
#    2.00000000e-01   2.25000000e-01   2.50000000e-01   2.75000000e-01
#    3.00000000e-01   3.25000000e-01   3.50000000e-01   3.75000000e-01
#    4.00000000e-01   4.25000000e-01   4.50000000e-01   4.75000000e-01
#    5.00000000e-01   5.25000000e-01   5.50000000e-01   5.75000000e-01
#    6.00000000e-01   6.25000000e-01   6.50000000e-01   6.75000000e-01
#    7.00000000e-01   7.25000000e-01   7.50000000e-01   7.75000000e-01
#    8.00000000e-01   8.25000000e-01   8.50000000e-01   8.75000000e-01
#    9.00000000e-01   9.25000000e-01   9.50000000e-01   9.75000000e-01
#    1.00000000e+00   1.02500000e+00   1.05000000e+00   1.07500000e+00
#    1.10000000e+00   1.12500000e+00   1.15000000e+00   1.17500000e+00
#    1.20000000e+00   1.22500000e+00   1.25000000e+00   1.27500000e+00
#    1.30000000e+00   1.32500000e+00   1.35000000e+00   1.37500000e+00
#    1.40000000e+00   1.42500000e+00   1.45000000e+00   1.47500000e+00
#    1.50000000e+00   1.52500000e+00   1.55000000e+00   1.57500000e+00
#    1.60000000e+00   1.62500000e+00   1.65000000e+00   1.67500000e+00
#    1.70000000e+00   1.72500000e+00   1.75000000e+00   1.77500000e+00
#    1.80000000e+00   1.82500000e+00   1.85000000e+00   1.87500000e+00
#    1.90000000e+00   1.92500000e+00   1.95000000e+00   1.97500000e+00
#    2.00000000e+00   2.02500000e+00   2.05000000e+00   2.07500000e+00
#    2.10000000e+00   2.12500000e+00   2.15000000e+00   2.17500000e+00
#    2.20000000e+00   2.22500000e+00   2.25000000e+00   2.27500000e+00
#    2.30000000e+00   2.32500000e+00   2.35000000e+00   2.37500000e+00
#    2.40000000e+00   2.42500000e+00   2.45000000e+00   2.47500000e+00
#    2.50000000e+00   2.52500000e+00   2.55000000e+00   2.57500000e+00
#    2.60000000e+00   2.62500000e+00   2.65000000e+00   2.67500000e+00
#    2.70000000e+00   2.72500000e+00   2.75000000e+00   2.77500000e+00
#    2.80000000e+00   2.82500000e+00   2.85000000e+00   2.87500000e+00
#    2.90000000e+00   2.92500000e+00   2.95000000e+00   2.97500000e+00]
# 将原始数据变为网格形式
X, Y = np.meshgrid(x, y)
Z1 = -(X ** 2)
Z2 = -(Y ** 2)
# 原始函数
Z = 1.0 * (Z1 + 3 * Z2 + 2 * X * Y) + 6.0
# z= [[-12.       -12.000625 -12.0025   ..., -47.105625 -47.4025   -47.700625]
# [-11.701875 -11.70125  -11.701875 ..., -46.51125  -46.806875 -47.10375 ]
# [-11.4075   -11.405625 -11.405    ..., -45.920625 -46.215    -46.510625]
# ...,
# [-46.216875 -45.92125  -45.626875 ..., -11.11125  -11.111875 -11.11375 ]
# [-46.8075   -46.510625 -46.215    ..., -11.405625 -11.405    -11.405625]
# [-47.401875 -47.10375  -46.806875 ..., -11.70375  -11.701875 -11.70125 ]]

# 打开画布
plt.figure()
CS = plt.contour(X, Y, Z)  # 画等高线
# 初始化权重
a = []
b = []
a.append(2.0)
b.append(2.0)

j = 1

for i in range(200):
    a_tmp = b[j - 1]
    a.append(a_tmp)
    b.append(b[j - 1])

    j = j + 1

    b_tmp = a[j - 1] / 3
    a.append(a[j - 1])
    b.append(b_tmp)

plt.plot(a, b)
max_x1 = a[-1]
max_x2 = b[-1]

print('当取最大值的时候,x1的取值为:', max_x1)
print('当取最大值的时候,x2的取值为:', max_x2)

print('max f:', -(max_x1 ** 2) - 3 * (max_x2 ** 2) + 2 * max_x1 * max_x2 + 6)

plt.title('Coordinate Ascent')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

在这里插入图片描述

谢谢!!!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
指数平滑法的计算中,关键是α的取值大小,但α的取值又容易受主观影响,因此合理确定α的取值方法十分重要,一般来说,如果数据波动较大,α值应取大一些,可以增加近期数据对预测结果的影响。如果数据波动平稳,α值应取小一些。理论界一般认为有以下方法可供选择:    经验判断法。这种方法主要依赖于时间序列的发展趋势和预测者的经验做出判断。   1、当时间序列呈现较稳定的水平趋势时,应选较小的α值,一般可在0.05~0.20之间取值;   2、当时间序列有波动,但长期趋势变化不大时,可选稍大的α值,常在0.1~0.4之间取值;   3、当时间序列波动很大,长期趋势变化幅度较大,呈现明显且迅速的上升下降趋势时,宜选择较大的α值,如可在0.6~0.8间选值,以使预测模型灵敏度高些,能迅速跟上数据的变化;   4、当时间序列数据是上升(或下降)的发展趋势类型,α应取较大的值,在0.6~1之间。   试算法。根据具体时间序列情况,参照经验判断法,来大致确定额定的取值范围,然后取几个α值进行试算,比较不同α值下的预测标准误差,选取预测标准误差最小的α。   在实际应用中预测者应结合对预测对象的变化规律做出定性判断且计算预测误差,并要考虑到预测灵敏度和预测精度是相互矛盾的,必须给予二者一定的考虑,采用折中的α值。 下期预测数=本期实际数×平滑系数+本期预测数×(1-平滑系数) 如某种产品销售量的平滑系数为0.4,1996年实际销售量为31万件,预测销售量为33万件。则1997年的预测销售量为: 1997年预测销售量= 31万件×0.4+33万件×(1-0.4)=32.2万件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值