0

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]で、これは機能しません (英語に翻訳すると、エラーは「Matrix or vector is required」です)。だから私は他のいくつかのことを試しました:

# 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 より優れている) はずです。私が間違っていると仮定すると、これを機能させる正しい方法は何ですか? (私は自分のループ関数をロールバックしましたが、うーん...)

4

1 に答える 1

1

weight_a%*%iris_a[random_sample[k],1:4]次の 2 つの理由により、コマンドは機能しません。

(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!

したがって、ベクトルの長さが異なり、2 番目の引数も数値ではありません。これはうまくいくはずです:

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で、対応する新しいコードに回答を変更しました。

于 2013-03-18T11:35:49.180 に答える