R言語の外積演算関数 outer() を利用して、任意の自作関数(ガウス核関数 GaussianKernel() )の z軸の値を求める際の関数の挙動について
R言語の外積演算関数 outer()
を利用してガウス核関数の3次元の図の作図を行なおうとしているのですが、outer()
関数呼び出し後の自作関数 GaussianKernel()
の挙動が理解できずエラーが発生してしまいます。その結果scatterplot3dパッケージの3次元作図関数scatterplot3d()
でもエラーが発生してしまいます。
このRコードでのouter()
関数、及びscatterplot3d()
の挙動、及び対策案を教えて頂きたく存じますm(__)m
以下、実装中のRコードです。
library( MASS ) # MASS package
library( kernlab ) #
library( scatterplot3d ) # scatterplot3d関数を使用
#########################
# set gauss kernel
#########################
#---------------------------------------------------------------
# GaussianKernel()
# [in]
# x1 : [vector] input data x1-axis
# x2 : [vector] input data x2-axis
# alpha : [scaler] constant value
# mean : [vector] mean vector
# matSigma : [matrix] covariance matrix
# [out]
# gauss : [scaler] function value (z value)
#---------------------------------------------------------------
GaussianKernel <- function( x1, x2, alpha, mean, matSigma )
{
datX <- c(x1,x2)
datX <- as.matrix( datX )
mean <- as.matrix( mean )
#print(datX)
#print(mean)
gauss <- ( solve( matSigma ) %*% ( datX - mean ) )
#print(gauss)
gauss <- ( -alpha*t( datX-mean )%*%gauss )
gauss <- exp( gauss )
return( gauss )
}
lstGKernel <- list(
x1 = seq( from=0, to=10, by=0.1 ),
x2 = seq( from=0, to=10, by=0.1 ),
z = matrix( 0, nrow = 100, ncol = 100 ),
dat_alpha = 0.005,
vec_u = c( -7.61,0.22 ),
matS = matrix( c(0.72,-0.53,-0.53,0.84), nrow = 2, ncol = 2 )
)
このコード呼び出し後の動作が理解できていません。
# outer()で自作関数GaussianKernel()のz軸成分を求める
lstGKernel$z <- outer(
lstGKernel$x1, lstGKernel$x2, #関数の入力データ引数x1,x2
GaussianKernel, #対象の自作関数
lstGKernel$dat_alpha, lstGKernel$vec_u ,lstGKernel$matS #関数の引数指定
)
実行結果
Error in datX - mean : non-conformable arrays
############################
# Draw figure #
############################
scatterplot3d(
x = lstGKernel$x1, y = lstGKernel$x2, z =lstGKernel$z,
main = lstAxis$mainTitle,
# xlim=lstAxis$xlim, ylim=lstAxis$ylim, zlim = lstAxis$zlim,
highlight = TRUE
)
実行結果
Error in xyz.coords(x = x, y = y, z = z, xlab = xlabel, ylab = ylabel,
: 'x', 'y' and 'z' lengths differ
<17/02/09 追記>
回答で提示して頂いたコードを元に作図した結果を載せておきます。