在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++语言基础 → DTW时间规整算法

DTW时间规整算法

C/C++语言基础

下载此实例
  • 开发语言:C/C++
  • 实例大小:2.49KB
  • 下载次数:10
  • 浏览次数:92
  • 发布时间:2021-08-17
  • 实例类别:C/C++语言基础
  • 发 布 人:j.z.h.88
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 时间 算法

实例介绍

【实例简介】Dynamic Time Warping(DTW)诞生有一定的历史了,它出现的目的也比较单纯,是一种衡量两个长度不同的时间序列的相似度的方法。应用也比较广,主要是在模板匹配中,比如说用在孤立词语音识别(识别两段语音是否表示同一个单词),手势识别,数据挖掘和信息检索等中。

【实例截图】

from clipboard


【核心代码】

/*dtwrecoge.cpp**************************************************************/

#include "dtwrecoge.h"
double distance[DTWMAXNUM][DTWMAXNUM]; /*保存距离*/
double dtwpath[DTWMAXNUM][DTWMAXNUM]; /*保存路径*/

/*****************************************************************************/
/* DTWDistance,求两个数组之间的匹配距离
/* A,B分别为第一第二个数组,I,J为其数组长度,r为匹配窗口的大小

/* r的大小一般取为数组长度的1/10到1/30
/* 返回两个数组之间的匹配距离,如果返回-1.0,表明数组长度太大了
/*****************************************************************************/
double DTWDistanceFun(double *A,int I,double *B,int J,int r)
{
int i,j;
double dist;
int istart,imax;
int r2=r ABS(I-J);  /*匹配距离*/
double g1,g2,g3;
int pathsig=1;        /*路径的标志*/

/*检查参数的有效性*/
if(I>DTWMAXNUM||J>DTWMAXNUM){
//printf("Too big number\n");
return -1.0;
}

/*进行一些必要的初始化*/
for(i=0;i<I;i ){
for(j=0;j<J;j ){
dtwpath[i][j]=0;
distance[i][j]=DTWVERYBIG;
}
}

/*动态规划求最小距离*/
/*这里我采用的路径是 -------
                          . |
                        .   |
                      .     |
                    .       |
*/
distance[0][0]=(double)2*ABS(A[0]-B[0]);
for(i=1;i<=r2;i ){
distance[i][0]=distance[i-1][0] ABS(A[i]-B[0]);
}
for(j=1;j<=r2;j ){
distance[0][j]=distance[0][j-1] ABS(A[0]-B[j]);
}

for(j=1;j<J;j ){
istart=j-r2;
if(j<=r2)
istart=1;
imax=j r2;
if(imax>=I)
imax=I-1;

for(i=istart;i<=imax;i ){
g1=distance[i-1][j] ABS(A[i]-B[j]);
g2=distance[i-1][j-1] 2*ABS(A[i]-B[j]);
g3=distance[i][j-1] ABS(A[i]-B[j]);
g2=MIN(g1,g2);
g3=MIN(g2,g3);
distance[i][j]=g3;
}
}

dist=distance[I-1][J-1]/((double)(I J));
return dist;
}/*end DTWDistance*/

/*****************************************************************************/
/* DTWTemplate,进行建立模板的工作
/* 其中A为已经建立好的模板,我们在以后加入训练样本的时候,
/* 以已建立好的模板作为第一个参数,I为模板的长度,在这个模板中不再改变
/* B为新加入的训练样本,J为B的长度,turn为训练的次数,在第一次
/* 用两个数组建立模板时,r为1,这是出于权值的考虑
/* temp保存匹配最新训练后的模板,建议temp[DTWMAXNUM],函数返回最新训练后模板的长度
/* 如果函数返回-1,表明训练样本之间距离过大,需要重新选择训练样本,
/* tt为样本之间距离的阀值,自行定义
/* rltdistance保存距离,第一次两个数组建立模板时可以随意赋予一个值,
/* 后面用前一次返回的值赋予该参数
/*****************************************************************************/
int DTWTemplate(double *A,int I,double *B,int J,double *temp,int turn,double tt,double *rltdistance)
{
double dist;
int i,j;
int pathsig=1;
dist=DTWDistanceFun(A,I,B,J,(int)(I/30));
if(dist>tt){
printf("\nSample doesn't match!\n");
return -1;
}

if(turn==1)
*rltdistance=dist;
else{
*rltdistance=((*rltdistance)*(turn-1) dist)/turn;
}
/*寻找路径,这里我采用了逆向搜索法*/
i=I-1;
j=J-1;
while(j>=1||i>=1){
double m;
if(i>0&&j>0){
m=MIN(MIN(distance[i-1][j],distance[i-1][j-1]),distance[i][j-1]);
if(m==distance[i-1][j]){
dtwpath[i-1][j]=pathsig;
i--;
}
else if(m==distance[i-1][j-1]){
dtwpath[i-1][j-1]=pathsig;
i--;
j--;
}
else{
dtwpath[i][j-1]=pathsig;
j--;
}
}
else if(i==0){
dtwpath[0][j-1]=pathsig;
j--;
}
else{/*j==0*/
dtwpath[i-1][0]=pathsig;
i--;
}
}
dtwpath[0][0]=pathsig;
dtwpath[I-1][J-1]=pathsig;

/*建立模板*/
for(i=0;i<I;i ){
double ftemp=0.0;
int ntemp=0;
for(j=0;j<J;j ){
if(dtwpath[i][j]==pathsig){
ftemp =B[j];
ntemp ;
}
}
ftemp/=((double)ntemp);
temp[i]=(A[i]*turn ftemp)/((double)(turn 1));/*注意这里的权值*/
}

return I;/*返回模板的长度*/
}//end DTWTemplate

标签: 时间 算法

实例下载地址

DTW时间规整算法

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警