(Sample Entropyの日本語ソースがあまりに少ないので最初に断っておくと、ただの学生の遊びブログなのであまりあてにしないでいただければと。)
(むしろ詳しい人いたら教えてください。)
時系列データのエントロピーを示すSample Entropyという指標に出会ったので遊んでみる。長さNの時系列データ U={u(1), u(2), ... , u(N)}と、定数m(通常m=2)とした時、Sample Entropyは次のようにして求める。
(1) x(i)={u(i), ... , u(i+m-1)}とし、X={x(1), x(2), ... , x(N-m+1)}を得る。
(2) Ci(r)を求める。Ci(r)=(d[x(i), x(j)<r] となるjの数(i≠j))/(N-m+1) (ただしd[a, b]はa, bのChebyshev distance)(r=0.2*データの標準偏差)
(3) Φm(r)を求める。Φm(r)=Σ[i=1, N-m]Ci(r)/(N-m)
(4) 同様にΦm+1(r)を求める。
(5) SampEn=ln[Φm(r)/Φm+1(r)]
現時点で不明点は2つ。
なぜmを1足したものとの関係を考えることでエントロピーと扱えると考えたのかがわからない。これについてはSample Entropyの元となったApproximate Entropy以前へ遡らなければならなさそうなので今後の課題ということで。
2点目は、近年の文献では上に示したようなΦmとΦm+1の比の対数を取っているが、Richman(2000)では分母が揃うようにした二つの微妙に異なるAi, Biの比の対数を取っていた。Nがある程度大きければ「あんま変わんないんじゃね?」という話にでもなったのだろうか。当然誤読の可能性も十分にある。こちらも今後の課題。
とりあえず以下ではΦmを用いた方法でSample Entropyを計算した。色んなデータを与えてどうSample Entropyが変化するかをみてみる。
(1)正弦波の振幅変化
信号源を x=k*sin(T) とし、このkを変化させた時に、0.1秒間隔でサンプリングしたデータのSample Entropyを調べた。k=[1, 2, ... , 10]
一定。rが標準偏差に合わせて変化するので、振幅の影響は基本的にはないということですな。
(2)正弦波の周波数変化
信号源を x=sin(k*T)とし、このkを変化させた時に、0.1秒間隔でサンプリングしたデータのSample Entropyを調べた。k=[1, 2, ... , 10]
ある値を境に大きく変化するというのは違和感があるので、もう少し多くのkで調べてみる。k=[1, 2, ... , 100]としてみる。
信号源が正弦波であることにより「たまたまSample Entropyが大きくなるような信号値の並びになった」やその逆が起きることで乱高下していると思われる。こんなキッチリ周期的な信号源というのは現実的ではないのであまり気にしなくてもいいと思うが、一応周波数変化により乱高下することが「ありうる」ということは知っておいていいかもしれない。また周波数変化は「時間軸の伸び縮み」と同義なので、異なる時系列データのSample Entropyを比較するには、サンプリング間隔をそろえる必要はありそう。
(3) サンプリング数の変化
信号源を x=sin(T)とし、0.1秒間隔でサンプリングするデータ数Nを変化させた時のSample Entropyを調べた。N=[200, 300, ... , 1000]
Sample Entropyはその元となったApproximate Entropyに比べて「データ数の影響を受けにくい」と記述されていた気がするが、このデータでは漸減している。現実データではあまり影響しないのかもしれないが、時系列データを比較する際にはデータ数もそろえた方が無難そう。Nは出来れば1000以上がよいとしていた文献があったのだが、確かに1000を超えてこればだいぶ安定しそうではある。
(4) 正弦波を重ね合わせた信号源
信号源を x=Σ[i=1, k]sin(i(T+δi))/k とし 0.1秒間隔でサンプリングしたデータのSample Entropyを調べた。重ね合わせる正弦波の始点をそろえると信号のバリエーションが少ないので、要素sin(iT)/kをそれぞれ[0, 2π/i]からランダムに選択したδiだけ平行移動させた。乱数を用いるため、各kで20回ずつ実行して求めたSample Entropyを平均したものを用いた。k=[1, 2, ... , 30]
かなりきれいに上昇してくれてとてもうれしい気持ちになった。
(5) 階段関数
正弦波ばかりで飽きたので、階段関数を解析してみる。信号源x=T%k (T=[1, 2, ... , N])、サンプリング間隔は1、N=200、k=[2, 3, ... , 30]
ファッ!?と思ったが、rが1を超えたことで一気に増加しただけでした。これも現実データではあまりないと思われるが、解析に際してrを多少上下させてみる必要はあるかもしれない。
このSample Entropyを身体動作や心電図、脳波で計算して、「加齢でエントロピーが~」みたいな研究がいくつか見られるが、上で述べたように「mとm+1の場合を比較することで何故エントロピーといえるのかがわからない」ので、現時点ではあまりパッとしないなぁという印象。ここがすっきり解決してこれがほんまにエントロピーだと言えそうということになったら、解釈についてもすっきりしそうではある。
上記を実行したjupyter notebookはコチラ
0 件のコメント:
コメントを投稿