TWDTW初版

本文详细介绍了JavaScript开发中的最新ECMAScript标准,探讨了其语法特性与实际应用,为开发者提供了一个全面的入门指南。
摘要由CSDN通过智能技术生成
//第一部分,TWDTW模块
exports.DTWDist = function(patterns_arr, timeseries_col, options){
  // Sort Images in ascending order based on the 'system:time_start' metadata property
  timeseries_col = ee.ImageCollection(timeseries_col);

  patterns_arr = ee.Array(patterns_arr);
  var patterns_no = options.patterns_no || patterns_arr.length().get([0]); //示范向量从大到小的第一维长度,要分多少种
  var band_no = options.band_no || patterns_arr.length().get([1]).subtract(1);//示范向量从大到小的第二维长度减一,波段数量减一
  var timeseries_len = options.timeseries_len || timeseries_col.size();//时间序列的元素数量
  var patterns_len = options.patterns_len || patterns_arr.length().get([2]);//示范向量从大到小的第三维长度,时间戳数量,一共有四个维度,最低维度为单个时间戳对应的数值大小
  var constraint_type = options.constraint_type || 'time-weighted';//约束方式
  var weight_type = options.weight_type || 'logistic';//加权种类(逻辑的/逻辑斯蒂的)
  var distance_type = options.distance_type || 'euclidean';//距离种类,欧氏距离
  var beta = options.beta || 50;
  var alpha = options.alpha || 0.1;

  var cost_weight;
  var dis_arr;
  var dis_mat;

  // 为距离矩阵提供距离计算的迭代函数
  // 目前只支持欧几里德距离和角度距离。
  var _distCalc = function(img, j, k){

    var wrap = function(n, previous2){
     n = ee.Number(n);
     previous2 = ee.List(previous2);

     var x1 = img.select(n.subtract(1)).toArray().toInt16();//将第n个波段的变化连接成单个像素数组
     var y1 = patterns_arr.get(ee.List([ee.Number(k).subtract(1), n.subtract(1), j.subtract(1)]));//得到该位置的向量

     if (distance_type === 'euclidean') {
         dis_arr = x1.subtract(y1).pow(2);//相减然后平方
     } 
     
     return dis_arr.add(previous2)
   }

   return wrap
  }



  var matrix = ee.List.sequence(1, ee.Number(timeseries_len).subtract(1)).map(function(i){
    var matrix_tmp = ee.List.sequence(1, ee.Number(patterns_len).subtract(1)).map(function(j){
      return ee.List([i, j]);
    });
    return matrix_tmp;
  });//获得图像与示例位数的对应图

  matrix = ee.List(matrix.iterate(function(x, previous){
    return ee.List(previous).cat(ee.List(x));
  }, ee.List([])));//在列表上重复算法,矩阵被变化为横向数组




  var dtw_image_list = ee.List.sequence(1, patterns_no).map(function(k){

       if (constraint_type === 'time-weighted') {

          dis_mat = timeseries_col.toList(timeseries_col.size()).map(function(img){
            img = ee.Image(img);

            var dis_list = ee.List.sequence(1, patterns_len).m
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在日常的生活中我们最经常使用的距离毫无疑问应该是欧式距离,但是对于一些特殊情况,欧氏距离存在着其很明显的缺陷,比如说时间序列,举个比较简单的例子,序列A:1,1,1,10,2,3,序列B:1,1,1,2,10,3,如果用欧氏距离,也就是distance[i][j]=(b[j]-a[i])*(b[j]-a[i])来计算的话,总的距离和应该是128,应该说这个距离是非常大的,而实际上这个序列的图像是十分相似的,这种情况下就有人开始考虑寻找新的时间序列距离的计算方法,然后提出了DTW算法,这种方法在语音识别,机器学习方便有着很重要的作用。 这个算法是基于动态规划(DP)的思想,解决了发音长短不一的模板匹配问题,简单来说,就是通过构建一个邻接矩阵,寻找最短路径和。 还以上面的2个序列作为例子,A中的10和B中的2对应以及A中的2和B中的10对应的时候,distance[3]以及distance[4]肯定是非常大的,这就直接导致了最后距离和的膨胀,这种时候,我们需要来调整下时间序列,如果我们让A中的10和B中的10 对应 ,A中的1和B中的2对应,那么最后的距离和就将大大缩短,这种方式可以看做是一种时间扭曲,看到这里的时候,我相信应该会有人提出来,为什么不能使用A中的2与B中的2对应的问题,那样的话距离和肯定是0了啊,距离应该是最小的吧,但这种情况是不允许的,因为A中的10是发生在2的前面,而B中的2则发生在10的前面,如果对应方式交叉的话会导致时间上的混乱,不符合因果关系。 接下来,以output[6][6](所有的记录下标从1开始,开始的时候全部置0)记录A,B之间的DTW距离,简单的介绍一下具体的算法,这个算法其实就是一个简单的DP,状态转移公式是output[i] [j]=Min(Min(output[i-1][j],output[i][j-1]),output[i-1][j-1])+distance[i] [j];最后得到的output[5][5]就是我们所需要的DTW距离.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值