2017-03-26 12 views
1

いくつかのスペクトルでパターンを探したい。 Spectrum imageパターン認識1dデータ

パターンは画像の灰色の円で2のように表示されます。すべてのデータは同様に見えます。ライトブルーの線はオリジナルのデータで、点線のダークブルー線です - 平均6点。私はいくつかのサイズでウィンドウをしてデータをスキャンしようとしていて、y-fluxの値が60 ish%以下に下がっているかどうかをチェックしていましたが、それは他の領域と私が望むもの、あるいはこれだけです。

パターンの幅は、私が持っているスペクトルでは必ずしも同じではありません。パターン黒い破線のスペクトルの画像がありますが、私のプログラムはそれを見つけませんでした。

not found picture

私は、ウィンドウのサイズ変更をしようとしたが、それは解決しません。このパターンを見つけるためにいくつかのパターン認識アルゴリズムを使用できますか?誰かが私をある方向に向けることができますか?または、私はちょっとこれで失われているので、簡単な方法で説明してください。

import numpy as np 
import matplotlib.pyplot as plt 
from astropy.io import ascii 
import glob 

def reading(file_name): 
    data = ascii.read(file_name) 
    lam = data['col0'][1:-1] 
    #data offset *10**17 + 5 
    flux = data['col1'][1:-1]*10**17 + 5 

    return lam, flux 

def percentChange(startPoint,currentPoint): 

    return abs(((currentPoint-startPoint)/startPoint))*100.00 

def window(data, size): 
    n = len(data) 
    out = [] 
    wind = data[0 : size] 
    i = size  

    while i + size/2 < n: 
     wind = data[i - size/2 : i + size/2] 
     tmp = percentChange(wind[0], wind[-1]) 

     if tmp > 50.: 
      out.append([tmp, i - size/2, i + size/2]) 
     i = i + size 

    return out 

def window2(data, size): 

    n = len(data) 
    out = [] 
    wind = data[0 : size] 
    i = size  

    while i + size/2 < n: 
     wind = data[i - size/2 : i + size/2] 
     tmp = percentChange(wind[0], wind[len(wind)/2]) 

     if tmp > 50.: 
      out.append([tmp, i - size/2, i + size/2]) 
     i = i + size 

    return out 

def plotting(lamb, flux): 
    plt.rcParams['font.family'] = 'freeserif' 
    plt.rcParams['font.size'] = 12 
    plt.rcParams['axes.labelsize'] = 15 
    plt.rcParams['xtick.labelsize'] = 12 
    plt.rcParams['ytick.labelsize'] = 12 
    plt.rcParams['legend.fontsize'] = 12 
    plt.rcParams['figure.titlesize'] = 12 
    plt.rcParams['xtick.minor.visible'] = True 
    plt.rcParams['ytick.minor.visible'] = True 

    plt.plot(lamb, flux) 
    plt.xlabel("wavelenght [A]") 
    plt.ylabel("flux [erg/cm^2/s/A]") 

def averaging(lamb, flux, param): 
    end = 1480 
    bin_flux_1 = [np.mean(flux[i : i + param]) for i in range(0, end, param)] 
    bin_lam_1 = [np.mean(lamb[i : i + param]) for i in range(0, end, param)] 

    return bin_lam_1, bin_flux_1 


def main(): 

    param = 6 
    stack = 6 

    for name in glob.glob('TRAIN/*.dat'): 
     print name 
     lamb, flux = reading(name) 
     lamb_a, flux_a = averaging(lamb, flux, param) 

     plotting(lamb, flux) 
     plotting(lamb_a, flux_a) 

     change = window(flux_a, stack) 
     change2 = window2(flux_a, stack) 

     minim = flux_a.index(min(flux_a)) 

     for i in range(len(change)): 
      plt.axvline(lamb_a[change[i][1]], color='r', linestyle='--',linewidth=1) 
      plt.axvline(lamb_a[change[i][2]], color='r', linestyle='--',linewidth=1) 
     for i in range(len(change2)): 
      plt.axvline(lamb_a[change2[i][1]], color='y', linestyle='-',linewidth=1) 
      plt.axvline(lamb_a[change2[i][2]], color='y', linestyle='-',linewidth=1) 
     plt.axvline(lamb_a[minim], color='k', linestyle='--',linewidth=1) 
     plt.show()  


if __name__ == "__main__": 
    main() 

答えて

0

あなたがnmは、テキストとパターンの長さは線形O(n + m)時間複雑にクヌース - モリス - プラット法を使用することによってそれを行うことができます。私のコードです

KMPアルゴリズムは基本的に、文字列に作用するパターンマッチングアルゴリズム(ヘイスタックの針の開始位置を見つける)です。

def kmp_matcher(t, d): 
    n=len(t) 
    m=len(d) 

    pi = compute_prefix_function(d) 
    q = 0 
    i = 0 
    while i < n: 
     if d[q]==t[i]: 
      q=q+1 
      i = i + 1 
     else: 
      if q != 0: 
       q = pi[q-1] 
      else: 
       i = i + 1 
     if q == m: 
      print "pattern occurs with shift "+str(i-q) 
      q = pi[q-1] 

def compute_prefix_function(p): 
    m=len(p) 
    pi =range(m) 
    k=1 
    l = 0 
    while k < m: 
     if p[k] <= p[l]: 
      l = l + 1 
      pi[k] = l 
      k = k + 1 
     else: 
      if l != 0: 
       l = pi[l-1] 
      else: 
       pi[k] = 0 
       k = k + 1 
    return pi 

t = 'brownfoxlazydog' 
p = 'lazy' 
kmp_matcher(t, p) 
+0

ありがとうございます、私はそれを試してみます。私はそれらを保存していくつかのパターンを見つけると、他のスペクトルを見てくださいが、私はこのライナーの時間の複雑さを少し心配ですが、私のパターンは、そのような異なるyの値を持っている場合は動作するだろうか?私のパターンの最小点は-5か0か?または私はとても長い「テキスト」を持っているので、それを扱うでしょうか? – Anaone

+0

KMPはパターンの正確な一致を見つけるためのものです。実行中の平均値が幅Wのある閾値Tを下回る場所を探したいとします。 – stark

関連する問題