深度解析whittakerFilter:一篇文章带你从理论到GEE实现
DeepSeek只是图一乐,真学懂WhittakerFilter还得看我这篇文章。本文将详细介绍差分矩阵,推导WhittakerFilter相关公式,并在GEE中用60行代码实现WhittakerFilter。
DeepSeek只是图一乐,真学懂WhittakerFilter还得看我这篇文章。本文将详细介绍差分矩阵,推导WhittakerFilter相关公式,并在GEE中用60行代码实现WhittakerFilter。
Whittaker Filter(惠特克滤波器)是一种用于信号处理和数据分析的平滑技术,主要用于去除噪声并提取信号中的趋势或平滑成分。它由E. T. Whittaker在20世纪初提出,广泛应用于时间序列分析、光谱数据处理、生物信号处理等领域。
核心思想
公式
Whittaker Filter的核心思想是通过最小化一个目标函数来实现信号的平滑。该目标函数由两部分组成:
-
平滑项:衡量信号平滑度的部分,通常通过二阶差分来量化信号的曲率。
-
保真项:衡量平滑后信号与原始信号之间差异的部分,确保平滑后的信号不会偏离原始信号太多。
目标函数的形式为:
Q=∑i=1n(yi−zi)2+λ∑i=2n−1(Δnzi)2Q=\sum_{i=1}^{n}\left(y_{i}-z_{i}\right)^{2}+\lambda \sum_{i=2}^{n-1}\left(\Delta^{n} z_{i}\right)^{2}Q=i=1∑n(yi−zi)2+λi=2∑n−1(Δnzi)2
其中:
- yiy_{i}yi是原始信号的第iii个数据点
- ziz_{i}zi是平滑后信号的第iii个数据点
- λ\lambdaλ是平滑参数,控制平滑程度(λ\lambdaλ越大,信号越平滑)
- Δnzi\Delta^{n} z_{i}Δnzi是nnn阶差分,用于衡量信号的曲率。
特点
- 灵活性:通过调整平滑参数 λ\lambdaλ,可以控制平滑程度。λ\lambdaλ 越大,平滑效果越强;λ\lambdaλ越小,平滑效果越弱。
- 非参数化:不需要假设信号的分布或模型形式,适用于多种类型的数据。
- 计算高效:可以通过线性代数方法(如Cholesky分解)高效求解。
应用场景
- 时间序列分析:去除噪声,提取趋势。
- 光谱数据处理:平滑光谱曲线,去除噪声。
- 生物信号处理:如心电图(ECG)或脑电图(EEG)信号的平滑。
- 数据压缩:通过平滑减少数据量。
实现
Whittaker Filter的实现通常涉及以下步骤:
构建差分矩阵 DDD
构建差分矩阵是Whittaker Filter中的一个关键步骤。差分矩阵的作用是通过矩阵运算来计算信号的nnn阶差分,从而量化信号的曲率(即平滑度)。下面详细解释这一过程:
1. 什么是差分?
差分是离散信号处理中常用的操作,用于衡量信号的变化率。具体来说:
- 一阶差分:衡量信号中相邻点之间的变化。
Δzi=zi−zi−1\Delta z_{i}=z_{i}-z_{i-1}Δzi=zi−zi−1 - 二阶差分:衡量一阶差分的变化,即信号的曲率。
Δ2zi=Δzi−Δzi−1=zi−2zi−1+zi−2\Delta^{2} z_{i}= \Delta z_{i}- \Delta z_{i-1}=z_{i}-2z_{i-1}+z_{i-2}Δ2zi=Δzi−Δzi−1=zi−2zi−1+zi−2
二阶差分可以反映信号的平滑程度。如果二阶差分较小,说明信号在该点附近比较平滑;如果二阶差分较大,说明信号在该点附近变化剧烈。
2. 差分矩阵的作用
差分矩阵DDD是一个线性算子,用于将信号 zzz转换为其二阶差分。具体来说:
-
差分矩阵DDD 是一个稀疏矩阵,其形式取决于差分的阶数和信号的长度。
-
通过矩阵乘法 D⋅zD \cdot zD⋅z,可以快速计算信号 zzz 的二阶差分。
3. 差分矩阵的构建方法
(1) 1阶差分矩阵
对于长度为mmm的信号,1阶差分矩阵D1(m)D_{1}^{\left(m\right)}D1(m)是一个(m−1)×m\left(m-1\right) \times m(m−1)×m的稀疏矩阵,形式如下:
D1(m)=[−1100…00−110…0⋮⋮⋮⋮⋱⋮00…0−11]D_{1}^{\left(m\right)}= \begin{bmatrix} -1& 1 & 0 & 0 & \dots & 0\\ 0& -1 & 1 & 0 & \dots & 0\\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots \\ 0& 0 & \dots & 0 & -1 & 1 \end{bmatrix}D1(m)= −10⋮01−1⋮001⋮…00⋮0……⋱−100⋮1
(2) 2阶差分矩阵
2阶差分矩阵D2(m)D_{2}^{\left(m\right)}D2(m)是一个(m−2)×m\left(m-2\right) \times m(m−2)×m的稀疏矩阵,可以通过1阶差分矩阵递归计算得到:
D2(m)=D1(m−1)⋅D1(m)=[1−210…001−21…0⋮⋮⋮⋮⋱⋮00…1−21]D_{2}^{\left(m\right)}=D_{1}^{\left(m-1\right)}\cdot D_{1}^{\left(m\right)}= \begin{bmatrix} 1& -2 & 1 & 0 & \dots & 0\\ 0& 1 & -2 & 1 & \dots & 0\\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots \\ 0& 0 & \dots & 1 & -2 & 1 \end{bmatrix}D2(m)=D1(m−1)⋅D1(m)= 10⋮0−21⋮01−2⋮…01⋮1……⋱−200⋮1
其中D1(m−1)D_{1}^{\left(m-1\right)}D1(m−1)是信号长度为m−1m-1m−1的1阶差分矩阵,D1(m)D_{1}^{\left(m\right)}D1(m)是信号长度为mmm的1阶差分矩阵。
(3) 3阶差分矩阵
3阶差分矩阵D3(m)D_{3}^{\left(m\right)}D3(m)是一个(m−3)×m\left(m-3\right) \times m(m−3)×m的稀疏矩阵,可以通过2阶差分矩阵递归计算得到:
D3(m)=D1(m−2)⋅D2(m)=[1−33−10…001−33−1…0⋮⋮⋮⋮⋮⋱⋮00…1−33−1]D_{3}^{\left(m\right)}=D_{1}^{\left(m-2\right)}\cdot D_{2}^{\left(m\right)}= \begin{bmatrix} 1& -3 & 3 & -1 & 0 & \dots & 0\\ 0& 1 & -3 & 3 & -1 & \dots & 0\\ \vdots & \vdots & \vdots & \vdots & \vdots & \ddots & \vdots \\ 0& 0 & \dots & 1 & -3 & 3 & -1 \end{bmatrix}D3(m)=D1(m−2)⋅D2(m)= 10⋮0−31⋮03−3⋮…−13⋮10−1⋮−3……⋱300⋮−1
其中D1(m−2)D_{1}^{\left(m-2\right)}D1(m−2)是信号长度为m−2m-2m−2的1阶差分矩阵,D2(m)D_{2}^{\left(m\right)}D2(m)是信号长度为mmm的2阶差分矩阵
(4) n阶差分矩阵
n阶差分矩阵Dn(m)D_{n}^{\left(m\right)}Dn(m)是一个(m−n)×m\left(m-n\right) \times m(m−n)×m的稀疏矩阵,可以通过n-1阶差分矩阵递归计算得到:
Dn(m)=D1(m−n+1)⋅Dn−1(m)D_{n}^{\left(m\right)}=D_{1}^{\left(m-n+1\right)}\cdot D_{n-1}^{\left(m\right)}Dn(m)=D1(m−n+1)⋅Dn−1(m)
其中D1(m−n+1)D_{1}^{\left(m-n+1\right)}D1(m−n+1)是信号长度为m−n+1m-n+1m−n+1的1阶差分矩阵,Dn−1(m)D_{n-1}^{\left(m\right)}Dn−1(m)是信号长度为mmm的n-1阶差分矩阵
(5) GEE代码实现
function build_diff_matrix(m, n){
if (n == 1){
var rowCount = ee.Number(m);
var identity_mat = ee.Array.identity(m);
var left = identity_mat.slice(0,0,rowCount.subtract(1));
var right = identity_mat.slice(0,1,rowCount);
var D = left.subtract(right);
}
else{
var D_prev = build_diff_matrix(m, n-1) //构建(n-1)阶差分矩阵
var D1 = build_diff_matrix(m-n+1, 1) //构建一阶差分矩阵
var D = D1.matrixMultiply(D_prev)
}
return D;
};
var m = 5; // 信号长度
var n = 3; // 差分阶数
var D3 = build_diff_matrix(m, n);
print(D3);
推导目标函数
1. 将目标函数转为矩阵形式
为了便于计算,目标函数可以表示为矩阵形式:
Q=∥Y−Z∥2+λ∥DZ∥2Q=\left \| Y-Z \right \| ^{2} +\lambda \left \| DZ \right \| ^{2} Q=∥Y−Z∥2+λ∥DZ∥2
其中:
- YYY是原始信号的列向量,
- ZZZ是平滑信号的列向量,
- DDD是差分矩阵,用于计算二阶差分。
2. 求目标函数对ZZZ的偏导
∂Q∂Z′=−2(Y−Z)+2λD′DZ\frac{\partial Q}{\partial Z' } =-2\left ( Y-Z \right ) +2\lambda D'DZ∂Z′∂Q=−2(Y−Z)+2λD′DZ
3. 令目标函数偏导等于0
因为目标函数为凹函数,因此当偏导数为0时,目标函数到达最小值,此时的 ZZZ的即为最能平衡平滑项和保真项的取值。因此目标函数的最小化可以通过求解以下线性方程组来实现:
(I+λDTD)Z=Y\left ( I+\lambda D^{T} D \right ) Z=Y(I+λDTD)Z=Y
求ZZZ的最小二乘解
通过求解线性方程组(I+λDTD)Z=Y\left ( I+\lambda D^{T} D \right ) Z=Y(I+λDTD)Z=Y可以得到平滑信号 ZZZ,GEE代码实现如下
var lambda = 10;
var m = imageCollection.size();
var n = 3;
var D = build_diff_matrix(m,n);
var DT = D.transpose();
var I = ee.Array.identity(m);
var I_lambda_DT_D = DT.multiply(lambda).matrixMultiply(D).add(I);
var Y = imageCollection.toArray();
I_lambda_DT_D = ee.Image(I_lambda_DT_D);
var Z = I_lambda_DT_D.matrixSolve(Y);
将ZZZ的解转为ee.ImageCollection
求解出的ZZZ是类型为array的ee.Image,如何将array图像转为ee.ImageCollection是关键
下面提供一种我自己实现的代码供大家参考
//将array图像转为ee.ImageCollection
var bandNames = imageCollection.first().bandNames();
var newBandNames = bandNames.map(function(band){return ee.String(band).cat("_fit")});
var index_list = ee.List.sequence(0, m.subtract(1));
var image_list = imageCollection.toList(m);
var out_list = index_list.map(function(i){
var image = image_list.get(i);
var Z_bands = Z.arraySlice(0, ee.Number(i).byte(), ee.Number(i).add(1).byte()).arrayProject([1]).arrayFlatten([newBandNames]);
return ee.Image(image).addBands(Z_bands);
});
可视化结果
//可视化
var geometry = /* color: #d63000 */ee.Geometry.Point([89.34334560586538, 32.19430206257235]);
print(ui.Chart.image.series(
out_col.select(["EVI", "EVI_fit","NDVI", "NDVI_fit"]), geometry, ee.Reducer.mean(), 500)
.setSeriesNames(["EVI", "EVI_fit","NDVI", "NDVI_fit"])
.setOptions({
title: 'whittakerFilter',
lineWidth: 1,
pointSize: 3,
}));
参考文献
[1] Eilers P H C. A perfect smoother[J]. Analytical chemistry, 2003, 75(14): 3631-3636.
[2] Gallagher N B. Whittaker Smoother[J]. white paper Eigenvector Research, Inc., www. eigenvector. com, 2018.
[3] Khanal N, Matin M A, Uddin K, et al. A comparison of three temporal smoothing algorithms to improve land cover classification: a case study from NEPAL[J]. Remote Sensing, 2020, 12(18): 2888.
完整代码
完整代码请移步公众号
---------------------------------------------------------------------------点这儿↓↓↓↓----------------------------------------------------------------------------------------------
更多推荐
所有评论(0)