非数字参数二元运算符错误

时间:2018-04-06 10:34:39

标签: r gradient-descent

不确定为什么我得到一个非数字参数二元运算符错误。我有一些类型不匹配吗?

   for (j in 1:length(theta)) {
      val = exp(y * sum(theta * random_data_vector) * y * random_data_vector[i])
      val = val / (1 + exp(y * sum(theta * random_data_vector)))
      theta[j] = theta[j] - (alpha * val)
    }

错误:

Error in theta * random_data_vector : 
  non-numeric argument to binary operator

值:

> head(theta)
[1]  0.02435863 -0.74310189 -0.63525839  0.56554085 -0.20599967  0.43164130
> head(random_data_vector)
[1] 0 0 0 0 0 0
> y
    V9437
785     1

在for循环的第一次迭代之后,theta看起来像这样:

> head(theta)
[[1]]
[1] NA

[[2]]
[1] -0.2368957

[[3]]
[1] 0.697332

[[4]]
[1] 0.6104201

[[5]]
[1] 0.8182983

[[6]]
[1] 0.7093492

有关更多信息,以上是我试图围绕随机梯度下降创建的整个函数的片段。

data是从CSV抓取的一组行 labels从CSV抓取1行 alpha是一个浮动

mnist = read.csv('mnist_train.csv', header=FALSE)
data = mnist[,mnist[nrow(mnist),]==0 | mnist[nrow(mnist),]==1, drop=FALSE]
labels = data[785,]
data = data[1:784,]

train = function(data, labels, alpha) {
  theta = runif(nrow(data),-1,1)
  decay_rate = .01
  random_column_indexes = sample(ncol(data))
  idx = 1
  limit = length(random_column_indexes)
  threshold = 1e-5
  delta = 1000000

  for (n in 1:ncol(data)) {
    if (delta <= threshold) {
      break
    }
    i = random_column_indexes[n]
    random_data_vector = data[, i]
    y = labels[i]
    previous_theta = theta
    for (j in 1:length(theta)) {
      val = exp(y * sum(theta * random_data_vector) * y * random_data_vector[i])
      val = val / (1 + exp(y * sum(theta * random_data_vector)))
      theta[j] = theta[j] - (alpha * val)
    }
    alpha = alpha - decay_rate
    delta = abs(previous_theta - theta)
  }
  return(theta)
}

1 个答案:

答案 0 :(得分:3)

我认为问题与对象的子集有关。从评论中提供的link我看到您的数据是data.frame对象,并使用[。如果您检查任何data.frame的类型,例如typeof(iris)您可以看到它是一个&#34;列表&#34;。

当您使用y = labels[i]时,您的对象将成为一个列表,因为:

  

当[应用于列表时,它总是返回一个列表:它永远不会给你列表的内容。要获取内容,您需要[[Advanced R by Hadley Wickham

将您的data.frame中的y声明为y <- labels[[i]]或子集labels作为执行as.numeric(data[785,])

的向量