Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何正确实现随机梯度下降?_Matlab_Machine Learning_Artificial Intelligence_Linear Regression - Fatal编程技术网

Matlab 如何正确实现随机梯度下降?

Matlab 如何正确实现随机梯度下降?,matlab,machine-learning,artificial-intelligence,linear-regression,Matlab,Machine Learning,Artificial Intelligence,Linear Regression,我试图在MATLAB中实现随机梯度下降,但是我没有看到任何收敛。小批量梯度下降工作如预期,所以我认为成本函数和梯度步骤是正确的 我面临的两个主要问题是: 随机洗牌前训练集中的数据 for循环 一次选择一个示例 以下是我的MATLAB代码: 生成数据 alpha = 0.001; num_iters = 10; xrange =(-10:0.1:10); % data lenght ydata = 5*(xrange)+30; % data with gradient 2, intercept

我试图在MATLAB中实现随机梯度下降,但是我没有看到任何收敛。小批量梯度下降工作如预期,所以我认为成本函数和梯度步骤是正确的

我面临的两个主要问题是:

  • 随机洗牌前训练集中的数据 for循环
  • 一次选择一个示例
  • 以下是我的MATLAB代码:

    生成数据

    alpha = 0.001;
    num_iters = 10;
    
    xrange =(-10:0.1:10); % data lenght
    ydata  = 5*(xrange)+30; % data with gradient 2, intercept 5
    
    % plot(xrange,ydata); grid on;
    noise  = (2*randn(1,length(xrange))); % generating noise 
    target = ydata + noise; % adding noise to data
    
    f1 = figure
    subplot(2,2,1);
    scatter(xrange,target); grid on; hold on; % plot a scttaer
    title('Linear Regression')
    xlabel('xrange')
    ylabel('ydata')
    
    tita0 = randn(1,1); %intercept (randomised)
    tita1 = randn(1,1); %gradient  (randomised)
    
    % Initialize Objective Function History
    J_history = zeros(num_iters, 1);
    
    % Number of training examples
    m = (length(xrange));
    
    洗牌数据、梯度下降和成本函数

    % STEP1 : we shuffle the data
    data = [ xrange, ydata];
    data = data(randperm(size(data,1)),:);
    y = data(:,1);
    X = data(:,2:end);
    
    for iter = 1:num_iters
    
        for i = 1:m
    
            x = X(:,i); % STEP2 Select one example
    
            h = tita0 + tita1.*x; % building the estimated     %Changed to xrange in BGD
    
            %c = (1/(2*length(xrange)))*sum((h-target).^2)
    
            temp0 = tita0 - alpha*((1/m)*sum((h-target)));
            temp1 = tita1 - alpha*((1/m)*sum((h-target).*x));  %Changed to xrange in BGD
            tita0 = temp0;
            tita1 = temp1;
    
            fprintf("here\n %d; %d", i, x)
    
        end
    
            J_history(iter) = (1/(2*m))*sum((h-target).^2); % Calculating cost from data to estimate
    
            fprintf('Iteration #%d - Cost = %d... \r\n',iter, J_history(iter));
    
    end
    

    在绘制成本与迭代和线性回归图时,MSE(局部最小值?)稳定在420左右,这是错误的

    另一方面,如果我重新运行完全相同的代码,但是使用批处理梯度下降,我会得到可接受的结果。在批量梯度下降中,我将
    x
    更改为
    xrange

    对我做错了什么有什么建议吗


    编辑:

    我还尝试使用以下方法选择随机索引:

    f = round(1+rand(1,1)*201);        %generating random indexes 
    
    然后选择一个示例:

    x = xrange(f); % STEP2 Select one example
    

    继续在假设和GD步骤中使用
    x
    也会产生420的成本。

    首先,我们需要正确地洗牌数据:

    data = [ xrange', target']; 
    data = data(randperm(size(data,1)),:);
    
    y = data(:,2);
    X = data(:,1);
    
    接下来,我们需要正确索引X和y:

    data = [ xrange', target']; 
    data = data(randperm(size(data,1)),:);
    
    y = data(:,2);
    X = data(:,1);
    
    然后在梯度下降过程中,我需要基于单个值进行更新,而不是基于
    目标
    ,如下所示:

    tita0 = tita0 - alpha*((1/m)*((h-y(i))));
    tita1 = tita1 - alpha*((1/m)*((h-y(i)).*x));
    
    θ随着上述变化收敛到[5,30]