いくつかのスペクトルでパターンを探したい。 Spectrum imageパターン認識1dデータ
パターンは画像の灰色の円で2のように表示されます。すべてのデータは同様に見えます。ライトブルーの線はオリジナルのデータで、点線のダークブルー線です - 平均6点。私はいくつかのサイズでウィンドウをしてデータをスキャンしようとしていて、y-fluxの値が60 ish%以下に下がっているかどうかをチェックしていましたが、それは他の領域と私が望むもの、あるいはこれだけです。
パターンの幅は、私が持っているスペクトルでは必ずしも同じではありません。パターン黒い破線のスペクトルの画像がありますが、私のプログラムはそれを見つけませんでした。
私は、ウィンドウのサイズ変更をしようとしたが、それは解決しません。このパターンを見つけるためにいくつかのパターン認識アルゴリズムを使用できますか?誰かが私をある方向に向けることができますか?または、私はちょっとこれで失われているので、簡単な方法で説明してください。
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()
ありがとうございます、私はそれを試してみます。私はそれらを保存していくつかのパターンを見つけると、他のスペクトルを見てくださいが、私はこのライナーの時間の複雑さを少し心配ですが、私のパターンは、そのような異なるyの値を持っている場合は動作するだろうか?私のパターンの最小点は-5か0か?または私はとても長い「テキスト」を持っているので、それを扱うでしょうか? – Anaone
KMPはパターンの正確な一致を見つけるためのものです。実行中の平均値が幅Wのある閾値Tを下回る場所を探したいとします。 – stark