我正在尝试为逻辑回归实现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列在y
的第45列中有相应的labels
值。
在上面的回归中,我正在尝试训练标签1
和标签0
之间。因此,labels
是一个由0
和1
组成的数据框。
答案 0 :(得分:1)
如果没有minimal, complete, and verifiable example,我无法为您调试,但我可以为您提供一个工具来帮助您调试它:
在函数体中添加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
不同。希望有所帮助!