手動リセットで線形的に増加するデータ


8

センサーの線形に増加する時系列データセットがあり、値の範囲は50から150です。単純な線形回帰アルゴリズムを実装して、そのようなデータに回帰直線を当てはめ、系列が到達する日付を予測しています120。

シリーズが上に移動すると、すべて正常に動作します。ただし、センサーが約110または115に達してリセットされる場合があります。このような場合、値は、たとえば50または60からやり直します。

これは、回帰線が下向きに動き始め、古い日付の予測を開始するため、回帰直線の問題に直面し始めるところです。以前にリセットされたデータのサブセットのみを検討する必要があると思います。ただし、このケースを考慮したアルゴリズムが利用できるかどうかを理解しようとしています。

私はデータサイエンスに不慣れです。先に進むためのヒントをいただければ幸いです。

編集:nfmcclureの提案を適用

提案を適用する前に

ここに画像の説明を入力してください

以下は、リセットが発生するデータセットを分割した後のスナップショットと、2つのセットの傾きです。

ここに画像の説明を入力してください

2つの勾配の平均を見つけ、その平均から線を引きます。

ここに画像の説明を入力してください

これでいい?


1
あなたは正しい考えを持っていますが、それをプロットするときは、シリーズがリセットごとに始まるところから始める必要があります。それがヒットする場所、たとえば120を推定するには、私の回答の最初の編集を参照してください。
nfmcclure 14

回答:


5

これは興味深い問題だと思ったので、サンプルデータセットと線形勾配推定器をRで作成しました。問題の解決に役立つことを願っています。私はいくつかの仮定を立てますが、最大のものは、データのいくつかのセグメントによって与えられる一定の勾配を推定したいということです。線形データのブロックを分離するもう1つの仮定は、自然な「リセット」は、連続する差を比較し、平均よりもX標準偏差が大きいものを見つけることによって見つかることです。(私は4つのSDを選択しましたが、これは変更できます)

これはデータのプロットで、それを生成するためのコードは一番下にあります。 サンプルデータ

まず、ブレークを見つけて、Y値の各セットを近似し、勾配を記録します。

# Find the differences between adjacent points
diffs = y_data[-1] - y_data[-length(y_data)]
# Find the break points (here I use 4 s.d.'s)
break_points = c(0,which(diffs < (mean(diffs) - 4*sd(diffs))),length(y_data))
# Create the lists of y-values
y_lists = sapply(1:(length(break_points)-1),function(x){
  y_data[(break_points[x]+1):(break_points[x+1])]
})
# Create the lists of x-values
x_lists = lapply(y_lists,function(x) 1:length(x))
#Find all the slopes for the lists of points
slopes = unlist(lapply(1:length(y_lists), function(x) lm(y_lists[[x]] ~ x_lists[[x]])$coefficients[2]))

勾配は次のとおりです:(3.309110、4.419178、3.292029、4.531126、3.675178、4.294389)

そして、平均をとって、予想される勾配(3.920168)を見つけることができます。


編集:シリーズが120に達する時期の予測

系列が120に達したときに予測を完了していなかったことに気付きました。勾配をmと推定し、時間tで値x(x <120)にリセットされた場合、到達するのにかかる時間を予測できます。いくつかの単純な代数による120。

ここに画像の説明を入力してください

ここで、tはリセット後120に達するまでの時間、xはリセット後の時間、mは推定勾配です。ここではユニットの主題に触れることはしませんが、それらを解決してすべてが理にかなっていることを確認することは良い習慣です。


編集:サンプルデータの作成

サンプルデータは、100ポイント、勾配4のランダムノイズで構成されます(できればこれを推定します)。y値がカットオフに達すると、50にリセットされます。カットオフは、リセットごとに115〜120の間でランダムに選択されます。以下は、データセットを作成するためのRコードです。

# Create Sample Data
set.seed(1001)
x_data = 1:100 # x-data
y_data = rep(0,length(x_data)) # Initialize y-data
y_data[1] = 50 
reset_level = sample(115:120,1) # Select initial cutoff
for (i in x_data[-1]){ # Loop through rest of x-data
  if(y_data[i-1]>reset_level){ # check if y-value is above cutoff
    y_data[i] = 50             # Reset if it is and
    reset_level = sample(115:120,1) # rechoose cutoff
  }else {
    y_data[i] = y_data[i-1] + 4 + (10*runif(1)-5) # Or just increment y with random noise
  }
}
plot(x_data,y_data) # Plot data

あなたの答えは問題に役立つと思います。ほんの一部の提案:データ生成コードは実際には提案されたソリューションの一部ではないため、データ生成コードを下部または外部Gistに移動します。そして、リセットを検出するために4つの標準偏差を使用しているという事実についてもう少し詳しく説明します。現在、これはコードで失われたコメントであり、ソリューションのコアです。
logc

良い考え。しましょう。
nfmcclure

こんにちはnfmcclure、私はあなたの提案を適用し、投稿を更新しました。コメントを入力してください。
ArunDhaJ 2014

3

問題は、リセットが線形モデルの一部ではないことです。リセット時にデータを異なるフラグメントにカットする必要があるため、各フラグメント内でリセットが発生せず、線形モデルを各フラグメントに適合させることができます。または、リセットが可能なより複雑なモデルを構築することもできます。この場合、リセットの発生時間をモデルに手動で入力するか、リセットの時間を、モデルをデータに適合させることによって決定されるモデルの自由パラメーターにする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.