算法介绍

时间序列森林(Time Series Forest, TSF)模型将时间序列转化为子序列的均值、方差和斜率等统计特征,并使用随机森林进行分类。TSF通过使用随机森林方法(以每个间隔的统计信息作为特征)来克服间隔特征空间巨大的问题。训练一棵树涉及选择根号m 个随机区间,生成每个系列的随机区间的均值,标准差和斜率,然后在所得的3根号m 个特征上创建和训练一棵树。

分类树有两个特征。首先,预先定义固定数量的评估点,而不是评估所有可能的分割点,以获取最佳信息增益。作者认为这是使分类器更快的权宜之计,因为它消除了对每个案例进行分类的需要属性值。其次,介绍了一种细化的分割标准,以在具有相等信息增益的特征之间进行选择。这被定义为分割余量和最接近情况之间的距离。这个想法背后的直觉是,如果两个拆分具有相等的熵增益,则应该选择距离最近的情况最远的拆分。如果评估了所有可能的间隔,则该度量将没有价值,因为根据定义,分割点被视为个案之间的等距距离。

算法代码分析

 public class TSF extends AbstractClassifierWithTrainingData implements SaveParameterInfo, TrainAccuracyEstimate{boolean setSeed=false;int seed=0;//随机种子RandomTree[] trees;//存储森林中的每一棵树int numTrees=500;//树的数量int numFeatures;//特征个数,√mint[][][] intervals;//用于存储子序列位置Random rand;//随机函数Instances testHolder;boolean trainCV=false;  //是否进行交叉验证获取最优参数String trainCVPath="";//存储交叉验证结果路径public TSF(){rand=new Random();}public TSF(int s){rand=new Random();seed=s;rand.setSeed(seed);setSeed=true;}public void setSeed(int s){this.setSeed=true;seed=s;rand=new Random();rand.setSeed(seed);}@Overridepublic void writeCVTrainToFile(String train) {trainCVPath=train;trainCV=true;}@Overridepublic void setFindTrainAccuracyEstimate(boolean setCV){trainCV=setCV;}@Overridepublic boolean findsTrainAccuracyEstimate(){ return trainCV;}@Overridepublic void buildClassifier(Instances data) throws Exception {long t1=System.currentTimeMillis();//特征个数numFeatures=(int)Math.sqrt(data.numAttributes()-1);if(trainCV){//如果为真,则进行交叉验证int numFolds=setNumberOfFolds(data);CrossValidator cv = new CrossValidator();if (setSeed)cv.setSeed(seed);cv.setNumFolds(numFolds);//递归调用算法计算准确率TSF tsf=new TSF();tsf.trainCV=false;trainResults=cv.crossValidateWithStats(tsf,data);}numFeatures=(int)Math.sqrt(data.numAttributes()-1);intervals =new int[numTrees][][];trees=new RandomTree[numTrees];//初始化输出向量格式. FastVector atts=new FastVector();String name;//最终向量长度为3√mfor(int j=0;j<numFeatures*3;j++){name = "F"+j;atts.addElement(new Attribute(name));}//设置类属性            Attribute target =data.attribute(data.classIndex());FastVector vals=new FastVector(target.numValues());for(int j=0;j<target.numValues();j++)vals.addElement(target.value(j));atts.addElement(new Attribute(data.attribute(data.classIndex()).name(),vals));
//初始化空实例                Instances result = new Instances("Tree",atts,data.numInstances());result.setClassIndex(result.numAttributes()-1);for(int i=0;i<data.numInstances();i++){DenseInstance in=new DenseInstance(result.numAttributes());in.setValue(result.numAttributes()-1,data.instance(i).classValue());result.add(in);}testHolder =new Instances(result,0);       DenseInstance in=new DenseInstance(result.numAttributes());testHolder.add(in);
//初始化每一棵树       for(int i=0;i<numTrees;i++){intervals[i]=new int[numFeatures][2];  //开始和结束结点for(int j=0;j<numFeatures;j++){//随机获取没棵树的子序列位置intervals[i][j][0]=rand.nextInt(data.numAttributes()-1);     int length=rand.nextInt(data.numAttributes()-1-intervals[i][j][0]);//最小长度为3intervals[i][j][1]=intervals[i][j][0]+length;}//2. 生成并存储树            for(int j=0;j<numFeatures;j++){//遍历数据集中的实例for(int k=0;k<data.numInstances();k++){//提取每个实例的子序列double[] series=data.instance(k).toDoubleArray();//每个子序列提取3个属性,构成属性集合FeatureSet f= new FeatureSet();f.setFeatures(series, intervals[i][j][0], intervals[i][j][1]);result.instance(k).setValue(j*3, f.mean);result.instance(k).setValue(j*3+1, f.stDev);result.instance(k).setValue(j*3+2, f.slope);}}
//Set features
/*Create and build tree using all the features. Feature selectionhas already occurred*/trees[i]=new RandomTree();   trees[i].setKValue(numFeatures);trees[i].buildClassifier(result);}long t2=System.currentTimeMillis();trainResults.buildTime=t2-t1;if(trainCVPath!=""){//存储交叉验证后的参数OutFile of=new OutFile(trainCVPath);of.writeLine(data.relationName()+",TSF,train");of.writeLine(getParameters());of.writeLine(trainResults.acc+"");double[] trueClassVals,predClassVals;trueClassVals=trainResults.getTrueClassVals();predClassVals=trainResults.getPredClassVals();for(int i=0;i<data.numInstances();i++){//Basic sanity checkif(data.instance(i).classValue()!=trueClassVals[i]){throw new Exception("ERROR in TSF cross validation, class mismatch!");}of.writeString((int)trueClassVals[i]+","+(int)predClassVals[i]+",");for(double d:trainResults.getDistributionForInstance(i))of.writeString(","+d);of.writeString("\n");}}}@Overridepublic double classifyInstance(Instance ins) throws Exception {int[] votes=new int[ins.numClasses()];
//Build instancedouble[] series=ins.toDoubleArray();for(int i=0;i<trees.length;i++){for(int j=0;j<numFeatures;j++){//extract the intervalFeatureSet f= new FeatureSet();f.setFeatures(series, intervals[i][j][0], intervals[i][j][1]);testHolder.instance(0).setValue(j*3, f.mean);testHolder.instance(0).setValue(j*3+1, f.stDev);testHolder.instance(0).setValue(j*3+2, f.slope);}int c=(int)trees[i].classifyInstance(testHolder.instance(0));votes[c]++;}
//Return majority vote            int maxVote=0;for(int i=1;i<votes.length;i++)if(votes[i]>votes[maxVote])maxVote=i;return maxVote;}//属性集合public static class FeatureSet{double mean;//均值double stDev;//方差double slope;//斜率,指的是用直线拟合子序列之后,该直线的斜率RandomForest r; public void setFeatures(double[] data, int start, int end){double sumX=0,sumYY=0;double sumY=0,sumXY=0,sumXX=0;int length=end-start+1;for(int i=start;i<=end;i++){sumY+=data[i];sumYY+=data[i]*data[i];sumX+=(i-start);sumXX+=(i-start)*(i-start);sumXY+=data[i]*(i-start);}mean=sumY/length;stDev=sumYY-(sumY*sumY)/length;slope=(sumXY-(sumX*sumY)/length);if(sumXX-(sumX*sumX)/length!=0)slope/=sumXX-(sumX*sumX)/length;elseslope=0;stDev/=length;if(stDev==0)    //Flat lineslope=0;
//            else
//                stDev=Math.sqrt(stDev);if(slope==0)stDev=0;}public void setFeatures(double[] data){setFeatures(data,0,data.length-1);}@Overridepublic String toString(){return "mean="+mean+" stdev = "+stDev+" slope ="+slope;}}
}

时间序列分类算法之时间序列森林(TSF)相关推荐

  1. 时间序列分类算法_时间序列分类算法简介

    时间序列分类算法 A common task for time series machine learning is classification. Given a set of time serie ...

  2. 时间序列分类算法简介及其在能耗数据分类上的应用

    本文首先简要介绍最近几年来时间序列分类算法的最新研究成果,包括dynamic time warping的各种改进技术和相关研究,以及最新的聚合式算法(ensemble algorithm).其次以根据 ...

  3. 机器学习5—分类算法之随机森林(Random Forest)

    随机森林(Random Forest) 前言 一.随机森林 1.什么是随机森林 2.随机森林的特点 3.随机森林的生成 二.随机森林的函数模型 三.随机森林算法实现 1.数据的读取 2.数据的清洗和填 ...

  4. R语言分类算法之随机森林(Random Forest)

    1.原理分析: 随机森林是通过自助法(boot-strap)重采样技术,从原始训练样本集N中有放回地重复随机抽取k个样本生成新的训练集样本集合,然后根据自助样本集生成k个决策树组成的随机森林,新数据的 ...

  5. 机器学习分类算法之随机森林(集成学习算法)

    目录 什么是集成学习? 随机森林 随机森林的生成算法 随机森林的随机性

  6. 深度学习的时间序列分类

    为什么要进行时间序列分类? (Why Time Series Classification?) First of all it's important to underline why this pr ...

  7. 基于 Mixup 数据增强的 LSTM-FCN 时间序列分类学习记录

    摘要 在时间序列分类任务中,针对时间序列数据少和多样性导致深度学习模型准确率不高的问题,提出 Mixup 数据增强的长短期记忆网络–全卷积网络LSTM-FCN)时间序列分类算法.该算法首先使用 Mix ...

  8. 基于频谱注意力机制和编码解码模型的时间序列分类研究

    文章来源 浙江大学 2021年硕士论文 小论文 IEEE Spectrum Attention Mechanism for Time Series Classification 1 摘要 本文贡献 时 ...

  9. 机器学习分类算法_达观数据:5分钟带你理解机器学习及分类算法

    1.本文介绍内容:什么是机器学习,机器学习有哪些分类算法,分类算法之k-近邻,决策树,随机森林2.本文适合人群:本文通过通俗易懂的语言和例子介绍核心思想,不拽高大上的名词,适合于不懂机器学习的小白3. ...

最新文章

  1. maven 插件的应用
  2. DevExpress中透明玻璃效果
  3. 极光 php 自定义消息,laravel框架使用极光推送消息操作示例
  4. markdown editor_基于 Vue+Vditor 所见即所得Markdown编辑器
  5. 二维树状数组 BZOJ 1452 [JSOI2009]Count
  6. Oracle的一点注意点
  7. php概率计算_php 抽奖概率算法
  8. VS2010 使用GDI+创建图片水印的MFC程序
  9. 用多媒体库 Bass.dll 播放 mp3 [9] - 绘制波形图
  10. 先进技术android,React Native实战(JavaScript开发iOS和Android应用)/计算机科学先进技术译丛...
  11. Java8新特性教程 - 终极指南
  12. IDEA :windows下Hadoop报错null\bin\winutils.exe
  13. 常用配置文件格式比较
  14. 敏捷开发系列学习总结(4)—Git管理工具sourcetree的安装
  15. 【金融】【python】CAPM实证分析
  16. POJ 2480 Longge#39;s problem 积性函数
  17. postgre 主键_PostgreSQL – 随机主键
  18. JavaScript函数重载(js函数重载)
  19. error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“:
  20. Adaptive icon 一 :理解 Android 的「自适应图标」

热门文章

  1. Altium designer如何实现原理图和PCB交互式布局
  2. 机顶盒开发助手Tvbox
  3. typescript学习之函数
  4. L1-058 6翻了 (15 分)循环的妙用
  5. 数显电接点压力表与指针电接点压力表的区别
  6. 期刊论文发表的重复率要求
  7. 《基于Python的金融分析与风险管理》学习笔记
  8. 抖音小店无货源,怎么操作可以出单?资深电商人在线分享
  9. python-qbittorrent库下载电影学习记录(含基本使用和常用函数)
  10. 兄弟Brother MFC-T800W 驱动