matlab 矩阵 梯度下降,matlab – 机器学习 – 使用批量梯度下降的线性回归

错误很简单.您的delta声明应该在第一个for循环中.每次累积训练样本和输出之间的加权差异时,都应该从头开始累积.

如果不这样做,你所做的就是累积上一次迭代的错误,这会将先前学习的theta版本的错误考虑在内,这是不正确的.你必须把它放在第一个for循环的开头.

此外,您似乎有一个无关的computeCost调用.我假设这在给定当前参数的每次迭代中计算成本函数,因此我将创建一个名为cost的新输出数组,在每次迭代时向您显示.我也将调用此函数并将其分配给此数组中的相应元素:

function [theta, costs] = gradientDescent(X, y, theta, alpha, iterations)

m = length(y);

costs = zeros(m,1); %// New

% delta=zeros(2,1); %// Remove

for iter =1:1:iterations

delta=zeros(2,1); %// Place here

for i=1:1:m

delta(1,1)= delta(1,1)+( X(i,:)*theta - y(i,1)) ;

delta(2,1)=delta(2,1)+ (( X(i,:)*theta - y(i,1))*X(i,2)) ;

end

theta= theta-( delta*(alpha/m) );

costs(iter) = computeCost(X,y,theta); %// New

end

end

关于适当矢量化的说明

FWIW,我不认为这个实现是完全矢量化的.您可以使用向量化操作消除第二个for循环.在我们这样做之前,让我介绍一些理论,以便我们在同一页面上.您在线性回归方面使用梯度下降.我们希望寻找最佳参数θ,它们是我们的线性回归系数,旨在最小化此成本函数:

tPhVh.png

m对应于我们可用的训练样本的数量,并且x ^ {i}对应于第i个训练示例. y ^ {i}对应于我们与第i个训练样本相关联的基础事实值. h是我们的假设,它给出如下:

f02I7.png

请注意,在2D中的线性回归的上下文中,我们在要计算的θ中只有两个值 – 截距项和斜率.

我们可以最小化成本函数J以确定最佳回归系数,这些回归系数可以为我们提供最小化训练集误差的最佳预测.具体来说,从一些初始theta参数开始…通常是一个零向量,我们迭代迭代从1到我们认为合适的数量,并且在每次迭代时,我们通过这种关系更新我们的theta参数:

7cRbL.png

对于我们想要更新的每个参数,您需要确定与每个变量相关的成本函数的梯度,并评估当前状态为θ的那个.如果你使用微积分来解决这个问题,我们得到:

x5LFr.png

如果您不清楚这种推导是如何发生的,那么我建议您参考这个讨论它的好的数学堆栈交换帖子:

现在……我们如何将其应用于当前的问题?具体来说,您可以一次性计算三角洲的条目,非常容易地分析所有样本.我的意思是你可以这样做:

function [theta, costs] = gradientDescent(X, y, theta, alpha, iterations)

m = length(y);

costs = zeros(m,1);

for iter = 1 : iterations

delta1 = theta(1) - (alpha/m)*(sum((theta(1)*X(:,1) + theta(2)*X(:,2) - y).*X(:,1)));

delta2 = theta(2) - (alpha/m)*(sum((theta(1)*X(:,1) + theta(2)*X(:,2) - y).*X(:,2)));

theta = [delta1; delta2];

costs(iter) = computeCost(X,y,theta);

end

end

delta(1)和delta(2)上的操作可以完全在两个语句中进行矢量化.你正在做什么theta ^ {T} * X ^ {i}对于每个样本我来自1,2,…,m.您可以方便地将其放入单个sum语句中.

我们可以更进一步,用纯矩阵运算代替它.首先,你可以做的是使用矩阵乘法很快地为每个输入样本X ^ {i}计算theta ^ {T} * X ^ {i}.假设:

XX1Hd.png

这里,X是我们的数据矩阵,其由对应于m个训练样本的m行和对应于n个特征的n列组成.类似地,theta是我们从梯度下降得到的权重向量,其中n 1个特征占截距项.

如果我们计算X * theta,我们得到:

Sf4UZ.png

正如您在此处所看到的,我们已经计算了每个样本的假设,并将每个样本放入一个向量中.该向量的每个元素都是第i个训练样本的假设.现在,回想一下梯度下降中每个参数的梯度项:

zg5SC.png

我们希望一次性实现学习向量中的所有参数,因此将其放入向量中可以为我们提供:

Uddxg.png

最后:

DGQgc.png

因此,我们知道y已经是长度为m的向量,因此我们可以通过以下方式非常紧凑地计算每次迭代时的梯度下降:

theta = theta - (alpha/m)*X'*(X*theta - y);

….所以你的代码现在只是:

function [theta, costs] = gradientDescent(X, y, theta, alpha, iterations)

m = length(y);

costs = zeros(m, 1);

for iter = 1 : iterations

theta = theta - (alpha/m)*X'*(X*theta - y);

costs(iter) = computeCost(X,y,theta);

end

end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 随机梯度下降机器学习中常用的一种优化算法,它具有较快的收敛速度和低内存消耗等优点。下面给出一份Matlab代码实现: function [theta, J_history] = stochastic_gradient_descent(X, y, theta, alpha, num_iters) m = length(y); J_history = zeros(num_iters, 1); for iter = 1:num_iters for i = 1:m h = X(i,:) * theta; J_history(iter) = J_history(iter) + (h - y(i))^2; for j = 1:size(X,2) theta(j) = theta(j) - alpha * (h - y(i)) * X(i,j); end end J_history(iter) = J_history(iter) / (2*m); end end 该函数有以下五个输入参数: 1)X:样本数据(输入变量) 2)y:样本数据(输出变量) 3)theta:参数向量 4)alpha:学习速率(步长) 5)num_iters:迭代次数 在函数主体中,通过for循环依次遍历每一个样本,计算每个样本的损失,并更新参数向量theta。最后,将每一次迭代的损失存储在J_history中。 使用该函数进行随机梯度下降时,只需要将样本输入矩阵X和输出向量y传递给函数即可。在函数返回时,输出参数theta即为优化得到的最佳参数向量,输出J_history即为每一次迭代的损失值。 需要注意的是,由于随机梯度下降是一种随机算法,每次迭代的结果可能都会有所不同。因此,在实际应用中,通常需要多次运行该函数,并将最终结果取平均值以提高模型的稳定性。 ### 回答2: 随机梯度下降(Stochastic Gradient Descent, SGD)是一种常用的优化算法,特别适合用于大规模数据集和高维模型的训练。以下是一份基于MATLAB实现的SGD代码: function [theta, J_history] = sgd(X, y, alpha, num_iters) % X: m x n的样本矩阵, m为样本数,n为特征数 % y: m x 1的标签向量 % alpha: 学习率 % num_iters: 迭代次数 % 初始化theta theta = zeros(size(X, 2), 1); % 记录每次迭代的代价函数值 J_history = zeros(num_iters, 1); for iter = 1:num_iters % 随机选择一个样本 i = randi(size(X, 1)); % 求解梯度,注意这里只用了一个样本 gradient = X(i, :)' * (X(i, :) * theta - y(i)); % 更新theta theta = theta - alpha * gradient; % 计算代价函数值 J_history(iter) = compute_cost(X, y, theta); end end function J = compute_cost(X, y, theta) % 计算代价函数,这里使用的是均方误差 m = length(y); J = 0; J = sum((X * theta - y).^2) / (2 * m); end 这段代码实现了随机梯度下降,其中函数sgd执行迭代次数num_iters次,每次从样本中随机选取一个样本进行梯度计算和更新theta。compute_cost函数用于计算代价函数,这里使用的是均方误差。使用这个代码可以对数据进行线性回归等任务的优化。 ### 回答3: 随机梯度下降是一种常见的优化算法,通常用于机器学习和深度学习中的参数优化。Matlab提供了一个非常便捷的实现方式。 首先,我们需要定义损失函数和梯度函数。对于一个线性回归模型,定义损失函数为: ```matlab function J = loss(X, y, w) % X:训练集 % y:目标输出 % w:参数向量 % w = [w0, w1, ..., wn] m = length(y); % 样本数量 h = X*w; % 预测输出 J = (1/(2*m)) * sum((h-y).^2); % 均方误差 end ``` 接下来,我们需要定义梯度函数。对于线性回归而言,梯度函数为: ```matlab function grad = gradient(X, y, w) % X:训练集 % y:目标输出 % w:参数向量 % w = [w0, w1, ..., wn] m = length(y); % 样本数量 h = X*w; % 预测输出 grad = (1/m)*X'*(h-y); % 梯度 end ``` 接着,我们可以开始使用随机梯度下降算法: ```matlab % 初始化参数 w = randn(size(X, 2), 1); alpha = 0.01; % 学习率 max_iter = 1000; % 最大迭代次数 for i = 1:max_iter % 随机选择一个样本 idx = randi(size(X,1)); x = X(idx,:); y_i = y(idx,:); % 计算梯度 grad = gradient(x, y_i, w); % 更新参数 w = w - alpha*grad; % 计算损失 J = loss(X, y, w); fprintf('迭代次数:%d,训练误差:%f\n', i, J); end ``` 在每次迭代中,随机选择一个样本来计算梯度并更新参数。这种随机性有助于避免算法陷入局部最优解,同时减少计算时间。整个算法的收敛速度并不是很快,但是在较大的数据集上表现良好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值