3

我有两列数据 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 但两个向量都发生了变化,所以我认为问题不在于匹配不同长度的向量。你有什么建议吗?

4

1 回答 1

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)
于 2013-06-18T03:23:51.337 回答