不确定为什么我得到一个非数字参数二元运算符错误。我有一些类型不匹配吗?
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)
}
答案 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,])