首页 > 编程语言 >优化算法——坐标上升法

优化算法——坐标上升法

时间:2023-06-14 20:35:03浏览次数:34  
标签:__ plt 1.0 算法 坐标 import 优化 append


一、坐标上升法算法原理

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

假设需要求解的优化问题的具体形式如下:

优化算法——坐标上升法_优化算法

其中,优化算法——坐标上升法_优化问题_02是向量优化算法——坐标上升法_参考文献_03的函数。

更新过程为每次固定除优化算法——坐标上升法_参考文献_04以外的参数,求得满足条件的优化算法——坐标上升法_参考文献_04,直到算法收敛,具体的算法过程如下所示:

优化算法——坐标上升法_迭代_06


(图片来自参考文献1)

下面以如下的优化问题为例:

优化算法——坐标上升法_坐标上升法_07

在迭代的过程中,每次固定优化算法——坐标上升法_迭代_08更新优化算法——坐标上升法_优化问题_09,在确定了优化算法——坐标上升法_优化问题_09的条件下,固定优化算法——坐标上升法_优化问题_09,更新优化算法——坐标上升法_迭代_08,即:

优化算法——坐标上升法_迭代_13

令其为优化算法——坐标上升法_坐标上升法_14,得到:

优化算法——坐标上升法_坐标上升法_15

再固定优化算法——坐标上升法_迭代_08,得到:

优化算法——坐标上升法_优化问题_17

得到:

优化算法——坐标上升法_优化算法_18

不断按照上述的过程,直到算法收敛。下图是算法在整个过程中的更新曲线:

优化算法——坐标上升法_参考文献_19

代码如下:

'''
Date: 20160406
@author: zhaozhiyong
'''
import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = -(X**2)
Z2 = -(Y**2)
Z = 1.0 * (Z1 + 3 * Z2 + 2 * X * Y)+6.0

plt.figure()

CS = plt.contour(X, Y, Z)

a = []
b = []

a.append(2.0)
b.append(2.0)

j = 1

for i in xrange(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)

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

二、坐标上升法在函数优化中的应用

下面考虑求解如下的最大值问题:

优化算法——坐标上升法_参考文献_20

将上述函数分别对优化算法——坐标上升法_优化问题_21求偏导,并令其为优化算法——坐标上升法_坐标上升法_14,得到如下的等式:

优化算法——坐标上升法_参考文献_23

优化算法——坐标上升法_参考文献_24

优化算法——坐标上升法_参考文献_25

最终的结果为:

优化算法——坐标上升法_优化问题_26

代码如下:

#!/bin/python
'''
Date: 20160406
@author: zhaozhiyong
'''

def f(x):
	x_1 = x[0]
	x_2 = x[1]
	x_3 = x[2]

	result = -(x_1*x_1)-2*(x_2*x_2)-3*(x_3*x_3)+2*x_1*x_2+2*x_1*x_3-4*x_2*x_3+6

	return result


if __name__ == "__main__":
	#print "hello world"
	err = 1.0e-10
	x = [1.0, 1.0, 1.0]
	f_0 = f(x)
	while 1:
		#print "Hello"
		x[0] = x[1] + x[2]
		x[1] = x[0] / 2 - x[2]
		x[2] = x[0] / 3 - 2 * x[1] / 3

		f_t = f(x)
		
		if (abs(f_t - f_0) < err):
			break

		f_0 = f_t
	
	print "max: " + str(f_0)
	print x

参考文章

  • 坐标上升算法(Coordinate Ascent)及C++编程实现
  • 机器学习算法与Python实践之(四)支持向量机(SVM)实现


标签:__,plt,1.0,算法,坐标,import,优化,append
From: https://blog.51cto.com/u_16161414/6480427

相关文章

  • 数据结构和算法——旋转打印链表
    1、问题描述输入参数nn为正整数,如输入n=5n=5,则按行打印如下的数字:2、问题的理解这个问题是将数字1…n21…n2按照一圈一圈的方式......
  • Pasos和RAFT算法
    Paxos提出时间1990年,RAFT提出时间2013年。RAFT是Paxos的简化版,或者说是提高投票效率,但是降低了投票公平性的妥协方案。RAFT分布式raft(ReplicatedAndFaultTolerant)选举算法原理分成三个角色,领导者,跟随者,和候选者。在没有领导者的时候和领导者联系不上的时候。跟随者......
  • 图像拼接算法技术报告
    图像拼接算法技术报告代码介绍图像拼接是将多个图像按照一定的顺序和几何变换方法组合在一起,形成一个更大、更完整的图像的过程。通过图像拼接,可以将多个部分图像合并为一个整体,以展示更广阔的视野或提供更全面的信息。我们先感性地看一组实验结果(静态场景的图像拼接):左图......
  • go语言编写算法
    1、冒泡排序//冒泡排序a:=[]uint8{9,20,10,23,7,22,88,102}fori:=0;i<len(a);i++{fork:=i+1;k<(len(a)-i);k++{ifa[i]>a[k]{a[i],a[k]=a[k],a[i]}}......
  • 简单易学的机器学习算法——K-Means算法
    一、聚类算法的简介  聚类算法是一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中。聚类算法与分类算法最大的区别是:聚类算法是无监督的学习算法,而分类算法属于监督的学习算法。  在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似......
  • 推荐算法——基于矩阵分解的推荐算法
    一、推荐算法概述对于推荐系统(RecommendSystem,RS),从广义上的理解为:为用户(User)推荐相关的商品(Items)。常用的推荐算法主要有:基于内容的推荐(Content-BasedRecommendation)协同过滤的推荐(CollaborativeFilteringRecommendation)基于关联规则的推荐(AssociationRule-Based......
  • 推荐系统中的常用算法——基于Graph Embedding的GES和EGES
    1.概述相比较于基于CollaborativeFilter算法,基于基础GraphEmbedding模型可以根据用户的行为序列学习出item的embedding,利用item对应的Embedding可以方便计算item与item之间的相似度,并在实践中被证明是卓有成效的方法,在基于基础GraphEmbedding模型,主要包括item2vec,node2vec,deepw......
  • 文本分类fastText算法
    1.概述在深度学习遍地开花的今天,浅层的网络结构甚至是传统的机器学习算法被关注得越来越少,但是在实际的工作中,这一类算法依然得到广泛的应用,或者直接作为解决方案,或者作为该问题的baseline,fastText就是这样的一个文本分类工具。fastText是2016年由facebook开源的用于文本分类的工......
  • 机器学习算法实现解析——libFM之libFM的训练过程概述
    本节主要介绍的是libFM源码分析的第四部分——libFM的训练。FM模型的训练是FM模型的核心的部分。4.1、libFM中训练过程的实现在FM模型的训练过程中,libFM源码中共提供了四种训练的方法,分别为:StochasticGradientDescent(SGD),AdaptiveSGD(ASGD),AlternatingLeastSquares(ALS)和MarkovCh......
  • 挑战数据结构和算法面试题——二叉搜索树的后序遍历
    分析:根据二叉查找树的定义,二叉查找树或者是一棵空二叉树,或者是具有一下特性的二叉树:若它的左子树不为空,则左子树上的所有结点的值均小于根节点的值;若它的右子树不为空,则右子树上的所有结点的值均小于根节点的值;它的左右子树又分别是二叉查找树。结合二叉树的后序遍历,则初始序列的最......