質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Q&A

0回答

567閲覧

Matlab 時系列データの分割とエラー要素の排除方法

HK-

総合スコア4

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

0グッド

0クリップ

投稿2020/08/03 06:32

編集2020/08/03 10:06

前提・実現したいこと

時系列データをある列データ(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]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki23

2020/08/03 09:27

「エラー値を削除するのではなく、置換する」とはどういう意味ですか? 結局どのようにしたいんでしょうか?
HK-

2020/08/03 09:40

ご指摘ありがとうございます。 まず、問題点は%Groupingpのところで起こっており、%Splineは問題なく実行されました。 何がしたいかと言うと、時系列データとしての”時間”の要素は除外したくないので、データの長さを維持したまま、外れ値をTrueとして認識させたいと考えています(発生している問題・エラーの項目最後のような結果を出力したいです)。
yuki23

2020/08/03 09:49

エラーかどうかはどうやって区別するんでしょうか? 「※実際のデータでは、エラーとなる値は連続して1〜5個以下」とありますが、例のようにエラーなしの場合でも長さが10個しか無いのであれば、連続した値の長さでエラーかどうか区別することは不可能だと思いますが、実際はもっと長いのでしょうか?
HK-

2020/08/03 10:10

50を閾値設定し、50以下で出ていた場合にはエラーと判断します。なので、50以上の時はほとんどエラーはありません。実際には、約40・nグループのデータになります。エラーは2,3ほど出てくることが多いです。 参考までに実際のデータの一部を上に載せておきます。50以下の連続した値で55と51のエラーが出ています。
Bearded-Ockham

2020/08/03 13:29

「50以下のデータは無条件でエラーとする。50をやや超えるデータでも、エラーとすべき場合がある」ということでしょうか。
HK-

2020/08/03 13:40

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以上の値をエラーとしています。
HK-

2020/08/03 13:45

50以上のデータではエラーは出ないと仮定し(この場合は0に近いような外れ値)、閾値50以下で出てくるエラーの対処を考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問