L-BFGS的原理及在回归分析中的应用



后续会讲到L-BFGS在模式分类中的应用。

L_BFGS.m
x = load('ex3x.dat');
y = load('ex3y.dat');
c=0.6; a=1; roi=0.5; m=10;
x = [ones(size(x,1),1) x];
meanx = mean(x);%求均值
sigmax = std(x);%求标准偏差
x(:,2) = (x(:,2)-meanx(2))./sigmax(2);
x(:,3) = (x(:,3)-meanx(3))./sigmax(3);
itera_num = 1000; %尝试的迭代次数
sample_num = size(x,1); %训练样本的次数
theta_old = zeros(size(x,2),1); %theta的初始值赋值为0
Jtheta_new = zeros(itera_num, 1);
Jtheta = zeros(itera_num, 1);
Jtheta1= zeros(itera_num, 1);
q=zeros(3,itera_num);
M=zeros(3,itera_num);
s=zeros(3,itera_num);
r=zeros(3,itera_num);
A=zeros(1,itera_num);
Jtheta(1) = (1/(2*sample_num)).*(x*theta_old-y)'*(x*theta_old-y);
grad_old= (1/sample_num).*x'*(x*theta_old-y);
q(:,1)=grad_old;
B=eye(3);
H=-inv(B);
d1=H*grad_old;
%grad_new = (1/sample_num).*x'*(x*(theta_old+a*d1)-y);
Jtheta_new=(1/(2*sample_num)).*(x*(theta_old+a*d1)-y)'*(x*(theta_old+a*d1)-y);
while 1
    if Jtheta_new<=Jtheta(1)+(c*a)*grad_old'*d1
        break;
    else
        a=roi*a;
    end
    %grad_new = (1/sample_num).*x'*(x*(theta_old+a*d1)-y);
    Jtheta_new=(1/(2*sample_num)).*(x*(theta_old+a*d1)-y)'*(x*(theta_old+a*d1)-y);
end
theta_new=theta_old+a*d1;
for i=2:itera_num %计算出某个学习速率alpha下迭代itera_num次数后的参数
    a=0.5;
    Jtheta(i) = (1/(2*sample_num)).*(x*theta_new-y)'*(x*theta_new-y);
    grad_old=(1/sample_num).*x'*(x*theta_old-y);
    grad_new = (1/sample_num).*x'*(x*theta_new-y);
    M(:,i-1)=grad_new-grad_old;
    s(:,i-1)=theta_new-theta_old;
    roiJ(i-1)=1/(M(:,i-1)'*s(:,i-1));
    gamma=(s(:,i-1)'*M(:,i-1))/(M(:,i-1)'*M(:,i-1));
    HK=gamma*eye(3);
    if sqrt(abs(grad_new'*grad_new))<0.0001;
        N=i;
        break;
    end
    r=lbfgsloop(i,m,HK,s,M,roiJ,grad_new);
    d=-r;
    Jtheta1(i) = (1/(2*sample_num)).*(x*(theta_new+a*d)-y)'*(x*(theta_new+a*d)-y);%Jtheta是个行向量
    while 1
        if Jtheta1(i,1)<=Jtheta(i,1)+(c*a)*grad_new'*d;
            break;
        else
            a=roi*a;
        end
        % grad_new = (1/sample_num).*x'*(x*(theta_old+a*d1)-y);
        Jtheta1(i)=(1/(2*sample_num)).*(x*(theta_new+a*d)-y)'*(x*(theta_new+a*d)-y);
    end
    theta_old=theta_new;
    theta_new = theta_new + a*d;
end
K(1)=Jtheta(500) ;
plot(0:N-1, Jtheta(1:N),'b--','LineWidth', 3);
hold on
%%
legend('L-BFGS','BFGS');
xlabel('Number of iterations')
ylabel('Cost function')

lbfgsloop.m

function result=lbfgsloop(iteras,length,H_k,STHETA,MGRAD,ROI,grad)   
%% 确定搜索方向H_k*f_k
if iteras<=length
        deta=0;
    else
        deta=iteras-length;
    end
    if iteras<=length
        L=iteras;
    else
        L=length;
    end
    q=grad;
    k=L-1;
 %% 向后循环得到A(k)和q
    while k>=1
        j=k+deta;
        A(k)=ROI(j)*STHETA(:,j)'*q;
        q=q-A(k)*MGRAD(:,j);
        k=k-1;
    end
    r=H_k*q; %定义初始的方向
 %% 前向循环得到r,此时的r为H_k*f_k
    for k=1:L-1
        j=k+deta;
        beta=ROI(j)*MGRAD(:,j)'*r;
        r=r+STHETA(:,j)*(A(k)-beta);
    end
    
result=r;


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
L-BFGS 优化算法广泛应用于机器学习和深度学习,例如在支持向量机(SVM)、逻辑回归、神经网络等模型的训练过程,都可以使用 L-BFGS 算法进行参数优化。下面以逻辑回归为例,简单介绍 L-BFGS 算法的应用。 逻辑回归是一种二分类模型,它的目标是找到一个最优的权重向量 $w$,使得模型的预测结果与真实结果的差距最小。这个问题可以转化为求解一个最小化损失函数的优化问题,其损失函数是对所有训练样本的预测误差的加权和。常用的损失函数是交叉熵损失函数。 在使用 L-BFGS 算法进行逻辑回归模型训练时,需要先计算损失函数的梯度和海森矩阵。然后,通过迭代更新权重向量 $w$,使得损失函数逐步收敛到最小值。 下面是一个简单的 Python 代码示例,演示了如何使用 L-BFGS 算法进行逻辑回归模型的训练: ```python import numpy as np from scipy.optimize import minimize # 定义损失函数和梯度 def logistic_loss(w, X, y): z = np.dot(X, w) y_pred = 1.0 / (1.0 + np.exp(-z)) return -np.mean(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred)) def logistic_grad(w, X, y): z = np.dot(X, w) y_pred = 1.0 / (1.0 + np.exp(-z)) return np.dot(X.T, y_pred - y) / len(y) # 生成随机数据集 np.random.seed(0) X = np.random.randn(100, 10) y = np.random.binomial(1, 0.5, 100) # 使用 L-BFGS 算法进行优化 w0 = np.zeros(10) res = minimize(logistic_loss, w0, args=(X, y), jac=logistic_grad, method='L-BFGS-B') print('Optimization result:') print(res) ``` 在这个例子,我们生成了一个随机的数据集,包含 100 个样本和 10 个特征。然后,我们定义了损失函数和梯度的计算方式,并使用 L-BFGS 算法进行优化。运行结果会输出优化结果,包括最优的权重向量和损失函数的最小值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值