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

non-numeric argument binary operator error

不确定为什么会出现非数字参数二元运算符错误。我是否发生了某种类型不匹配?

   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)
}

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

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

when [ is applied to a list it always returns a list: it never gives you the contents of the list. To get the contents, you need [[ Advanced R by Hadley Wickham

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

的向量