我正在尝试在R中实现我自己的逻辑回归算法,我似乎无法使矩阵乘法/点积运算符%*%
起作用。我尝试过很多不同的东西。下面是应该在R环境中运行的代码:
weight_a <- c(rep(1,5))
random_sample <- sample(1:NROW(iris),50)
# Delta terms for each type (starts out nonzero)
del_a <- 1;
# Dataset for part a (first 50 vs. last 100)
iris_a <- iris
iris_a$Species <- as.integer(iris_a$Species)
# Convert list to binary class
for (i in 1:NROW(iris_a$Species)) {if (iris_a$Species[i] != "1") {iris_a$Species[i] <- -1}}
while(del_a > 0.01) {
# Compute gradient
for (k in 1:NROW(random_sample)) {
grade_a <- -1/NROW(random_sample) * sum(iris_a$Species[random_sample[k]]*iris_a[random_sample[k],1:4]
/(1+exp(iris_a$Species[random_sample[k]]*weight_a%*%iris_a[random_sample[k],1:4])))
}
}
关键部分是weight_a%*%iris_a[random_sample[k],1:4]
,它不起作用(翻译成英文,错误是“需要矩阵或矢量”)。所以我尝试了其他一些事情:
# Trivial case works, gives 5
rep(1,5)%*%rep(1,5)
# Gives tensor product
rep(1,5)%*%as.matrix(iris_a[random_sample[k],1:4])
# Transpose doesn't work, gives row vector and result is an error ("Improper argument").
t(t(rep(1,5)))%*%as.matrix(iris_a[random_sample[k],1:4])
# Double transpose gives column vector, but result is tensor product again
t(t(rep(1,5)))%*%as.matrix(iris_a[random_sample[k],1:4])
# Matrix context gives tensor product again
as.matrix(rep(1,5))%*%as.matrix(iris_a[random_sample[k],1:4])
# Transposing the first argument to get a row vector gives an "Improper argument" error again
t(as.matrix(rep(1,5)))%*%as.matrix(iris_a[random_sample[k],1:4])
R应该比这更聪明(并且比MATLAB更好)。假设我做错了,这是什么工作的正确方法? (我推出了自己的循环功能,但是,呃......)
答案 0 :(得分:1)
命令weight_a%*%iris_a[random_sample[k],1:4]
不起作用,原因有两个:
(1)对象的长度不同,(2)iris_a[random_sample[k],1:4]
不是数字:
weight_a
[1] 1 1 1 1 1 #5 values
mode(weight_a)
[1] "numeric" #ok
iris_a[random_sample[k],1:4]
Sepal.Length Sepal.Width Petal.Length Petal.Width
74 6.1 2.8 4.7 1.2 #four values
mode(iris_a[random_sample[k],1:4])
[1] "list" #wrong type!
因此,向量的长度不同,第二个参数也不是数字。这应该有效:
weight_a[-5]%*%as.numeric(iris_a[random_sample[k],1:4])
[,1]
[1,] 14.8
#or you could just make weight_a<-rep(1,4)
编辑:有问题的原始代码来自0:4
,更改了对应新代码的答案。