【问题标题】:rpy2 Dynamic Time Warping (dtw) in python - windowing does not workpython中的rpy2动态时间扭曲(dtw) - 窗口不起作用
【发布时间】:2018-06-21 15:27:57
【问题描述】:

现已关闭的discussion 展示了如何在 python 中使用 R dtw 包。这有点笨拙,但是 R dtw 包比当前可用的 python dtw 实现更好而且更好。不幸的是,像 Sakoe-Chiba band 这样的窗口函数在尝试指定“window.size”时不起作用。映射到参数似乎存在问题。注意 ”。”使用 rpy2 时,in arguments 应该被替换为“_”。但是遵循这个约定,由于某种原因没有使用该参数。

import numpy as np

import rpy2.robjects.numpy2ri
from rpy2.robjects.packages import importr
rpy2.robjects.numpy2ri.activate()

# Set up our R namespaces
R = rpy2.robjects.r
DTW = importr('dtw')

# Generate our data
idx = np.linspace(0, 2*np.pi, 100)
template = np.cos(idx)
query = np.sin(idx) + np.array(R.runif(100))/10

# Calculate the alignment vector and corresponding distance
alignment = R.dtw(query, template, keep=True,window_type='sakoechiba',
                     window_size=5)

>>> RRuntimeError: Error in window.function(row(wm), col(wm), query.size= n, reference.size = m,  : 
 argument "window.size" is missing, with no default

您可以看到错误状态“window.size”缺失,尽管“window_size”明确以 rpy2 方式指定。

【问题讨论】:

    标签: python rpy2 dtw


    【解决方案1】:

    只是来自未来的说明:这个问题现在被feature-equivalent dtw-python package(也找到on PyPI)所取代。不再需要 rpy2-R-dtw 桥接器。

    【讨论】:

      【解决方案2】:

      回答我自己的问题,以防有人遇到同样的问题。问题在于参数映射和 R 三点省略号“...”。这可以通过手动指定映射来解决。

      from rpy2.robjects.functions import SignatureTranslatedFunction
      
      R.dtw = SignatureTranslatedFunction(R.dtw,
                              init_prm_translate={'window_size': 'window.size'})
      

      因此,在本规范中,正确使用了 window_size 参数。

      import numpy as np
      
      import rpy2.robjects.numpy2ri
      from rpy2.robjects.packages import importr
      from rpy2.robjects.functions import SignatureTranslatedFunction
      rpy2.robjects.numpy2ri.activate()
      
      # Set up our R namespaces
      R = rpy2.robjects.r
      DTW = importr('dtw')
      R.dtw = SignatureTranslatedFunction(R.dtw,
                            init_prm_translate={'window_size': 'window.size'})
      
      # Generate our data
      idx = np.linspace(0, 2*np.pi, 100)
      template = np.cos(idx)
      query = np.sin(idx) + np.array(R.runif(100))/10
      
      # Calculate the alignment vector and corresponding distance
      alignment = R.dtw(query, template, keep=True,window_type='sakoechiba',
                           window_size=10)
      dist = alignment.rx('distance')[0][0]
      
      print(dist)
      >>> 117.348292359
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-22
        • 2016-08-26
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多