梯度下降与共轭梯度法求解最优化应用

           使用梯度下降与共轭梯度法求解: 

python源码:

from numpy import *
import matplotlib.pyplot as plt

def opt330(X: ndarray, r: int, alpha: float, beta: float, alg: str, maxiter: int = 2000):
    global A
    global B
    global step
    res = []  #迭代散点
    fx_fro_a = gradient_f_a(A,B)
    fx_fro_b = gradient_f_b(A,B)
    d_a = A
    d_b = B

    for j in range(maxiter):
        if(alg=='gradient'):
                A = A - step*gradient_f_a(A,B)
                B = B - step*gradient_f_b(A,B)
        elif(alg=='cg'):
            d_a = - gradient_f_a(A,B) + d_a*(gradient_f_a(A,B).ravel().T.dot((gradient_f_a(A,B)-fx_fro_a).ravel()))/(fx_fro_a.ravel().T.dot(fx_fro_a.ravel()))
            d_b = - gradient_f_b(A,B) + d_b*(gradient_f_b(A,B).ravel().T.dot((gradient_f_b(A,B)-fx_fro_b).ravel()))/(fx_fro_b.ravel().T.dot(fx_fro_b.ravel()))
            fx_fro_a = gradient_f_a(A,B)
            fx_fro_b = gradient_f_b(A, B)
            A = A + step*d_a
            B = B + step*d_b
        res.append(f(A,B))

    title = 'alpha='+str(alpha)+'  beta='+str(beta)
    plt.plot(res,color="red")
    plt.title(title)

    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus']=False
    
    plt.xlabel("迭代次数")
    plt.ylabel("函数最小值")
    plt.show()
    
    #print()
    print('%d'"次迭代后的最小值为:"%maxiter)
    print(res[-1])
 
    return A, B.T

def  gradient_f_a(a,b):
    return -2*dot(X,b)+2*a.dot(dot(b.T,b))+alpha*a
def  gradient_f_b(a,b):
    return -2*dot(X.T,a)+2*b.dot(dot(a.T,a))+beta*b

def f(a,b):
    return pow(linalg.norm(X-dot(a,b.T)),2)+alpha*pow(linalg.norm(a),2)+beta*pow(linalg.norm(b),2)

if __name__ == '__main__':

    alg = "cg"       #gradient:梯度下降  cg:共轭梯度
    alpha = 1
    beta = 2  
    maxiter = 2000   #迭代次数
    R = 5
    A = random.random((50,R))
    B = random.random((20,R))
    step = 0.0008     #步长

    print("默认:" + "\n" + "R = 5" + "   " + "α = 1" + "   " + "β = 2" + "   " + " maxiter =2000" +"\n" "默认共轭梯度")
    define = str(input("自定义参数(Y/N):"))
    if(define == 'Y'):
        R = int(input("设置R(default R = 5):"))
        alpha = int(input("设置α(default α = 1):"))
        beta = int(input("设置β(default β = 2):"))
        iterations = int(input("设置maxiter(default 2000):"))
        alg = str(input("设置alg(gradient or cg):"))
    A = random.random((50,R))
    B = random.random((20,R))

    X = A.dot(B.T)
    opt330(X,R,alpha,beta,alg,maxiter)

源码百度云:链接:https://pan.baidu.com/s/1BAgof7ilY0RtVEOOCKdleA    提取码:jjfz 
复制这段内容后打开百度网盘手机App,操作更方便哦

共轭梯度法运行结果:
    

梯度下降法运行结果:

梯度下降算法迭代公式:

共轭梯度迭代公式:

算法特点:

1、梯度下降算法并不能保证被优化函数达到全局最优解,只有当损失函数为凸函数时,梯度下降算法才能保证达到全局最优解,因此不能保证一定达到全局最优,受限于损失函数是否为凸函数。

2、梯度下降算法由于要在全部数据上最小化损失,在海量训练数据下,计算时间长。

3、共轭梯度法是介于最速下降法牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算海塞矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦我飞也

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值