时间序列分类算法代码分析之动态时间规整(Dynamic Time Warpping)
本文算法来自于时间序列分类网站http://www.timeseriesclassification.com/code.php提供 的时间序列分类框架。DTW最早是用于语音识别领域,然后被用于时间序列相似性度量,与k近邻分类器结合后用于时间序列分类,下面分析其实现代码:01:public class DTW_kNN extends kNN {02:private boolean opti...
·
本文算法来自于时间序列分类网站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:}
更多推荐
已为社区贡献1条内容
所有评论(0)