时间序列分类算法之时间序列森林(TSF)
算法介绍
时间序列森林(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)相关推荐
- 时间序列分类算法_时间序列分类算法简介
时间序列分类算法 A common task for time series machine learning is classification. Given a set of time serie ...
- 时间序列分类算法简介及其在能耗数据分类上的应用
本文首先简要介绍最近几年来时间序列分类算法的最新研究成果,包括dynamic time warping的各种改进技术和相关研究,以及最新的聚合式算法(ensemble algorithm).其次以根据 ...
- 机器学习5—分类算法之随机森林(Random Forest)
随机森林(Random Forest) 前言 一.随机森林 1.什么是随机森林 2.随机森林的特点 3.随机森林的生成 二.随机森林的函数模型 三.随机森林算法实现 1.数据的读取 2.数据的清洗和填 ...
- R语言分类算法之随机森林(Random Forest)
1.原理分析: 随机森林是通过自助法(boot-strap)重采样技术,从原始训练样本集N中有放回地重复随机抽取k个样本生成新的训练集样本集合,然后根据自助样本集生成k个决策树组成的随机森林,新数据的 ...
- 机器学习分类算法之随机森林(集成学习算法)
目录 什么是集成学习? 随机森林 随机森林的生成算法 随机森林的随机性
- 深度学习的时间序列分类
为什么要进行时间序列分类? (Why Time Series Classification?) First of all it's important to underline why this pr ...
- 基于 Mixup 数据增强的 LSTM-FCN 时间序列分类学习记录
摘要 在时间序列分类任务中,针对时间序列数据少和多样性导致深度学习模型准确率不高的问题,提出 Mixup 数据增强的长短期记忆网络–全卷积网络LSTM-FCN)时间序列分类算法.该算法首先使用 Mix ...
- 基于频谱注意力机制和编码解码模型的时间序列分类研究
文章来源 浙江大学 2021年硕士论文 小论文 IEEE Spectrum Attention Mechanism for Time Series Classification 1 摘要 本文贡献 时 ...
- 机器学习分类算法_达观数据:5分钟带你理解机器学习及分类算法
1.本文介绍内容:什么是机器学习,机器学习有哪些分类算法,分类算法之k-近邻,决策树,随机森林2.本文适合人群:本文通过通俗易懂的语言和例子介绍核心思想,不拽高大上的名词,适合于不懂机器学习的小白3. ...
最新文章
- maven 插件的应用
- DevExpress中透明玻璃效果
- 极光 php 自定义消息,laravel框架使用极光推送消息操作示例
- markdown editor_基于 Vue+Vditor 所见即所得Markdown编辑器
- 二维树状数组 BZOJ 1452 [JSOI2009]Count
- Oracle的一点注意点
- php概率计算_php 抽奖概率算法
- VS2010 使用GDI+创建图片水印的MFC程序
- 用多媒体库 Bass.dll 播放 mp3 [9] - 绘制波形图
- 先进技术android,React Native实战(JavaScript开发iOS和Android应用)/计算机科学先进技术译丛...
- Java8新特性教程 - 终极指南
- IDEA :windows下Hadoop报错null\bin\winutils.exe
- 常用配置文件格式比较
- 敏捷开发系列学习总结(4)—Git管理工具sourcetree的安装
- 【金融】【python】CAPM实证分析
- POJ 2480 Longge#39;s problem 积性函数
- postgre 主键_PostgreSQL – 随机主键
- JavaScript函数重载(js函数重载)
- error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“:
- Adaptive icon 一 :理解 Android 的「自适应图标」