(RPM)スカイライン時系列異常決意アルゴリズム

オリジナルリンク:https://jiroujuan.wordpress.com/2013/10/09/skyline-anomalous-detect-algorithms/

 

内部スカイラインは、このような問題を解決するために、9つの事前に定義されたアルゴリズムを提供しています:

入力:なTimeSeries 
出力:異常かどうか

3シグマ

異常なアイデアの非常に直接的な決意は、全体の平均はあまり逸脱した時に見て、最新の3データポイント(tail_avg法)の平均値と全体の配列比較を取ることです。どのように標準偏差は距離の平均値平均をオフセットするための要素の集合を表し、それは比較するのが最も簡単ですので、「あまり」カウントします。ここでは、に来る3シグマ理論:

統計、  68-95-99.7ルールとしても知られる、  三シグマ規則  または  経験則では、ほぼすべての値が3内にあることを述べ  た標準偏差  の  平均値  で  正規分布

値の約68.27パーセント、平均値の1つの標準偏差内にあります。同様に、値の約95.45パーセントは、平均値の2つの標準偏差内にあります。ほぼすべて(99.73パーセント)の値は、平均の3つの標準偏差内にあります。

正規分布(正規分布)、およびデータの99.73パーセントは、3つのσ(標準偏差標準偏差)の範囲から逸脱する平均である:これは単にです。いくつかのデータポイントの距離がこの範囲以上を意味する場合、それは異常と考えられています。スカイラインは、ほとんどの場合、この理論に基づいている7初期アルゴリズムを構築しました:

stddev_from_average

def stddev_from_average(timeseries):
    """
    A timeseries is anomalous if the absolute value of the average of the latest
    three datapoint minus the moving average is greater than one standard
    deviation of the average. This does not exponentially weight the MA and so
    is better for detecting anomalies with respect to the entire series.
    """
    series = pandas.Series([x[1] for x in timeseries])
    mean = series.mean()
    stdDev = series.std()
    t = tail_avg(timeseries)

    return abs(t - mean) > 3 * stdDev

次のようなアルゴリズムは次のようになります。

  1. 需要は時系列を意味します
  2. 標準偏差の時系列を求めて
  3. Tail_avg距離平均シーク、標準偏差は3回異常よりも大きいです。

書かれたコメントは、移動平均を計算しませんが、コードは直接平均値を算出し、不和を比較し、移動平均、とは何の関係も。

アルゴリズムの特性を効果的にケースを遮蔽することができる「次の点に大きな外れ値の点突然変異が、正常に戻った」である、すなわち遮蔽一点バリ:これは3つのエンドポイント(の平均値を使用するため効果的)変異を緩和し、全体の配列比較は、(外れ値である拡大を意味する)、正常な判断につながります。必要性はシーンデータの面で「グリッチ」を無視するために、その後のEWMA / mean_subtraction_cumulationより適切なアルゴリズムよりアルゴリズムは、(当然のことながら、これらのアルゴリズムは、代わりにtail_avg最後のデータポイントを使用するのでは、変換することができます)。

first_hour_average

def first_hour_average(timeseries):
    """
    Calcuate the simple average over one hour, FULL_DURATION seconds ago.
    A timeseries is anomalous if the average of the last three datapoints
    are outside of three standard deviations of this value.
    """
    last_hour_threshold = time() - (FULL_DURATION - 3600)
    series = pandas.Series([x[1] for x in timeseries if x[0] < last_hour_threshold])
    mean = (series).mean()
    stdDev = (series).std()
    t = tail_avg(timeseries)

    return abs(t - mean) > 3 * stdDev

アルゴリズムはほぼ同じであり、その差は、比較の対象であることは上記と  1時間の開始最後FULL_DURATION期間 データは、その後tail_avgと比較され、このデータポイントの平均及び標準偏差を得ました。場合FULL_DURATION 1時間未満(86,400)、同じアルゴリズムおよびアルゴリズム。均一なインクリメント/デクリメントの長い期間にわたってこれらの指標のために、アルゴリズムは偽であってもよいです。

stddev_from_moving_average

def stddev_from_moving_average(timeseries):
    """
    A timeseries is anomalous if the absolute value of the average of the latest
    three datapoint minus the moving average is greater than one standard
    deviation of the moving average. This is better for finding anomalies with
    respect to the short term trends.
    """
    series = pandas.Series([x[1] for x in timeseries])
    expAverage = pandas.stats.moments.ewma(series, com=50)
    stdDev = pandas.stats.moments.ewmstd(series, com=50)

    return abs(series.iget(-1) - expAverage.iget(-1)) > 3 * stdDev.iget(-1)

このアルゴリズムでは、データポイントは、(指数加重移動平均)/ STDの平均偏差最後EWMAで得られ、その後、最近のデータポイントおよび3シグマ理論と比較します。

移動平均

サブセット時系列と長さ(例えば、N日)、のデータポイントI所定の移動平均N-日 I =(Iを含む)の前に、平均Nの日。絶えず移動長さN「ウィンドウ」と平均値を計算するには、移動平均曲線を得られます。

移動平均は、多くの場合、排除するために使用され、短期的なデータのノイズを長期的な傾向を示したり、既存のデータに基づいて将来のデータを予測します

単純移動平均

これは、データポイントの算術平均(同じ量の各データポイント)内の「ウィンドウ」として、最も単純移動平均です。

SMA(I)= P(I)+ P(I-1)+ ... + P(I-N + 1)] / N

I + 1 SMAで計算した場合、新しい値が、加算される左の廃棄された値の「ウィンドウ」と再帰式を与えました:

SMA(I)= SMA(I-1)+ P(I)/ N - P(I-N + 1)/ N

達成するためにもSMAの前のレコードと同じくらい長い非常に簡単で、データポイント(最初の数はSMAではありません)に低下したことを。パンダ可能なpandas.stats.moments.rolling_meanは、 SMAを算出しました。

なぜなら、過去のデータのSMAとデータの重みを提示が同じであるので、比較的実際のデータは、長期的な傾向を観察するのにより適し、予測に適した、ではない遅らせるために存在しています。

指数移動平均

時にはまた、指数加重移動平均、SMAとして知られており、それは二つの主な違いがあります。

  1. N-データポイントのみ計算SMA「窓」内の、計算に関与するすべての以前のEWMAがポイントです。
  2. 平均のEWMA計算は、最新のデータポイントは、より高い量が時間とともに指数関数的に減少有する場合、各データポイントの重い重量は同じではありません。

EWMAの漸化式は次のようになります。

EWMA(1)P(= 1 )//を時々前にいくつかの値の平均をとります。より重要なαは小さくEWMA(1)の値です。
EWMAは、(i)=α*のP (I)+(1-α)* EWMA(I - 1)//αは0~1の間の小数であり、係数を平滑化と呼ばれます。

あなたはEWMAメンテナンス限り続くことができる、より簡単にSMAよりも達成見ることができます。

重みα、α(1-α)、α(1-α)^ 2 ... ..、α(1-α)^ nは、順次減少指数続い、前方のDataPoint Iから、広げ見出されます重み及びリミットは1に等しいです。

EWMA平滑化係数が決定さ  適時 かつ  安定性をαは大きい適時性が良く、最新のデータの状態を反映して、[アルファ]より小さく、よりスムーズで瞬時変動が長期的なトレンドを反映し、吸収することができます。

それは広く(コンピュータ技術の)シナリオ「既存のデータに基づいて将来を予測する時系列」で使用されているので、EWMAの適時性は、典型的には、TCPデータの次の既存のRTT RTTの計算から、すなわち、RTTを推定する使用しますタイムアウトを決定します。

EWMAは、すべての参加のDataPointで算出し、それはまた、同様のSMA「N日EWMA」という概念を有しているが、この時間は、αによって決まるNれる:α= 2 /(N + 1)は、 この式の起源について見るここ

戻るスカイラインは、ここEWMAデータポイントとの将来を予測することはありませんが、同様のアルゴリズム計算した平均とSTDDEV全体の配列の前に、体重(EWMA)の右の時間を加算して計算されている場合にのみ結果の影響に関するより最近のデータ大きい、すなわち、決意基準は時間の最新の一定期間ではなく配列全体よりも、最後のデータポイントと比較します。したがって、それは利点があります:

  1. 別の(高すぎない変異)を検出することができ、全体の平均値と標準偏差に最初の例外が押し上げられるので、他のアルゴリズムは、無視される可能性がある異常な異常後の短い時間に発生しました
  2. それは突然変異(ローレベル)の前に、基準点の多いので、他のアルゴリズムよりも高速ではなく、全体的なレベルよりも(例外があるかもしれない、異常に反応するように、または引か何倍も高い統計データが存在しました)

欠点は、

  1. 異常検出機能の進行性ではなく、突然のタイプの弱いです
  2. 一定期間後に正常に異常と判定することができます

mean_subtraction_cumulation

def mean_subtraction_cumulation(timeseries):
    """
    A timeseries is anomalous if the value of the next datapoint in the
    series is farther than a standard deviation out in cumulative terms
    after subtracting the mean from each data point.
    """

    series = pandas.Series([x[1] if x[1] else 0 for x in timeseries])
    series = series - series[0:len(series) - 1].mean()
    stdDev = series[0:len(series) - 1].std()
    expAverage = pandas.stats.moments.ewma(series, com=15)

    return abs(series.iget(-1)) > 3 * stdDev

次のようなアルゴリズムは次のようになります。

  1. 負のフルシーケンス(仮にすべての名前付き)最後の値(最後のデータポイント)、残りの配列(仮に残り、0..length-2と呼ばれる)の平均を見つけます。
  2. 平均のシーケンス休止残りの各要素を減算し、次に標準偏差を求めます。
  3. 最後のデータポイントからの平均、すなわちABS(最後のデータポイント - 残りの平均)、残りを追求します。
  4. 距離はSTD残りの系列を超えているかどうかを決定する。Devの3回。

簡単に言えば、それは最後のデータポイントと残りの配列比較を使用することで、比較プロセスはまだ3シグマに従います。このアルゴリズムは、非常に疑わしい二つの場所があります。

  1. ..求める第1および残りの配列のSTD devのマイナス、平均シーク時間は、このステップは不要であり、結果には影響しませんでした。
  2. tail_avgの使用は非常に科学的であったが、このアルゴリズムはさらに、唯一の裁判官最後のデータポイントそうしないとデータを失うことになる、唯一のデータポイントが追加されたものを持つことができる2つの分析間隔を必要とする、異常です。この問題の議論は、参照この記事を最後。

そしてstddev_from_average、確率が異常に決定されているよりもはるかに大きい「グリッチ」と提案したアルゴリズム。

最小二乗

def least_squares(timeseries):
    """
    A timeseries is anomalous if the average of the last three datapoints
    on a projected least squares model is greater than three sigma.
    """

    x = np.array([t[0] for t in timeseries])
    y = np.array([t[1] for t in timeseries])
    A = np.vstack([x, np.ones(len(x))]).T
    results = np.linalg.lstsq(A, y)
    residual = results[1]
    m, c = np.linalg.lstsq(A, y)[0]
    errors = []
    for i, value in enumerate(y):
    	projected = m * x[i] + c
    	error = value - projected
    	errors.append(error)

    if len(errors) < 3:
    	return False

    std_dev = scipy.std(errors)
    t = (errors[-1] + errors[-2] + errors[-3]) / 3

    return abs(t) > std_dev * 3 and round(std_dev) != 0 and round(t) != 0
  1. 最小二乗法による線形フィッティング前データポイントの値を取得するステップと
  2. 新しいシーケンスエラー値とフィッティングとの間の差の実際の値を形成します。
  3. tail_avg> 3倍STDDEVのシーケンスエラーかどうかを決定、シーケンスを見つけるSTDDEV

最小二乗法、より適用直線メトリクスのアルゴリズムのため。アルゴリズムはまた、問題がある場合、最終的な決定、距離平均誤差配列をtail_avgが、直接事実3シグマを満たしていない、異常決意範囲を減少tail_avgの値を、使用しません。

最小二乗法

点列(XI、YI)のために、それに取り付けられた直線と、直線Y = aXを+ Bの場合、実際の値Yi及びあてはめ値となるように最小李の二乗誤差、最適直線A。

概要

サンプルを実行すると、一般的なシーケンスは、そのオブジェクトの配置を除いて、最近のデータポイントの数と一致している:私たちは、上記のアルゴリズムが同様のアイデアです見ることができます

  • stddev_from_average
    tail_avg ---全体のシーケンス
  • first_hour_average
    tail_avg ---- FULL_DURATION開始時間
  • stddev_from_moving_average
    最後のDataPoint ---- EW EWのstd devの平均と全体のシーケンス
  • mean_subtraction_cumulation
    最後のデータポイント---剩余序列
  • least_squares
    最後のデータポイント間の差のシーケンスを---実際のデータと直線を当てはめます

グラブス

def grubbs(timeseries):
    """
    A timeseries is anomalous if the Z score is greater than the Grubb's score.
    """

    series = scipy.array([x[1] for x in timeseries])
    stdDev = scipy.std(series)
    mean = np.mean(series)
    tail_average = tail_avg(timeseries)
    z_score = (tail_average - mean) / stdDev
    len_series = len(series)
    threshold = scipy.stats.t.isf(.05 / (2 * len_series) , len_series - 2)
    threshold_squared = threshold * threshold
    grubbs_score = ((len_series - 1) / np.sqrt(len_series)) * np.sqrt(threshold_squared / (len_series - 2 + threshold_squared))

    return z_score > grubbs_score

グラブス検定は、いわゆる外れ値から外れ値サンプルを同定する方法であり、試料は、平均から離れすぎてデータを参照、これらは極端な場合には、通常のデータであってもよく、測定プロセスデータの誤差があってもよいです。全体的に必要な使用グラブス検定は、正規分布しています。

グラブス試験手順は次のとおりです。

  1. 小規模から大規模までのサンプル。
  2. サンプル平均とstd.devを探しています。
  3. 分間/最大ギャップを計算し、平均、より大きな値は疑問です。
  4. ;それが閾値を超える場合、次いで外れ値を有することグラブス、疑わしい値Zスコア(標準スコア)を見つける
    α(より厳密に小さい)の検出レベル、サンプル数:グラブス閾値は、2つの値によって決定されたルックアップテーブルであってもよいですn個
  5. 外れ値を除外し、残りの手順は、1-5のループシーケンスを実行します。

異常決意をここで必要とされているので、それだけはtail_avgの外れ値かどうかを判断する必要があります。コードはまた、プロセスしきい値グラブスを求めて、読み取ることができません。

Zスコア(標準スコア)

一般に、異なるコレクションからのデータを整列させるために使用される個々の「レベル平均偏差(STDのDEV式)」に偏差の相対的な程度の平均発現からの平均、標準偏差単位を設定するために、1つの個体からオフセット基準点、。

histogram_bins

def histogram_bins(timeseries):
    """
    A timeseries is anomalous if the average of the last three datapoints falls
    into a histogram bin with less than 20 other datapoints (you'll need to tweak
    that number depending on your data)

    Returns: the size of the bin which contains the tail_avg. Smaller bin size
    means more anomalous.
    """

    series = scipy.array([x[1] for x in timeseries])
    t = tail_avg(timeseries)
    h = np.histogram(series, bins=15)
    bins = h[1]
    for index, bin_size in enumerate(h[0]):
        if bin_size <= 20:
            # Is it in the first bin?
            if index == 0:
                if t <= bins[0]:
                    return True
            # Is it in the current bin?
            elif t >= bins[index] and t < bins[index + 1]:
                    return True

    return False

パーティtail_avg内の線形要素がそうであれば、異常= <20であり、ここで、上記のアルゴリズムは、それが最初の15の等しい時系列幅ヒストグラムに分割し、その後決定され、異なっています。

数ヒストグラムの要素の数がそれ以外の場合は、データ時間の少量の異常に簡単であり、それらのメトリックが調整を必要に応じて決定されます。

ks_test

def ks_test(timeseries):
    """
    A timeseries is anomalous if 2 sample Kolmogorov-Smirnov test indicates
    that data distribution for last 10 minutes is different from last hour.
    It produces false positives on non-stationary series so Augmented
    Dickey-Fuller test applied to check for stationarity.
    """

    hour_ago = time() - 3600
    ten_minutes_ago = time() - 600
    reference = scipy.array([x[1] for x in timeseries if x[0] >= hour_ago and x[0] < ten_minutes_ago])
    probe = scipy.array([x[1] for x in timeseries if x[0] >= ten_minutes_ago])

    if reference.size < 20 or probe.size < 20:
        return False

    ks_d,ks_p_value = scipy.stats.ks_2samp(reference, probe)

    if ks_p_value < 0.05 and ks_d > 0.5:
        adf = sm.tsa.stattools.adfuller(reference, 10)
        if  adf[1] < 0.05:
            return True

    return False

コルモゴロフ - スミルノフ検定は、差が大きいか否かを判断した後、二つのサンプルにより、50分前、この以内> 10分(参考) - 最近10分(プローブ)、1時間前:このアルゴリズムは、2つのセクションに分割時系列、比較的高度です。差が大きい場合は、平滑である場合、このrefercence増補ディッキーフラーテスト(ADFテスト)のサンプルは、それらの安定性を表示する、状態に大きな差を示す(定常状態の10(50分)別の分)の変異は、異常とみなさ配列。

あまりにも学術について2つのテスト、そして私はただ表面的な理解よりもです。

コルモゴロフ - スミルノフ検定

KS-テスト2つの典型的なアプリケーションがあります。

  1. 試料を分析することは、通常/インデックス/均一/ポアソン分布として知られている理論的な分布を満たします。
  2. 二つの試料の背後にある全体的な判断は同じ分布を有していてもよいかどうか、かどうか二つのサンプル間では、同じ母集団から来る、または2つのサンプルで有意差があるかどうか。

テストは2つの値を返す:D、p値は、それらが特定の意味を理解していない、スカイライン場合、p値<0.05 && D> 0.5で、これは有意な差であると考えられます。

拡張ディッキーフラーテスト(ADFテスト)

p値が与えられた有意水準のリターン未満である時系列の定常性検出、のために、その配列が静止している、閾値はスカイライン0.05取られます。

median_absolute_deviation

def median_absolute_deviation(timeseries):
    """
    A timeseries is anomalous if the deviation of its latest datapoint with
    respect to the median is X times larger than the median of deviations.
    """

    series = pandas.Series([x[1] for x in timeseries])
    median = series.median()
    demedianed = np.abs(series - median)
    median_deviation = demedianed.median()

    # The test statistic is infinite when the median is zero,
    # so it becomes super sensitive. We play it safe and skip when this happens.
    if median_deviation == 0:
        return False

    test_statistic = demedianed.iget(-1) / median_deviation

    # Completely arbitary...triggers if the median deviation is
    # 6 times bigger than the median
    if test_statistic > 6:
        return True

アルゴリズムは、平均/標準偏差ではなく、偏差の中央値/中央値(MAD)に基づくものではありません。

中央値

ほとんどの場合、我々は、(平均)のセットの平均値を表現することを意味するが、いくつかの場合には非常に大きい、または小さい外れ値の少数の存在が推定され、その結果、全体平均を押し上げ又は(スキュー)プルダウン不正確な。このとき、代わりに平均値のメジアン(中央値)で記述することができます。単純なシークのメジアン方法は、設定総数は両方の中間の平均値が偶数である場合には、中間位置である順序集合します。

偏差の中央値(MAD)

我々はこのインデックスに必要な平均値、中央値など、および発現させるために標準偏差と同様であるコンパクトなデータ/分散度平均値の平均から外れ MADです。より堅牢な外れ値の結果、少量の影響を避けるために、 - MAD名前が示す、時間偏差= ABS(中央値自己)で、偏差の中央値です。

今、このアルゴリズムはよく理解されている:MADはMAD> 6 MADかどうかを確認するために、最後のデータポイントから、配列を決定しました。同様に、ここでの最後の判断とデータポイントは、前述の問題が依然として存在し、第二に、6は「マジックナンバー」、あなたはそのメトリックデータの特性に応じて調整する必要があります。

このアルゴリズムの利点は、異常に敏感である:標準偏差アルゴリズムに基づいて、メトリック突然時間の期間にわたって非常に高くなり、維持仮定標準偏差の外れ値計算の数が少ない影響力のあるのため、後に短時間で正常と判断異常表示されること;異常なデータポイントが少なく、直接無視した場合やMAD計算、時間のように異常な感覚が長くなります。

すなわち、データが少ない、非常に貧しい人々のより大きなギャップ範囲にわたって分布されメディアンしかし、複数のデータセットからなるクラスタのアルゴリズムの制限として、それが誤判断することは容易です。:そのような次の図のように赤線で示すように、中央値は、58であるときに、2つの曲線は、範囲内で前後に振動します。9 MADを正確にデータセットを記述することはできません明らかに、計算された、最後のノード偏差= 55は、その後、誤解しました。
選挙_008

参考資料

様々なWikiの
さまざまなAPIドキュメントの
前任者の概要:[Etsyの]フィルタリングアルゴリズムのケールシステムのスカイライン
移動平均は:?どのような彼らは
コルモゴロフ-スミルノフ検定
グラブス試験方法
中央絶対偏差
「ヘッドファースト統計」

おすすめ

転載: www.cnblogs.com/feiquan/p/11670320.html