- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在尝试在 R 中编写用于逻辑回归的梯度下降算法,以便更好地理解它。在 Andrew NG 的 ML 类(class)中,他们似乎跳过了这部分,而是展示了高级优化方法。但是,我想自己重新创建梯度下降法。这是我的尝试:
###my data
X <- c(34.62366, 30.28671, 35.84741, 60.18260, 79.03274)
X <- cbind(rep(1,5),X)
y <- c(0, 0, 0, 1, 1)
###sigmoid function to calculate predicted probabilities
sigmoid <- function(z) {
#SIGMOID Compute sigmoid function
z <- as.matrix(z)
g <- matrix(0,dim(z)[1],dim(z)[2])
g <- 1 / (1 + exp(-1 * z))
g
}
###Gradient Descent
theta <- c(0,0)
iterations <- 15000
alpha <- 0.02
m <- length(y)
for (i in 1:iterations) {
theta_prev = theta
p = dim(X)[2]
for (j in 1:p) {
h <- sigmoid(X %*% theta_prev)
#sigmoid derivative
deriv <- (t(h - y) %*% X[,j]) / m
theta[j] = theta_prev[j] - (alpha * deriv)
}
}
这给出了 -11.95 和 0.24 的最终系数,而在 R
中使用 GLM
函数我得到 -90.87 和 1.89。有谁知道我的代码哪里出错了?
这是 GLM
模型的代码:
X <- X[,2]
mod <- glm(y ~ X, family = 'binomial')
coef(mod)
提前致谢!
编辑:对于这个没有完美分离的较大数据集,系数之间的差异仍然存在。此外,对于包含 100 个观测值的更大数据集,差异仍然存在。
X <- c(34.62366, 30.28671, 35.84741, 60.18260, 79.03274, 45.08328, 61.10666,
75.02475, 76.09879, 84.43282, 95.86156, 75.01366, 82.30705, 69.36459, 39.53834)
X <- cbind(rep(1,5),X)
y <- c(0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0)
对于这个稍微大一点的数据集,我的尝试返回 -18,46 和 0.15 的系数,而 R 的 GLM
返回 -4.12 和 0.07。
最佳答案
您看到的问题是由您的数据引起的。您拥有可以被多个平面分隔的数据。查看此讨论 http://r.789695.n4.nabble.com/glm-fit-quot-fitted-probabilities-numerically-0-or-1-occurred-quot-td849242.html
请注意,当我尝试 glm() 时,我会收到警告
glm.fit: glm.fit: "fitted probabilities numerically 0 or 1 occurred"
这应该会提示您有些地方不正确。基本上你会发现有无限的平面可以分开你的点(你可以说轴的左边全是 0,轴的右边全是 1)。在我引用的讨论中,链接得到了很好的解释。您自行开发的 GD 根据您的起始值(尝试!)返回不同的值,因为有几个是可以的...从
theta <- c(20,20)
给你
> theta
[1] -18.6533438 0.3883605
在图中,您可以看到我从不同起始条件的方法中得到的三行,正如您所看到的,它们都很好地分隔了您的点...
希望对你有所帮助。最好的,翁贝托
编辑:查看您的数据后,我会说您的数据不是线性可分的(与您的初始数据所建议的相反)。 glm 给出的模型并没有真正起作用。检查 summary(mod)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -4.11494 2.32945 -1.766 0.0773 .
X[, 2] 0.06759 0.03527 1.916 0.0553 .
检查错误和 z 值...所以就我个人而言,我不会对您从 glm 获得的结果给予太多重视...并且您的代码给出的结果取决于(如预期的那样)初始值...顺便说一下,要使用您的代码和超参数获得稳定的结果,您需要更多的迭代......仍在检查一下。一旦发现更多,将尽快更新答案。
编辑 2:得到了一些东西。如果使用以下参数
theta <- c(-4,0.05)
iterations <- 1000000
alpha <- 0.001
从你的方法中得到
> theta
[1] -4.11500250 0.06758884
从 glm 你得到
> coef(mod)
(Intercept) X[, 2]
-4.11493568 0.06758787
所以相同的值(好吧,彼此非常非常接近)。现在请注意,如果您使用初始参数 c(0,0),您仍然会得到相同的结果……学习率也是一个问题(如果您选择的太大,您的参数不会收敛)。我检查了 theta 值的行为,发现参数在两个值之间振荡,这是学习率太大的明显迹象。此外,您需要更多迭代才能收敛...
在图中截距的行为与迭代次数的关系给你一个想法......
希望对您有所帮助,翁贝托
关于r - 逻辑回归梯度下降算法从 R 内置的 GLM 函数返回不同的系数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49551486/
[在此处输入图像描述][1]我正在努力弄清楚回归是否是我需要走的路线,以便解决我当前使用 Python 的挑战。这是我的场景: 我有一个 195 行 x 25 列的 Pandas Dataframe
我想训练回归模型(不是分类),其输出是连续数字。 假设我有输入变量 X,其范围在 -70 到 70 之间。我有输出变量 Y,其范围在 -5 到 5 之间。X 有 39 个特征,Y 有 16 个特征,每
我想使用神经网络逼近 sinc 函数。这是我的代码: import tensorflow as tf from keras.layers import Dense from keras.models
我对 postgres 表做了一些更改,我想将其恢复到以前的状态。没有数据库的备份。有办法吗?比如,postgres 会自动拍摄快照并将其存储在某个地方,还是原始数据会永远丢失? 最佳答案 默认情况下
我有大约 100 个 7x7 因变量矩阵(所以有 49 个因变量)。我的自变量是时间。我正在做一个物理项目,我应该通过求解 ODE 得到一个矩阵函数(矩阵的每个元素都是时间的函数)。我使用了 nump
我之前曾被告知——出于完全合理的原因——当结果变量为二元变量时(即是/否、真/假、赢/输等),不应运行 OLS 回归。但是,我经常阅读经济学/其他社会科学方面的论文,其中研究人员对二元变量运行 OLS
您好,我正在使用生命线包进行 Cox 回归。我想检查非二元分类变量的影响。有内置的方法吗?或者我应该将每个类别因子转换为一个数字?或者,在生命线中使用 kmf fitter,是否可以对每个因素执行此操
作为后续 this question ,我拟合了具有定量和定性解释变量之间相互作用的多元 Logistic 回归。 MWE如下: Type |z|) (Intercept) -0.65518
我想在单个动物园对象中的多对数据系列上使用 lm 执行滚动回归。 虽然我能够通过以下代码对动物园对象中的一对数据系列执行滚动回归: FunLm seat time(seat) seat fm
是否有一种简单的方法可以在 R 中拟合多元回归,其中因变量根据 Skellam distribution 分布? (两个泊松分布计数之间的差异)?比如: myskellam <- glm(A ~ B
包含各种特征和回归目标(称为 qval)的数据集用于训练 XGBoost 回归器。该值 qval 介于 0 和 1 之间,应具有以下分布: 到目前为止,还不错。但是,当我使用 xgb.save_mod
这有效: felm(y ~ x1 + x2 | fe1 + fe2 | 0 | , data = data) 我想要: fixedeffects = "fe1 + fe2" felm(y ~ x1
这有效: felm(y ~ x1 + x2 | fe1 + fe2 | 0 | , data = data) 我想要: fixedeffects = "fe1 + fe2" felm(y ~ x1
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我刚刚开始使用 R 进行统计分析,而且我还在学习。我在 R 中创建循环时遇到问题。我有以下案例,我想知道是否有人可以帮助我。对我来说,这似乎是不可能的,但对你们中的一些人来说,这只是小菜一碟。我有不同
是否可以在 sklearn 中使用或不使用(即仅使用截距)预测器来运行回归(例如逻辑回归)?这似乎是一个相当标准的类型分析,也许这些信息已经在输出中可用。 我发现的唯一相关的东西是sklearn.sv
假设我对一些倾斜的数据分布执行 DNN 回归任务。现在我使用平均绝对误差作为损失函数。 机器学习中的所有典型方法都是最小化平均损失,但对于倾斜来说这是不恰当的。从实际角度来看,最好尽量减少中值损失。我
我正在对公寓特征进行线性回归分析,然后预测公寓的价格。目前,我已经收集了我所在城市 13000 套公寓的特征。我有 23-25 个特征,我不确定在公寓价格预测中拥有如此多的特征是否正常。 我有以下功能
我是 ML 新手,对 catboost 有疑问。所以,我想预测函数值(例如 cos | sin 等)。我回顾了一切,但我的预测始终是直线 是否可能,如果可能,我该如何解决我的问题 我很高兴收到任何评论
我目前已经为二进制类实现了概率(至少我这么认为)。现在我想扩展这种回归方法,并尝试将其用于波士顿数据集。不幸的是,我的算法似乎被卡住了,我当前运行的代码如下所示: from sklearn impor
我是一名优秀的程序员,十分优秀!