- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用批次梯度下降来实现逻辑回归输入样本分为两类类是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我应该做什么来确定每次迭代的成本值?
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);
k
和
s_k
中你可以通过阅读我上面链接到你的帖子来了解这段代码是如何工作的我不会在这里重复这些内容,因为这不是本文的范围为了确保正确的规范化,我将第一列的平均值和标准偏差分别设置为0和1
k
包含新的规范化数据矩阵在梯度下降算法中使用
mX
。现在,找到参数后,要执行任何预测,必须使用与训练集的平均值和标准偏差来规范化任何新的测试实例因为学习到的参数与训练集的统计有关,所以还必须对要提交到预测模型的任何测试数据应用相同的转换。
sX
的矩阵中存储了新的数据点,您将进行规格化,然后执行预测:
xxnew = bsxfun(@rdivide, bsxfun(@minus, xx, mX), sX);
pred = sigmoid(xxnew*theta) >= 0.5;
xnew
太大,每次迭代都会朝着最小值的方向超调,从而使每次迭代的代价振荡甚至发散,这就是正在发生的事情在您的例子中,每次迭代的成本都在发散或增加,以至于无法使用浮点精度来表示。
xnew
,直到看到每次迭代的成本函数都在降低一种流行的确定最佳学习率的方法是在一个对数间隔值
xx
的范围内执行梯度下降,并查看最终成本函数值是多少,并选择导致最小成本的学习率。
关于matlab - Logistic回归中的成本函数得出NaN作为结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35419882/
在 Azure 机器学习工作室的测试项目中,根据我的理解,我有一些问题。在我的项目(在 R 中)中,我使用了二元 Logistic 回归,但在 AML 中我发现了两个 Logistic 回归:二类和多
我想估计医疗数据逻辑回归中使用的 sigmoidal/logistic 的最佳参数(在最后提到:斜率和截距)。这是我用 python 所做的: import numpy as np from skle
我在 R 中运行逻辑回归模型。我使用了 Zelig 和 Car 包。但是,我想知道是否有一种简单的方法可以获得模型的模型拟合统计数据。 (伪 R 方、卡方、对数似然等) 最佳答案 假设 glm1 is
在逻辑回归中,SAS 可以选择使用“降序”选项对 1 而不是 0 进行建模。 R 中有什么方法可以让我们做同样的事情吗? 我正在使用的代码如下: glm(y~x1+x2+x3, family=bino
作为后续 this question ,我拟合了具有定量和定性解释变量之间相互作用的多元 Logistic 回归。 MWE如下: Type |z|) (Intercept) -0.65518
我已经开始使用 Vowpal Wabbit 对于逻辑回归,但是我无法重现它给出的结果。也许它确实有一些未记录的“魔法”,但是有没有人能够复制/验证/检查逻辑回归的计算? 例如,使用下面的简单数据,我们
有没有办法像 statsmodels 一样为 scikit 逻辑回归模型提供类似的、不错的输出?有了所有的 p 值,标准。一张表中的错误等? 最佳答案 正如您和其他人所指出的,这是 scikit le
我正在使用 vowpal wabbit 进行逻辑回归。我了解到,vowpal wabbit 从给定的训练数据中选择一个保留集进行验证。这组是随机选择的吗?我有一个非常不平衡的数据集,包含 100 多个
我使用逻辑回归编写了一个多类分类器,该分类器使用一对多方法进行训练。我想绘制经过训练的分类器的学习曲线。 学习曲线应该按类别绘制,还是应该作为整个分类器的单个图?这有什么不同吗? 需要澄清的是,学习曲
在scipy.special.expit中,逻辑函数实现如下: if x < 0 a = exp(x) a / (1 + a) else 1 / (1 + exp(-x)) 但
逻辑斯蒂映射在混沌数学中是一个很经典的例子,它可以说明混沌可以从很简单的非线性方程中产生。 逻辑斯蒂映射公式如下: x_n表示当前人口与最大人口数量的比值,mu为参数,相当于人口增长速率。
我是数据科学或机器学习的新手。我尝试从 here 实现代码,但预测只返回 1 个类。 这是我的代码: classification_data = data.drop([10], axis=1).val
请帮助解释 Weka 库中由 weka.classifiers.functions.Logistic 生成的逻辑回归结果。 我使用来自 Weka 示例的数字数据: @relation weather
RSNNS 上的 CRAN 文档仅提及 Act_Logistic 作为隐藏层激活函数的示例。 RSNNS 中是否有所有可用激活函数的列表? 我专门寻找双曲正切函数的语法。 最佳答案 是的,大多数(全部
我正在使用 scikit-learn 的 linear_model.LogisticRegression 来执行多项逻辑回归。我想初始化求解器的种子值,即我想给求解器它的初始猜测作为系数的值。 有谁知
glmnet 中有没有办法进行一阶交互? 例如,如果我的 X 矩阵是: V1 V2 V3 0 1 0 1 0 1 1 0 0 ... 有没有办法指定它在不手动创建列的情况下按照 `y
我目前有一个程序,它采用特征向量和分类,并将其应用于已知的权重 vector ,以使用逻辑回归生成损失梯度。这是代码: double[] grad = new double[featureSize];
我正在关注 Siraj Raval 关于使用梯度下降的逻辑回归的视频: 1) 较长视频的链接: https://www.youtube.com/watch?v=XdM6ER7zTLk&t=2686s
我目前正在学习机器学习,但没有统计学背景。无论我在哪里看到物流功能,它总是: wx + b 但是this example in Theano documentation使用: wx - b 请问是哪一
我正在编写一些基本的神经网络方法 - 特别是激活函数 - 并且已经达到了我垃圾数学知识的极限。我理解各自的范围(-1/1)(0/1)等,但不同的描述和实现让我感到困惑。 具体来说,sigmoid、lo
我是一名优秀的程序员,十分优秀!