前提・実現したいこと
時系列データをある列データ(thresyouldの50以上or未満)を基準にその他の変数を分割、その後スプライン補間によるデータの正規化を行いたいと思っています。
該当のソースコード
Matlab
1clear;clc 2 3threshold = [0,0,0,0,0,0,0,0,0,0,50,50,0,50,50,50,50,50,50,50,0,0,0,0,0,0,0,0,50,0]; 4var1 = [1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1]; 5 6 7%Grouping 8th2 = threshold >= 50; % 50以上は1, 50未満は0 9endidx = find(diff(th2)); % グループの境目を探す 10Group = [0, endidx, numel(th2)]; % 下準備 11Group = diff(Group); % 各グループの個数 12 13var1groups = mat2cell(var1, 1, Group); % var1の分割 14 15%Sprine 16for i = 1:3 %グルーピングのエラーにより実行されない 17 step{i} = Spline(var1groups,i); %step{n}として格納されている 18end 19 20%Spline function 21function [y2] = Spline(var_num,g_num) 22 x = 1:size(var_num{g_num},2); 23 y = var_num{g_num}; 24 25 head = x(1); 26 tail = x(1,size(var_num{g_num},2)); 27 28 %Cubic-Spline 29 c_spline = spline(x, y); 30 y2 = ppval(c_spline, linspace(head,tail,101)).'; 31end 32
発生している問題・エラー
データをシステムから取得する際にエラーの要因となる値が含まれているため、データの分割が正しく行われません。例えば、変数"threshould"の連続した50の値の中にある0の値や、連続した0の中にある50の値によって実際より多く分割されてしまいます。
これらエラー値を削除するのではなく、置換する良い方法はないでしょうか?
※実際のデータでは、エラーとなる値は連続して1〜5個以下で羅列される。
何か良い方法があればご教授のほどよろしくお願いします。
エラー() threshold = [0,0,0,0,0,0,0,0,0,0,50,50,0,50,50,50,50,50,50,50,0,0,0,0,0,0,0,0,50,0]; エラー結果 Group ____________________________________________________ 10 2 1 7 8 1 1 ->Groupが多く作られる 理想(50以上or未満の連続した値が交互に続く) threshold = [0,0,0,0,0,0,0,0,0,0,50,50,50,50,50,50,50,50,50,50,0,0,0,0,0,0,0,0,0,0]; Group ___________________ 10 10 10
実際のデータ
[11, -21, -32, -26, -13, -3, 4, 13, 27, 44, 55, 51, 34, 15, 3, 1, 5, 9, 5, -2, -5, 0, 14, 30, 41, 43, 37, 26, 16, 9, 5, 2, -3, -7, -9, -7, 7, 45, 121, 242, 407, 605, 813, 1010, 1183, 1324, 1430, 1510, 1575, 1637, 1709, 1791, 1876, 1948, 1994, 2012, 2015, 2011, 1999, 1971, 1923, 1858, 1781, 1693, 1593, 1472, 1325, 1155, 972, 790, 620, 465, 330, 218, 134, 80]
「エラー値を削除するのではなく、置換する」とはどういう意味ですか? 結局どのようにしたいんでしょうか?
ご指摘ありがとうございます。
まず、問題点は%Groupingpのところで起こっており、%Splineは問題なく実行されました。
何がしたいかと言うと、時系列データとしての”時間”の要素は除外したくないので、データの長さを維持したまま、外れ値をTrueとして認識させたいと考えています(発生している問題・エラーの項目最後のような結果を出力したいです)。
エラーかどうかはどうやって区別するんでしょうか?
「※実際のデータでは、エラーとなる値は連続して1〜5個以下」とありますが、例のようにエラーなしの場合でも長さが10個しか無いのであれば、連続した値の長さでエラーかどうか区別することは不可能だと思いますが、実際はもっと長いのでしょうか?
50を閾値設定し、50以下で出ていた場合にはエラーと判断します。なので、50以上の時はほとんどエラーはありません。実際には、約40・nグループのデータになります。エラーは2,3ほど出てくることが多いです。
参考までに実際のデータの一部を上に載せておきます。50以下の連続した値で55と51のエラーが出ています。
「50以下のデータは無条件でエラーとする。50をやや超えるデータでも、エラーとすべき場合がある」ということでしょうか。
50以下を0に設定したいのですが、その中で出てくる50以上の値がエラーになります。
[0,0,0,0,0,0,0,45, 121, 242, 407,・・・] としたいのですが、
[0,0,50,51,0,0,0,45, 121, 242, 407,・・・] のように0の中にある50以上の値をエラーとしています。
50以上のデータではエラーは出ないと仮定し(この場合は0に近いような外れ値)、閾値50以下で出てくるエラーの対処を考えています。
あなたの回答
tips
プレビュー