gpt4 book ai didi

matlab - Logistic回归中的成本函数得出NaN作为结果

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:51 25 4
gpt4 key购买 nike

我正在使用批次梯度下降来实现逻辑回归输入样本分为两类类是1和0在训练数据时,我使用以下乙状结肠功能:

t = 1 ./ (1 + exp(-z));

哪里
z = x*theta

我正在使用下面的成本函数来计算成本,以确定何时停止培训。
function cost = computeCost(x, y, theta)
htheta = sigmoid(x*theta);
cost = sum(-y .* log(htheta) - (1-y) .* log(1-htheta));
end

在大多数情况下, htheta的值要么是1,要么是0,因此我得到每个步骤的成本都是NaN我应该做什么来确定每次迭代的成本值?
这是logistic回归的梯度下降码:
function [theta,cost_history] = batchGD(x,y,theta,alpha)

cost_history = zeros(1000,1);

for iter=1:1000
htheta = sigmoid(x*theta);
new_theta = zeros(size(theta,1),1);
for feature=1:size(theta,1)
new_theta(feature) = theta(feature) - alpha * sum((htheta - y) .*x(:,feature))
end
theta = new_theta;
cost_history(iter) = computeCost(x,y,theta);
end
end

最佳答案

这件事发生在你身上有两个可能的原因。
数据未规范化
这是因为当你把SigMID/Logit函数应用到你的假设中时,输出概率几乎都是大约0或全部1s,而你的成本函数,log(1 - 1)log(0)会产生-Inf。所有这些单独的术语在成本函数中的累积最终将导致NaN
具体来说,如果y = 0是一个训练示例,并且假设的输出是log(x),其中x是一个非常小的接近于0的数字,那么检查成本函数的第一部分就会得到0*log(x),实际上会产生NaN类似地,如果对于一个训练示例,如果假设的输出也是一个很小的数字,那么这将再次给我们带来y = 1并产生log(x)简单地说,假设的输出要么非常接近0,要么非常接近1。
这很有可能是因为每个特征的动态范围大不相同,所以假设的一部分,特别是每个训练示例的加权和x会给你很大的负值或正值,如果你对这些值应用乙状结肠功能,你会非常接近0或1。
解决这个问题的一种方法是在使用梯度下降进行训练之前,将矩阵中的数据标准化一种典型的方法是用零均值和单位方差进行规范化给定输入特征0*log(x)其中NaN具有x*theta特征,可以通过以下方式找到新的规范化特征x_k
k = 1, 2, ... n是特征n的平均值,x_k^{new}是特征m_k的标准差这也被称为标准化数据你可以在我在这里给出的另一个答案中阅读更多关于这个的细节:How does this code for standardizing data work?
因为你是用线性代数的方法来梯度下降的,我假设你已经用一列所有的列来准备你的数据矩阵知道了这一点,我们可以像这样规范化您的数据:

mX = mean(x,1); 
mX(1) = 0;
sX = std(x,[],1);
sX(1) = 1;
xnew = bsxfun(@rdivide, bsxfun(@minus, x, mX), sX);

每个特征的平均值和标准差分别存储在 ks_k中你可以通过阅读我上面链接到你的帖子来了解这段代码是如何工作的我不会在这里重复这些内容,因为这不是本文的范围为了确保正确的规范化,我将第一列的平均值和标准偏差分别设置为0和1 k包含新的规范化数据矩阵在梯度下降算法中使用 mX。现在,找到参数后,要执行任何预测,必须使用与训练集的平均值和标准偏差来规范化任何新的测试实例因为学习到的参数与训练集的统计有关,所以还必须对要提交到预测模型的任何测试数据应用相同的转换。
假设您在名为 sX的矩阵中存储了新的数据点,您将进行规格化,然后执行预测:
xxnew = bsxfun(@rdivide, bsxfun(@minus, xx, mX), sX);

现在,您可以执行您的预测:
pred = sigmoid(xxnew*theta) >= 0.5;

您可以将0.5的阈值更改为您认为最好的阈值,以确定示例属于正类还是负类。
学习率太高
正如您在评论中所提到的,一旦您将数据标准化,成本似乎是有限的,但是经过几次迭代之后,成本突然变成了NaN规范化只能让你走到目前为止如果你的学习率或 xnew太大,每次迭代都会朝着最小值的方向超调,从而使每次迭代的代价振荡甚至发散,这就是正在发生的事情在您的例子中,每次迭代的成本都在发散或增加,以至于无法使用浮点精度来表示。
因此,另一个选择是降低学习率 xnew,直到看到每次迭代的成本函数都在降低一种流行的确定最佳学习率的方法是在一个对数间隔值 xx的范围内执行梯度下降,并查看最终成本函数值是多少,并选择导致最小成本的学习率。
假设代价函数是凸的,将上述两个事实结合起来,梯度下降可以很好地收敛。在这种情况下,逻辑回归,它是最肯定的。

关于matlab - Logistic回归中的成本函数得出NaN作为结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35419882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com