在尝试实现随机梯度下降时获得不正确的theta值

时间:2018-03-31 07:23:11

标签: r logistic-regression gradient-descent

我正在尝试为逻辑回归实现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是一个由01组成的数据框。

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)来获取在浏览器中导航的命令,但一般情况下,使用ns来逐步完成语句(s将进入嵌套函数调用,n将跳过)。如果您在RStudio中执行此操作,则可以密切关注环境选项卡以查看(例如theta)的值,并查看当前的回溯。您还可以在执行环境中评估任何R表达式,例如tail(theta)Q退出浏览器。

我建议探索hypothesis特别返回的内容(如果它几乎不是1,我会感到惊讶)。但我认为您还有其他问题导致您所描述的不良行为(theta的返回值不会从其初始分配更改)。

编辑:

修复拼写错误:label每次都应为labels

将初始化后的回报总和与theta的总和进行比较,您会发现返回值与初始化的theta不同。希望有所帮助!