あなたの問題を解決するかもしれない「時間ベースのボックスカー」機能について聞いたことがあります。「ウィンドウサイズ」の時間ベースのボックスカー合計Δ トン 時間で定義されます t 間のすべての値の合計になる トン- Δ T そして t。これは、あなたが望むかもしれないし、望まないかもしれない不連続性の影響を受けます。古い値に重み付けを下げたい場合は、時間ベースのウィンドウ内で単純または指数移動平均を使用できます。
編集:
私はこの質問を次のように解釈します。いくつかのイベントが時々発生するとします t私
大きさで バツ私。(例えば、バツ私 支払われた請求額かもしれません。)関数を探します f(t )の大きさの合計を推定します
バツ私 「近く」の時間 t。OPによって提示された例の1つとして、f(t )
およそ「電気代をどれくらい払ったか」を表す t。
この問題に似ているのは、時間あたりの「平均」値を推定することです。 t。例:回帰、補間(通常、ノイズの多いデータには適用されません)、およびフィルタリング。これら3つの問題のうちの1つだけを勉強することで、生涯を過ごすことができます。
本質的に統計的な、一見無関係な問題が密度推定です。ここでの目標は、マグニチュードの観測を前提としてy私
あるプロセスによって生成され、そのプロセスが重大なイベントを生成する確率を概算する y。密度推定の1つの方法は、カーネル関数を使用することです。私の提案は、この問題に対してカーネルアプローチを悪用することです。
しましょう w (t ) そのような機能であること W (T )≥ 0 すべてのために t、 w (0 )= 1
(通常のカーネルはすべてこのプロパティを共有するわけではありません)、そして w』(T )≤ 0。しましょうh
可能な帯域幅、各データ点がありどのくらいの影響力を制御し、。与えられたデータt私、バツ私、合計推定値を
f(t )=Σi = 1んバツ私w ( | t−t私| / h)。
関数のいくつかの可能な値
w (t ) 以下の通り:
- 均一な(または「ボックスカー」)カーネル: w (t )= 1 ために T ≤ 1 そして 0 さもないと;
- 三角カーネル: W (T )= 最大(0 、1 - T );
- 二次カーネル: W (T )= 最大(0 、1 -t2);
- tricubeカーネル: w (t )= max (0 、(1 −t2)3);
- ガウスカーネル: w (t )= exp( −t2/ 2);
私はこれらのカーネルを呼び出しますが、それらはあちこちに一定の要因によってずれています。カーネルの包括的なリストも参照してください。
Matlabのコード例:
%%kernels
ker0 = @(t)(max(0,ceil(1-t))); %uniform
ker1 = @(t)(max(0,1-t)); %triangular
ker2 = @(t)(max(0,1-t.^2)); %quadratic
ker3 = @(t)(max(0,(1-t.^2).^3)); %tricube
ker4 = @(t)(exp(-0.5 * t.^2)); %Gaussian
%%compute f(t) given x_i,t_i,kernel,h
ff = @(x_i,t_i,t,kerf,h)(sum(x_i .* kerf(abs(t - t_i) / h)));
%%some sample data: irregular electric bills
sdata = [
datenum(2009,12,30),141.73;...
datenum(2010,01,25),100.45;...
datenum(2010,02,23),98.34;...
datenum(2010,03,30),83.92;...
datenum(2010,05,01),56.21;... %late this month;
datenum(2010,05,22),47.33;...
datenum(2010,06,14),62.84;...
datenum(2010,07,30),83.34;...
datenum(2010,09,10),93.34;... %really late this month
datenum(2010,09,22),78.34;...
datenum(2010,10,22),93.25;...
datenum(2010,11,14),83.39;... %early this month;
datenum(2010,12,30),133.82];
%%some irregular observation times at which to sample the filtered version;
t_obs = sort(datenum(2009,12,01) + 400 * rand(1,400));
t_i = sdata(:,1);x_i = sdata(:,2);
%%compute f(t) for each of the kernel functions;
h = 60; %bandwidth of 60 days;
fx0 = arrayfun(@(t)(ff(x_i,t_i,t,ker0,h)),t_obs);
fx1 = arrayfun(@(t)(ff(x_i,t_i,t,ker1,h)),t_obs);
fx2 = arrayfun(@(t)(ff(x_i,t_i,t,ker2,h)),t_obs);
fx3 = arrayfun(@(t)(ff(x_i,t_i,t,ker3,h)),t_obs);
fx4 = arrayfun(@(t)(ff(x_i,t_i,t,ker4,0.5*h)),t_obs); %!!use smaller bandwidth
%%plot them;
lhand = plot(t_i,x_i,'--rs',t_obs,fx0,'m-+',t_obs,fx1,'b-+',t_obs,fx2,'k-+',...
t_obs,fx3,'g-+',t_obs,fx4,'c-+');
set(lhand(1),'MarkerSize',12);
set(lhand(2:end),'MarkerSize',4);
datetick(gca());
legend(lhand,{'data','uniform','triangular','quadratic','tricube','gaussian'});
プロットは、いくつかのサンプルの電気料金データでのいくつかのカーネルの使用を示しています。
均一カーネルは、OPが回避しようとしている「確率的ショック」の影響を受けることに注意してください。tricubeカーネルとGaussianカーネルは、より滑らかな近似を提供します。このアプローチが許容できる場合は、カーネルと帯域幅を選択するだけで済みます(一般に、これは難しい問題ですが、ドメインに関する知識と、コードテストと再コードのループがあれば、それほど難しくはありません)。