我想使用DynamicTimeWarping(DTW)的输出进行分类。 事实证明,动态时间规整算法的输出仍然需要后处理。 作为时间对齐过程的一部分,数据A的某些单个数据点将映射到数据B上的多个数据点。 我计划将数据B上的那几个数据点的平均值映射到数据点的单个数据点。 最终输出将是针对相似性优化的数据之间的一对一映射数据点。 然后我将使用此最终输出进行分类。
以下是我目前的代码:
import java.io.*;
import java.util.*;
public class dtw_postprocess {
public static void main(String[] args) throws IOException {
File inFile = new File ("WarpPath.txt");
Scanner sc = new Scanner (inFile);
{
int a[] = new int[600];
while(sc.hasNextInt()) {
int i=0;
a[i]=sc.nextInt();
}
sc.close();
File inFile2 = new File ("Data.txt");
Scanner sc2 = new Scanner (inFile2);
double[] b = new double[600];
{
int l=0;
do {
b[l]=sc2.nextDouble();
} while(sc2.hasNextDouble());
}
sc.close(); sc2.close();
File warped = new File("warpedOutput.txt");
FileOutputStream fos_warped = new FileOutputStream(warped);
BufferedWriter bw_warped = new BufferedWriter(new OutputStreamWriter(fos_warped));
for (int m=0; m < a.length; m++){
bw_warped.write((int) lookup(a,b));
bw_warped.newLine();
}
bw_warped.close();
}
}
static double lookup (int[] a, double[] b){
int i=0;
while(a[i] == a[i+1] && a[i] != a[i+2] && a[i+1] != a[3]) {
return b[i];
}
while(a[i] == a[i+1] && a[i] < a[i+2] && a[i+1] == a[3]) {
double[] c = {a[i],a[i+1],a[i+2],a[i+3]};
double d = kahanMean(c);
return d;
}
while(a[i] == a[i+1] && a[i] == a[i+2] && a[i+1] < a[3]){
return b[i-1];
}
return b[i];
}
static double kahanMean(double[] data) {
double sum = 0, c = 0;
int num = 0;
for (double d : data) {
++num;
double y = d - c;
double t = sum + y;
c = (t - sum) - y;
sum = t;
}
return sum / num;
}
}
输入将是两个文件,
数据A到数据B的变形路径,如下所示:[(0,0),(1,0),(2,0),(3,1),(4,1),(5,2)]
数据A,看起来像:
0.243333333
0.41
0.44
0.16
0.03
0.09
应该在warpedOutput.txt
上写输出,但生成的输出文件是空白的。