R dtw中的自定义代理功能用于包装

时间:2013-06-18 00:47:48

标签: r wrapper

我有两列数据Tm和Ts,我想应用改变距离函数的dtw算法。代理提供了这种可能性,但我无法理解为什么它会给我一个错误。 我有2个相同长度的数据向量:

 Tm     Ts  
 301.0607   300.6008
 301.3406   300.6515     
 301.5912   300.7289    
 301.5777   300.8506    
 301.5996   301.0158    
 301.6414   301.2103    
 301.7181   301.4113    


 myDTW<-function(x,y)(diff(x,lag=1,difference=1)-diff(y,lag=1,difference=1))^2
 pr_DB$set_entry(FUN = myDTW, names = c("test_myDTW", "myDTW"))

 Alignment<-dtw(a$Ts,b$Tm,dist.method="test_myDTW",keep.internals=TRUE)

 Error in do.call(".External", c(list(CFUN, x, y, pairwise, 
 if (!is.function(method)) get(method) else method),  : 
 not a scalar return value

diff()将向量的长度从n更改为n-1,但两个向量都已更改,因此我认为问题不在于匹配不同长度的向量。 你有什么建议吗?

1 个答案:

答案 0 :(得分:1)

错误是明确的:

   not a scalar return value

你的myDTW没有返回标量。您需要将其定义为有效的距离函数。如果您将其更改为:

myDTW <- function(x,y){
        res <- (diff(x,lag=1,difference=1)
                       -diff(y,lag=1,difference=1))^2
        sum(res) ## I return the sum of square here
      }

它会起作用。我想你还需要使用modify_entry来修改寄存器中的方法值。

dat <- read.table(text='Tm     Ts  
301.0607   300.6008
301.3406   300.6515     
301.5912   300.7289    
301.5777   300.8506    
301.5996   301.0158    
301.6414   301.2103    
301.7181   301.4113',header=TRUE)    


myDTW <- function(x,y){
        res <- (diff(x,lag=1,difference=1)
                       -diff(y,lag=1,difference=1))^2
        sum(res)
                           }
pr_DB$modify_entry(FUN = myDTW, names = c("test_myDTW", "myDTW"))
library(dtw)
## I change a and b to dat here
dtw(dat$Ts,dat$Tm,dist.method="test_myDTW",keep.internals=TRUE)

结果是:

DTW alignment object
 Alignment size (query x reference): 7 x 7
 Call: dtw(x = dat$Ts, y = dat$Tm, dist.method = "test_myDTW", keep.internals = TRUE)