Regularization Exercise

本文针对线性回归和logistic回归的正规化问题的练习,理论参考文档:http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearning&doc=exercises/ex5/ex5.html。正规化指的是对不定问题的求解,通过在原始的代价函数上加约束条件,这种约束在优化过程中起导向作用,使代价函数沿着梯度下降的方向移动。

线性回归的正规化

对输入特征参量x建模,通常x是个矢量,表示不同的特征。这里假设x是个标量,即只有一个特征,用5阶多项式拟合的预测函数:


对输入样本数m大于多项式的阶数n,过拟合就很可能发生。为了避免这种情况,我们引入正规化因子λ。则代价函数:

对于线性回归,前面文章中提到了两种方法可解决,一种是梯度下降,二是公式法。

% Regularized linear regression
% Gradient descent
clc,clear,close all;
x = load('ex5Linx.dat');
y = load('ex5Liny.dat');

x_test = [-1: 0.01 : 1]';
x1 = [ones(size(x(:, 1)), 1), x, x.^2, x.^3, x.^4, x.^5];    % m * 6
x_test1 = [ones(size(x_test(:, 1)), 1), x_test, x_test.^2, x_test.^3, x_test.^4, x_test.^5];% test
[m, n] = size(x1);

theta = zeros(n, 1);
iter = 2000;
alpha = 0.07;
lamda = [0, 1, 10];         % regularized param
J_value = zeros(iter, 1);   % cost value
E = eye(n, n);
E(1, 1) = 0;
norm_gradient = zeros(length(lamda), 1);
for lamdaTemp = 1 : length(lamda)
    theta = zeros(n, 1);
    for iterTemp = 1 : iter
        h_theta = x1 * theta;  % m * 1
        J_value(iterTemp) = 1 / 2 / m * (sum((h_theta - y).^2)...
            + lamda(lamdaTemp) .* (sum(theta.^2) - theta(1).^2));
        theta = theta - alpha ./ m .* (x1' * (h_theta - y) + lamda(lamdaTemp) * E * theta); %iteration function
    end
    figure; scatter(x, y, 'o','LineWidth', 2, 'MarkerEdgeColor','k','MarkerFaceColor','r');
    hold on;
    plot(x_test, x_test1 * theta, '--b','LineWidth',2);
    legend(['Training data'],['5th order fit, λ=' num2str(lamda(lamdaTemp))]);
    figure; plot(1: iter, J_value);
    xlabel('iteration');
    ylabel('J_value');
    theta
    norm_gradient(lamdaTemp) = norm(theta);
end
norm_gradient

% Normal equations
norm_normal = zeros(length(lamda), 1);
for lamdaTemp = 1 : length(lamda)
    theta = pinv(x1' * x1 + lamda(lamdaTemp) .* E) * x1' * y
    norm_normal(lamdaTemp) = norm(theta);
    figure; scatter(x, y, 'o','LineWidth', 2, 'MarkerEdgeColor','k','MarkerFaceColor','r');
    hold on; plot(x_test, x_test1 * theta, '--b','LineWidth',2);
    legend(['Training data'],['5th order fit, λ=' num2str(lamda(lamdaTemp))]);
end
norm_normal


梯度下降法:

各自正规化因子对应的预测曲线如下:



对应的范数:


公式法:

各自正规化因子对应的预测曲线如下:


对应的范数:


可以看出,随着λ 的增大,θ参量的范数下降。这是由于大的λ 补偿了原代价函数中大的参数。当λ 过大时,容易出现欠拟合,且预测曲线的走向与实际的相反。


logistic回归的正规化

对于分类的logistic 回归,其正规化的代价函数:

其中

采用牛顿法求解最小代价函数。
迭代函数:

其中:


% Regularized Logistic regression
clear, clc, close all;
x = load('ex5Logx.dat');
y = load('ex5Logy.dat');

% Find the indices for the 2 classes
pos = find(y == 1); neg = find(y == 0);

g = inline('1.0 ./ (1.0 + exp(-z))');   % Usage: To find the value of the sigmoid 

degree = 6;
lamda = [0, 1, 10];
x1 = map_feature(x(:,1), x(:,2), degree);   % m * n
[m, n] = size(x1);
E = ones(n, 1);
E(1) = 0;
norm_lamda = zeros(length(lamda),1);

for lamdaTemp = 1 : length(lamda)
    theta = zeros(n, 1);
    J_theta = 0;
    thetaTemp = zeros(n, 1);
    J_thetaTemp = 0;
    while (1)
        h_theta = g(x1 * thetaTemp);       % m * 1
        J_thetaTemp = -1 ./ m * (sum(y .* log(h_theta) + (1 - y) .* log(1 - h_theta))...
            - lamda(lamdaTemp) ./ 2 * sum(thetaTemp.^2) - thetaTemp(1).^2)
        if (abs(J_theta - J_thetaTemp) < 0.0001)
            theta = thetaTemp
            break;
        end
        J_theta = J_thetaTemp;
        
        H = 1 ./ m * (x1' * diag(h_theta .*(1 - h_theta)) * x1 + lamda(lamdaTemp) .* diag(E));     % n * n
        delta_J = 1 ./ m * (x1' *  (h_theta - y) + lamda(lamdaTemp) .* diag(E) * thetaTemp);    % n * 1
        
        thetaTemp = thetaTemp - pinv(H) * delta_J;
    end
    norm_lamda(lamdaTemp) = norm(theta);
    
    figure;
    plot(x(pos, 1), x(pos, 2), '+', 'MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',6);
    hold on;
    plot(x(neg, 1), x(neg, 2), 'o', 'MarkerEdgeColor','k','MarkerFaceColor','r','MarkerSize',6);
    
   %%
    % Define the ranges of the grid
    u = linspace(-1, 1.5, 200);
    v = linspace(-1, 1.5, 200);

    % Initialize space for the values to be plotted
    z = zeros(length(u), length(v));

    % Evaluate z = theta*x over the grid
    for i = 1:length(u)
        for j = 1:length(v)
            % Notice the order of j, i here!
            z(j,i) = map_feature(u(i), v(j))*theta;
        end
    end

    % Because of the way that contour plotting works
    % in Matlab, we need to transpose z, or
    % else the axis orientation will be flipped!
    %z = z';
    % Plot z = 0 by specifying the range [0, 0]
    hold on;
    contour(u,v,z, [0, 0], 'g', 'LineWidth', 2);
    xlabel('u');
    ylabel('v');
    legend('y = 1', 'y = 0', 'Decision boundary');
    title(['λ = ' num2str(lamda(lamdaTemp))]);
end

vpa(norm_lamda, 8);
norm_lamda

各自正规化因子对应的预测曲线如下:



对应的范数:

当λ 增大时,θ 参量的范数减小。但是大到一定程度后也存在边界欠拟合的状况。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值