地震波データの処理と分析においてPythonは強力な手段を提供します。本稿では以下の二つのアプローチについて説明します:1. ウェーブレット中心周波数が縦方向解像度に与える影響の可視化;2. ウェーブレット変換と機械学習を組み合わせた信号分類手法。
地震探査における高精度な信号解析は、地下構造の詳細な把握に不可欠です。Pythonの豊富な科学計算ライブラリ群により、複雑な信号処理タスクを効率的に実行することが可能になります。
ウェーブレット特性が垂直分解能に与える影響の視覚化
地震データの垂直分解能は、微細な地層構造を識別する能力に直結します。ここではウェーブレットの主要周波数成分がこの性能にどのように寄与するかをグラフィカルに検証します。
必要なパッケージをインポートします。数値演算にはnumpy、可視化にはmatplotlib、ウェーブレット解析にはPyWaveletsを使用します。
import numpy as np
import matplotlib.pyplot as plt
import pywt
時間軸上に合成地震信号を生成します。
time_axis = np.linspace(0, 1, 1000)
seismic_trace = np.sin(2 * np.pi * 5 * time_axis) + np.sin(2 * np.pi * 15 * time_axis)
db4ウェーブレットを用いてマルチスケール分解を実施します。
wavelet_coeffs = pywt.wavedec(seismic_trace, 'db4')
特定スケールの係数を操作することで、異なる周波数特性を持つ信号を再構成します。
modified_coeffs = wavelet_coeffs.copy()
modified_coeffs[2] *= 0 # 第2スケール係数をゼロ化
processed_signal = pywt.waverec(modified_coeffs, 'db4')
元信号と処理後信号を比較表示し、周波数特性変化が垂直解像度に及ぼす影響を観察します。
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 6))
ax1.plot(time_axis, seismic_trace, label='入力信号')
ax1.legend()
ax2.plot(time_axis[:len(processed_signal)], processed_signal, label='再構成信号', color='red')
ax2.legend()
plt.tight_layout()
plt.show()
この結果から、ウェーブレット係数の調整が信号の時間的特徴に顕著な変化をもたらすことが確認できます。これは実際の地震探査において分解能制御に応用可能です。
機械学習とウェーブレット解析による信号パターン認識
ウェーブレット変換により抽出された特徴量を基に、機械学習アルゴリズムで地震イベントの自動分類を実現できます。
追加でscikit-learnから分類器関連モジュールを読み込みます。
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
訓練用の疑似地震データセットを作成します。
features = np.random.rand(100, 50)
labels = np.random.randint(0, 2, 100)
各サンプルに対しウェーブレット変換を行い、低周波・高周波成分を結合した新しい特徴ベクトルを構築します。
enhanced_features = []
for trace in features:
detail_coeffs = pywt.wavedec(trace, 'db4')
combined_feature = np.hstack([detail_coeffs[0], detail_coeffs[1]])
enhanced_features.append(combined_feature)
feature_matrix = np.array(enhanced_features)
データを訓練セットと評価セットに分割します。
train_x, test_x, train_y, test_y = train_test_split(
feature_matrix, labels, test_size=0.2, random_state=42
)
サポートベクターマシンで学習・予測を実行します。
classifier = SVC()
classifier.fit(train_x, train_y)
predictions = classifier.predict(test_x)
モデルの識別精度を出力します。
performance = accuracy_score(test_y, predictions)
print(f"分類精度: {performance:.3f}")
この手法により、地震活動の種別判定や異常事象の早期検知といった高度な解析が実現可能となります。