本文算法来自于时间序列分类网站http://www.timeseriesclassification.com/code.php提供 的时间序列分类框架。DTW最早是用于语音识别领域,然后被用于时间序列相似性度量,与k近邻分类器结合后用于时间序列分类,下面分析其实现代码:

01:public class DTW_kNN extends kNN {
02:	private boolean optimiseWindow=false;//是否使用最优窗口
03:	private double windowSize=0.1;//最优窗口比率
04:	private double maxWindowSize=1;//最大窗口比率
05:	private int incrementSize=10;//增量
06:	private Instances train;
07:	private int trainSize;
08:	private int bestWarp;
09:	DTW dtw=new DTW();//DTW距离
10:	
11:	public DTW_kNN(){
12:		super();
13:		dtw.setR(windowSize);
14:		setDistanceFunction(dtw);
15:		super.setKNN(1);
16:	}
17:	
18:	public void optimiseWindow(boolean b){ optimiseWindow=b;}
19:	public void setMaxR(double r){ maxWindowSize=r;}
20:	public DTW_kNN(int k){
21:		super(k);
22:		dtw.setR(windowSize);
23:		optimiseWindow=true;
24:		setDistanceFunction(dtw);
25:	}
26:	public void buildClassifier(Instances d){//训练模型,主要是设置参数
27:		dist.setInstances(d);
28:		train=d;
29:		trainSize=d.numInstances();
30:		if(optimiseWindow){//如果选择最优参数,则遍历所有窗口选择最优窗口
31:			double maxR=0;
32:			double maxAcc=0;
33:			int dataLength=train.numAttributes()-1;
34:			int max=(int)(dataLength*maxWindowSize);
35:			for(double i=0;i<max;i+=incrementSize){//遍历窗口
36:				//Set r for current value
37:				dtw.setR(i/(double)dataLength);
38:				double acc=crossValidateAccuracy();//计算该窗口下准确率
39:				if(acc>maxAcc){
40:					maxR=i/dataLength;
41:					maxAcc=acc;
42:				}
43:			}
44:			bestWarp=(int)(maxR*dataLength);//选择最优窗口
45:			dtw.setR(maxR);
46:		}
47:		super.buildClassifier(d);//训练模型
48:	}
49:}

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐