我正在对从Coursera机器学习课程(MATLAB)学习到的线性回归进行编码。我找到了here类似的帖子,但是我似乎无法理解所有内容。也许是因为我的机器学习基础有点薄弱。

我面临的问题是,对于某些数据...梯度下降(GD)和闭合形式解(CFS)都给出了相同的假设线。但是,在一个特定的数据集上,结果是不同的。我已经读过一些东西,如果数据是单一的,那么结果应该是相同的。但是,我不知道如何检查我的数据是否单一。

我将尽力说明最好的方法:

1)首先,这是从here改编而成的MATLAB代码。对于给定的数据集,在GD和CFS给出相似结果的情况下,一切都变好了。

数据集

X                   Y
2.06587460000000    0.779189260000000
2.36840870000000    0.915967570000000
2.53999290000000    0.905383540000000
2.54208040000000    0.905661380000000
2.54907900000000    0.938988900000000
2.78668820000000    0.966847400000000
2.91168250000000    0.964368240000000
3.03562700000000    0.914459390000000
3.11466960000000    0.939339440000000
3.15823890000000    0.960749710000000
3.32759440000000    0.898370940000000
3.37931650000000    0.912097390000000
3.41220060000000    0.942384990000000
3.42158230000000    0.966245780000000
3.53157320000000    1.05265000000000
3.63930020000000    1.01437910000000
3.67325370000000    0.959694260000000
3.92564620000000    0.968537160000000
4.04986460000000    1.07660650000000
4.24833480000000    1.14549780000000
4.34400520000000    1.03406250000000
4.38265310000000    1.00700090000000
4.42306020000000    0.966836480000000
4.61024430000000    1.08959190000000
4.68811830000000    1.06344620000000
4.97773330000000    1.12372390000000
5.03599670000000    1.03233740000000
5.06845360000000    1.08744520000000
5.41614910000000    1.07029880000000
5.43956230000000    1.16064930000000
5.45632070000000    1.07780370000000
5.56984580000000    1.10697580000000
5.60157290000000    1.09718750000000
5.68776170000000    1.16486030000000
5.72156020000000    1.14117960000000
5.85389140000000    1.08441560000000
6.19780260000000    1.12524930000000
6.35109410000000    1.11683410000000
6.47970330000000    1.19707890000000
6.73837910000000    1.20694620000000
6.86376860000000    1.12510460000000
7.02233870000000    1.12356720000000
7.07823730000000    1.21328290000000
7.15142320000000    1.25226520000000
7.46640230000000    1.24970650000000
7.59738740000000    1.17997060000000
7.74407170000000    1.18972990000000
7.77296620000000    1.30299340000000
7.82645140000000    1.26011340000000
7.93063560000000    1.25622670000000


我的MATLAB代码:

clear all; close all; clc;
x = load('ex2x.dat');
y = load('ex2y.dat');

m = length(y); % number of training examples

% Plot the training data
figure; % open a new figure window
plot(x, y, '*r');
ylabel('Height in meters')
xlabel('Age in years')

% Gradient descent
x = [ones(m, 1) x]; % Add a column of ones to x
theta = zeros(size(x(1,:)))'; % initialize fitting parameters
MAX_ITR = 1500;
alpha = 0.07;

for num_iterations = 1:MAX_ITR

    thetax = x * theta;
    % for theta_0 and x_0
    grad0 = (1/m) .* sum( x(:,1)' * (thetax - y));
    % for theta_0 and x_0
    grad1 = (1/m) .* sum( x(:,2)' * (thetax - y));

    % Here is the actual update
    theta(1) = theta(1) - alpha .* grad0;
    theta(2) = theta(2) - alpha .* grad1;
end
% print theta to screen
theta

% Plot the hypothesis (a.k.a. linear fit)
hold on
plot(x(:,2), x*theta, 'ob')
% Plot using the Closed Form Solution
plot(x(:,2), x*((x' * x)\x' * y), '--r')
legend('Training data', 'Linear regression', 'Closed Form')
hold off % don't overlay any more plots on this figure''


[编辑:对不起,标签错误...这不是正态方程,而是封闭式解决方案。我的错]
此代码的结果如下所示(其中桃红色:D GD和CFS的结果相同)-
matlab - 梯度下降和闭合形式解-MATLAB中的不同假设线-LMLPHP


现在,我正在用另一个数据集测试我的代码。数据集的URL为here-灰色KANGAROOS。我将其转换为CSV并将其读取到MATLAB中。请注意,我确实进行了缩放(除以最大值,因为如果不这样做,则根本不会出现假设线,并且theta在MATLAB中显示为非数字(NaN))。


灰色袋鼠数据集:

X    Y
609 241
629 222
620 233
564 207
645 247
493 189
606 226
660 240
630 215
672 231
778 263
616 220
727 271
810 284
778 279
823 272
755 268
710 278
701 238
803 255
855 308
838 281
830 288
864 306
635 236
565 204
562 216
580 225
596 220
597 219
636 201
559 213
615 228
740 234
677 237
675 217
629 211
692 238
710 221
730 281
763 292
686 251
717 231
737 275
816 275


我对要在此数据集中读取的代码所做的更改

    dataset = load('kangaroo.csv');
    % scale?
    x = dataset(:,1)/max(dataset(:,1));
    y = dataset(:,2)/max(dataset(:,2));


出来的结果是这样的:[编辑:对不起,标签错误...这不是正态方程,而是闭式解。我的错]

matlab - 梯度下降和闭合形式解-MATLAB中的不同假设线-LMLPHP

我想知道这种差异是否有任何解释?任何帮助将不胜感激。先感谢您!

最佳答案

我没有运行您的代码,但让我向您介绍一些理论:

如果您的代码正确(看起来像它):增加MAX_ITER它将看起来更好。

梯度下降不能确保在MAX_ITER处收敛,实际上梯度下降是一种相当慢的方法(在收敛方面)。

对于“标准”凸函数(如您尝试解决的凸函数),Gradient下降的收敛如下所示(来自Internet):

matlab - 梯度下降和闭合形式解-MATLAB中的不同假设线-LMLPHP

忘记迭代次数,因为它减少了问题的产生,并专注于形状。可能发生的情况是,您的maxiter落在此图像中的“ 20”附近。因此,您的结果不错,但不是最好的!

但是,直接求解法线方程将为您提供最小平方误差的解决方案。 (我假设您是指x=(A'*A)^(-1)*A'*b的正态方程)。问题在于,在某些情况下,您可能无法将A存储在内存中,或者在不适定的问题中,正则方程将导致不适定的矩阵在数值上不稳定,因此使用了梯度下降。

more info

关于matlab - 梯度下降和闭合形式解-MATLAB中的不同假设线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40546064/

10-11 22:15
查看更多