非数字参数二元运算符错误
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,])
的向量
不确定为什么会出现非数字参数二元运算符错误。我是否发生了某种类型不匹配?
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,])