我正在尝试实现逻辑回归的Stochastic Gradient Descent
算法。我写了一个小的train
功能,其作业是要获得theta
值/系数。但是theta
的值出现不正确,并且与初始化的值相同。我无法理解这样做的原因。这不是实现随机梯度下降的正确方法吗?
这是我为此写的代码:
train <- function(data, labels, alpha = 0.0009) {
theta <- seq(from = 0, to = 1, length.out = nrow(data))
label <- label[,shuffle]
data <- data[,shuffle]
for(i in seq(1:ncol(data))) {
h = hypothesis(x, theta)
theta <- theta - (alpha * ((h - y) * data[,i]))
}
return(theta)
}
请注意,数据框中的每个列都是一个输入。有20k列和456行。因此,训练的20K输入值。名为labels
的相应数据框对输入训练数据具有正确的值。因此,例如,data
中的第45列在labels
的第45列中具有相应的y
值。
在上面的回归中,我正在尝试训练以在标签1
和标签0
之间进行预测。因此,labels
是一个数据框架,由0
和1
。
如果没有最小,完整和可验证的例子,我就无法为您调试,但是我可以为您提供一个工具来帮助您调试它:
在您的功能正文中添加browser()
:
train <- function(data, labels, alpha = 0.001) {
browser()
# ... the rest of your function
用数据调用train
。这将打开浏览器会话。您可以输入help
(不是函数,只有help
(以获取要在浏览器中导航的命令,但是通常,请使用n
和s
逐步浏览语句(s
将逐步进入嵌套函数调用,n
将逐步逐步(。。如果您在rstudio中执行此操作,则可以密切注意您的环境选项卡,以查看值是什么,例如theta
,并查看当前的追溯。您还可以评估执行环境中的任何R表达式,例如tail(theta)
。Q
退出浏览器。
我建议探索hypothesis
特别返回的内容(如果几乎总是1,我会感到惊讶(。但是我认为您还有其他问题,导致您描述的不希望的行为(theta
的返回值并未从其初始分配中发生变化(。
编辑:
修复错字:label
应每次labels
。
将返回的总和与theta
的总和进行比较,并且您会发现返回值与初始化的theta
不同。希望有帮助!