理乃美

ソフトとハードと論理の覚え書き

周期パターンの変化検知-その6

2018-07-25 02:12:09 | AI

周期パターンに対して窓幅を2倍にとることで周期パターンを定常状態として捕らえると共に周期みだれを変化度として検知する実験をした。窓幅を大きくすれば周期パターンの変化検知ができるといえるだろうか。

例えば心拍数、平常状態であっても決して一定ではなく徐々に変化するものである。周期パターンの周期変化に対してはどう振舞うか実験してみる。

まずは、周期60が途中から周期70にしたケースを実験してみる。このように、周期が伸びた時点で変化度が上昇したのち、そのままずっと高い値をキープしている。望んでいるのは、周期が伸びた時点では変化度が上がっても、それから先は周期70を定常状態として認識して変化度が下がって欲しいところである。

 

それでは、周期60を周期63にした場合はどうであろうか。この場合、周期が伸びたタイミングで変化度の立ち上がりがあったのち、変化度は下がっている。とはいえ、それなりの値をとっている。

「周期パターンの変化検知-その3」の図に示されたように、周期と窓幅の関係はかなりクリティカルである。窓幅を適当に大きくとっておけば、周期パターンを認識してその変化を検知してくれる、とはいかないことが示された。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

周期パターンの変化検知-その5

2018-07-24 02:04:08 | AI

前回は、1箇所で周期が短くなったケースを調べた。逆に、周期が長くなったケースを調べてみる。

周期60に対して、一箇所だけ周期が +23 長いケースを実験してみる。次のパルスがあるべきあたりから徐々に変化度が増加しており、やはり変化検知に成功している。

地の部分の乱れはないように周期60に対して、一箇所だけ周期が +20 長いケースでも以下のとおり。次のパルスがあるべきあたりから徐々に変化度が増加しており、やはり変化検知に成功している。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

周期パターンの変化検知-その4

2018-07-23 01:08:13 | AI

前回の実験で、周期60の繰り返しパターンについて窓幅120あたりを取ると、定常状態として認識されることがわかった。こんどは、そこで乱れを入れたときに変化検知できるだろうか。実験してみよう。

まずは、途中の1箇所だけ周期が短いパターンをみてみる。周期60に対して23ほど短い。変化をつけた部分の拡大と全体を示す。早期にパルスが出た付近から変化度が立ち上がり、窓幅のおよそ1.5倍 の間、変化度に周期乱れが現れている。

地の部分の周期が揃うように、周期60に対して20ほど短くしたケースでは以下のとおり。変化度のピークは小さくなったものの、早期にパルスが出た付近から変化度が立ち上がり、窓幅のおよそ1.5倍 の間、変化度に周期乱れが現れている。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

周期パターンの変化検知-その3

2018-07-20 00:24:09 | AI

周期的な現象全体を捉えて変化検知をするには、どれくらい窓幅などを広げると良いだろうか。

適当に窓幅Mを変えて試しても傾向が良く分からないので網羅的に調べてみた。ある窓幅を使って調べたときの変化度の最大値を見る。

定常状態にある周期現象の入力データの全体で変化度の最大値が小さいということは、周期現象を定常状態として認識できたということを意味するはずである。

実験結果は以下の図のとおり。周期60に対して、窓幅は2倍の 120でやっと定常状態として捉えられている。しかし、窓幅が少し増えると、またぞろ定常状態と認識できなくなってしまう。さらに窓幅を広げる実験もあるだろうが、窓幅を広げ履歴行列、テスト行列の列数も比例して大きくしている今回の条件では、計算コストの増加を考慮してやめておく。

<pre>

import numpy as np
import matplotlib.pyplot as plt
import math

def normV(v):
return v / np.linalg.norm(v,2)

pat_len = 600
pat = np.empty(pat_len)
for i in range (10):
for p in range (60):
pat[60*i+p] = (math.exp(-p/4) +0.02)* math.sin(math.pi * p / 5)

plt.plot(pat[pat_len-200:pat_len-100])

plt.plot(pat[:])

a_max = np.zeros(160)

for M in range(60,61):
    n = M // 2
    k = M // 2
    L = k // 2
    r = 3
    m = 2
    a = np.zeros(pat_len)
    for i in range (pat_len-L-k-M):
       X = np.empty((M,0))
       for j in range(n):
           X = np.hstack((X, np.array([normV(pat[i+j:i+j+M])]).T) )
           U,Sx,Vx = np.linalg.svd(X, full_matrices=True)
           Z = np.empty((M,0))
       for j in range(k):
           Z = np.hstack((Z, np.array([normV(pat[i+L+j:i+L+j+M])]).T) )
           Q,Sz,Vz = np.linalg.svd(Z, full_matrices=True)
           UQ = np.dot(U.T[0:r,:], Q.T[0:m,:].T)
           a[i+L+k+M-2]=1-np.linalg.norm(UQ,2)
    a_max[M] = 0.0
    for i in range (100,pat_len):
        if (a[i] > a_max[M]) :
            a_max[M] = a[i]


print ("M = ", M)
plt.plot(a[pat_len-200:pat_len-100])

plt.plot(a_max[0:160])

</pre>

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

周期パターンの変化検知-その2

2018-07-19 00:03:02 | AI

窓幅を大きくすることで、周期パターンそのものを見て変化検知する実験を続ける。

まずは定常状態に対しての変化度を M を変えながら調べる。ターゲットのデータは以下のようにして生成しているこのデータ。

<pre>

pat_len = 600
pat = np.empty(pat_len)
for i in range (10):
    for p in range (60):
        pat[60*i+p] = (math.exp(-p/4) +0.02)* math.sin(math.pi * p / 5)

</pre>

このデータに対して、M = 40, 50, 110 で行った結果が以下のとおり。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする