《A diagonal quasi-Newton updating method for unconstrained optimization》文献算法实现

本次写的是《A diagonal quasi-Newton updating method for unconstrained optimization》文献算法实现----最优化实验,使用的是matlab。如果代码有错的话,请温柔的指出,谢谢。😊

1、这篇文献的算法的基本思想:♦算法叫做DNRTR算法

使用一种对角拟牛顿更新算法。在弱割线方程的作用下,通过最小化之前的估计值变化的大小和迹的更新来确定对角矩阵中逼近Hessian的元素。在温和的经典假设下,算法是线性收敛的。对角拟牛顿的更新满足有界退化性质。

2、算法的基本步骤:

在这里插入图片描述

3、本次实验使用的算例如下(根据实际需要,也可以换成其他的算例):

f ( x ) = ∑ i = 1 n ( ( n − ∑ j = 1 n cos ⁡ x j ) + i ( 1 − cos ⁡ x i ) − sin ⁡ x i ) 2 x = [ 0.2 , ⋯   , 0.2 ] T x  的维数是100  \begin{aligned} &f(x)=\sum_{i=1}^{n}\left(\left(n-\sum_{j=1}^{n} \cos x_{j}\right)+i\left(1-\cos x_{i}\right)-\sin x_{i}\right)^{2}\\ &x=[0.2, \cdots, 0.2]^{T}\\ &x \text { 的维数是100 } \end{aligned} f(x)=i=1n((nj=1ncosxj)+i(1cosxi)sinxi)2x=[0.2,,0.2]Tx 的维数是100 

4、实验实现步骤:

1、 编写目标函数文件(hanshu.m)
2、 编写求解目标函数的梯度文件(grad.m)
3、 编写DNRTR算法使用的Wolfe线搜索文件(wolfe.m)
4、 编写DNRTR算法文件(DNRTR.m)
5、 编写主函数文件(main.m)

5、实验过程:

1、目标函数文件(hanshu.m)

%目标函数
function f = hanshu(x)
n = length(x);
a = n - sum(cos(x));
b = 1 - cos(x);
c = sin(x);
d = 1:n;
d = d';
e = d.* b;
f1 = a + e -c;
g = f1.^2;
f = sum(g);
end

2、目标函数的梯度文件(grad.m)

%梯度
function g = grad(x)
n = length(x);
a = n - sum(cos(x));
b = 1 - cos(x);
c = sin(x);
d = 1:n;
d = d';
e = d.* b;
f1 = a + e -c;
f2 = sum(f1);
f3 = 2 * f1.*( d.* sin(x)- cos(x));
g = 2 * sin(x) * f2 + f3;
end

3、Wolfe线搜索文件(wolfe.m)

%第三步:wolfe线搜索,计算步长alpha(k)
function [f1, g1, x1, s] = wolfe(x, f, gd, d)
rho = 1e-4; 
alpha = 1; 
sigma = 0.8;
a = 0; 
b = Inf;
while 1
    s = alpha * d;    %计算sk
    x1 = x + s;
    f1 = hanshu(x1);
    if ~( f1 <= f + rho * alpha * gd )
       b = alpha;
       alpha = ( alpha + a )/2;   %计算出步长alpha(k)
       continue
    end
    g1 = grad(x1);
    if ~(g1'* d >= sigma * gd )
       a = alpha;
       alpha = min([2 * alpha, (b + alpha)/2]);  %计算出步长alpha(k)
       continue
    end
    break
end

4、DNRTR算法文件(DNRTR.m)

%功能:用对角拟牛顿修正法(DNRTR)求解无约束问题:min f(x)
function opt = DNRTR(x, epsg)
%第一步:初始化 
n = length(x);
k = 0;  %迭代次数
epsilon=0.01; %设置误差
g = grad(x); %计算梯度g0
f = hanshu(x);
d = -g;  %计算搜索方向d0
B = eye(n);
%第二步:测试停止迭代的标准
while 1
    opt = norm(g,'inf');  %计算gk的范数 max(abs(g))
    if opt <= epsg
        break   %测试停止迭代的标准,满足条件,则停止
    end
    gd = g' * d;
    %第三步:wolfe线搜索,计算步长alpha(k)
    [f, g1, x, s] = wolfe(x, f, gd, d);
    %第四步
    y = g1 - g; %计算yk
    g = g1;     %更新梯度
    %第五步:使用(21)式计算hessian更新对角线逼近的元素
    I = eye(n);
    Ak = diag(s.^2);
    Ak2 = diag(s.^4);
    B = B + ((s'*y + s' * s - s' * B * s )/trace(Ak2))* Ak - I;  %这行代码还可以换成下面那个代码片上的代码,实现的效果是一样的
    b = diag(B);
    %第六步:计算搜索方向 
    d = -g;
    p=length(d);
    for pp=1:p
        if b(pp)>= epsilon
            d(pp) = -g(pp)./b(pp);
        end
    end
    %第七步
    k = k + 1;
end
disp("迭代次数为:")
k
disp("最优点为:")
x
disp("最优值为:")
val = hanshu(x)
disp("最后的梯度的范数为:")
B = B + ((s'*y + s' * s - s' * B * s )/trace(Ak2))* Ak - I;  %可换成下面这行代码
B = B + ((s'*y + s' * s - s' * B * s )/sum(s.^4))* Ak - eye(n);

5、主函数文件(main.m)

clc
clear
n = 100;
x = 0.2 * ones(n,1);
epsg = 1e-5;
opt = DNRTR(x, epsg)
6、代码截图:

在这里插入图片描述

7、 运行结果截图:

在这里插入图片描述
在这里插入图片描述

8、实验结果分析:

迭代次数为:
k =
1871

最优点为:
x =[ 0.0006,…, 0.0006]’
x的维数为100.

最优值为:
val =
2.8293e-11

下面我把我的实验报告放上来,只需要关注我就可以下载了,不需要积分哦💡
DNRTR算法实现过程

本篇的参考文献可以在这个数据库找到:【Web of Science】
在这里插入图片描述

以下是使用Scala语言实现逻辑回归的Newton-Raphson算法的示例代码: ``` import breeze.linalg.{DenseMatrix, DenseVector} import breeze.numerics.{exp, log} import scala.annotation.tailrec object LogisticRegression { /** * Compute the sigmoid function * * @param z input value * @return sigmoid value */ def sigmoid(z: Double): Double = { 1.0 / (1.0 + exp(-z)) } /** * Compute the gradient of the log-likelihood function * * @param X design matrix * @param y target variable * @param weights current weights * @return gradient vector */ def gradient(X: DenseMatrix[Double], y: DenseVector[Double], weights: DenseVector[Double]): DenseVector[Double] = { val activation = sigmoid(X * weights) X.t * (activation - y) } /** * Compute the Hessian matrix of the log-likelihood function * * @param X design matrix * @param weights current weights * @return Hessian matrix */ def hessian(X: DenseMatrix[Double], weights: DenseVector[Double]): DenseMatrix[Double] = { val activation = sigmoid(X * weights) val diagonal = activation *:* (1.0 - activation) X.t * (X(::, *) * diagonal) } /** * Compute the log-likelihood function * * @param X design matrix * @param y target variable * @param weights current weights * @return log-likelihood value */ def logLikelihood(X: DenseMatrix[Double], y: DenseVector[Double], weights: DenseVector[Double]): Double = { val activation = sigmoid(X * weights) val epsilon = 1e-16 val clippedActivation = activation.map(a => math.max(a, epsilon)).map(a => math.min(a, 1.0 - epsilon)) val logActivation = log(clippedActivation) val logOneMinusActivation = log(1.0 - clippedActivation) val logLikelihood = y.t * logActivation + (1.0 - y).t * logOneMinusActivation -logLikelihood } /** * Train a logistic regression model using Newton-Raphson algorithm * * @param X design matrix * @param y target variable * @param maxIterations maximum number of iterations * @param tolerance convergence tolerance * @return weights vector */ def train(X: DenseMatrix[Double], y: DenseVector[Double], maxIterations: Int = 100, tolerance: Double = 1e-6): DenseVector[Double] = { val numFeatures = X.cols val weights = DenseVector.zeros[Double](numFeatures) @tailrec def loop(iteration: Int): DenseVector[Double] = { val grad = gradient(X, y, weights) val hess = hessian(X, weights) val delta = hess \ grad weights -= delta val llh = logLikelihood(X, y, weights) val improvement = llh - logLikelihood(X, y, weights + delta) if (iteration >= maxIterations || improvement < tolerance) { weights } else { loop(iteration + 1) } } loop(0) } } ``` 该示例代码定义了sigmoid函数、梯度函数、Hessian矩阵函数、对数似然函数和训练函数。在训练函数,使用了尾递归进行迭代,直到满足最大迭代次数或收敛容差的条件为止。最终,训练函数返回权重向量作为模型的输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值