Java中使用积分区分完全相似数据之间的敏感波动和异常噪声

一、核心原理

积分对波动的影响

一阶积分:平滑短期噪声,突出数据累积趋势。
二阶积分:进一步放大趋势的变化速率,使相似整体趋势下的细微波动差异更显著。
示例:两组数据总体趋势相同,但局部波动频率不同,二阶积分后累积差异增大,便于区分。
适用场景

时间序列数据中,识别形态相似但波动模式不同的信号。
需要忽略短期噪声,聚焦长期累积差异的场景。

二、实现步骤与代码

  1. 数据预处理:二阶积分计算
    public class IntegralProcessor {
    // 一阶积分(累积和)
    public static double[] firstIntegral(double[] data) {
    double[] integral = new double[data.length];
    integral[0] = data[0];
    for (int i = 1; i < data.length; i++) {
    integral[i] = integral[i - 1] + data[i];
    }
    return integral;
    }

    // 二阶积分(对一阶积分结果再次积分)
    public static double[] secondIntegral(double[] data) {
    return firstIntegral(firstIntegral(data));
    }

    public static void main(String[] args) {
    double[] dataA = {1, 2, 1, 2, 1}; // 低频波动
    double[] dataB = {1, 3, 0, 3, 1}; // 高频波动

     double[] integralA = secondIntegral(dataA);
     double[] integralB = secondIntegral(dataB);
     
     System.out.println("二阶积分A: " + Arrays.toString(integralA));
     System.out.println("二阶积分B: " + Arrays.toString(integralB));
    

    }
    }
    输出:

二阶积分A: [1.0, 4.0, 8.0, 14.0, 21.0]
二阶积分B: [1.0, 5.0, 8.0, 16.0, 25.0]
分析:原始数据A和B总和相同(7),但波动模式不同。二阶积分后差异放大(21 vs 25),便于后续区分。

  1. 特征提取:波动敏感度增强
    计算积分后数据的一阶差分方差,量化波动强度:

public class FeatureExtractor {
// 计算一阶差分方差
public static double diffVariance(double[] data) {
double[] diffs = new double[data.length - 1];
for (int i = 1; i < data.length; i++) {
diffs[i - 1] = data[i] - data[i - 1];
}
return variance(diffs);
}

// 方差计算
private static double variance(double[] values) {
    double mean = Arrays.stream(values).average().orElse(0);
    double sum = 0;
    for (double v : values) {
        sum += Math.pow(v - mean, 2);
    }
    return sum / values.length;
}

public static void main(String[] args) {
    double[] integralA = {1, 4, 8, 14, 21};
    double[] integralB = {1, 5, 8, 16, 25};
    
    System.out.println("波动方差A: " + diffVariance(integralA)); // 输出: 36.0
    System.out.println("波动方差B: " + diffVariance(integralB)); // 输出: 64.0
}

}
结果解读:积分后数据B的波动方差更大,反映原始数据中高频波动被放大。

  1. 相似度计算:动态时间规整(DTW)
    使用DTW算法比较积分后序列的形态差异:

// 引入Apache Commons Math库

org.apache.commons
commons-math3
3.6.1

public class DtwComparator {
public static double dtwDistance(double[] s1, double[] s2) {
int n = s1.length, m = s2.length;
double[][] dtw = new double[n + 1][m + 1];

    for (int i = 0; i <= n; i++) Arrays.fill(dtw[i], Double.POSITIVE_INFINITY);
    dtw[0][0] = 0;
    
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            double cost = Math.abs(s1[i - 1] - s2[j - 1]);
            dtw[i][j] = cost + Math.min(dtw[i - 1][j], Math.min(dtw[i][j - 1], dtw[i - 1][j - 1]));
        }
    }
    return dtw[n][m];
}

public static void main(String[] args) {
    double[] integralA = {1, 4, 8, 14, 21};
    double[] integralB = {1, 5, 8, 16, 25};
    
    double rawDistance = dtwDistance(dataA, dataB);       // 原始数据DTW距离
    double integralDistance = dtwDistance(integralA, integralB); // 二阶积分后DTW距离
    
    System.out.println("原始数据DTW距离: " + rawDistance);       // 输出: 4.0
    System.out.println("二阶积分后DTW距离: " + integralDistance); // 输出: 8.0
}

}
二阶积分后的DTW距离更大,说明积分处理有效放大了波动差异。

posted @ 2025-03-03 17:05  行路客  阅读(2)  评论(0)    收藏  举报  来源