📖

量子計算による時系列データの周期分析(QFT 応用)

に公開

概要

時系列データの中から
周期性(繰り返しパターンや周波数)
を見つける方法として、
量子フーリエ変換(QFT)
を使うことで、古典的なフーリエ変換に比べて高速に解析可能かどうかについて、シンプルなサンプルを踏まえて解析の流れなどを簡易検証してみる。


解析の流れ

ステップ 内容
① データのサンプリング 時系列データを取り出し、分析しやすいサイズ(2 の累乗が理想)に調整
② 正規化 データを 0~1 に正規化し、量子ビットの振幅に変換できる形にする
③ データの量子状態へのエンコード 量子ビットにデータを組み込む(振幅符号化など)
④ QFT(量子フーリエ変換)を適用 周波数領域に変換し、周期的パターンを抽出
⑤ 測定・解釈 測定結果(ビット列の頻度)から周期を判定

サンプルコード(Qiskit)

1. 時系列データ(サンプル作成)

import numpy as np
 
# サンプルデータ(周期4の正弦波 + ノイズ)
n_samples = 8
time = np.arange(n_samples)
data = np.sin(2 * np.pi * time / 4) + 0.1 * np.random.randn(n_samples)
 
print("Original Data:", data)

2. 正規化

# 0~1にスケール変換
data_norm = (data - np.min(data)) / (np.max(data) - np.min(data))

3. 量子状態へのエンコード

from qiskit import QuantumCircuit
 
qc = QuantumCircuit(n_samples)
 
# 振幅符号化の例(単純な回転)
for i in range(n_samples):
angle = 2 * np.pi * data_norm[i]
qc.ry(angle, i)

4. QFT の適用

from qiskit.circuit.library import QFT
 
qft_circ = QFT(num_qubits=n_samples, do_swaps=True).to_gate()
qc.append(qft_circ, range(n_samples))
 
qc.measure_all()
qc.draw('mpl')

5. シミュレーションと測定

from qiskit import Aer, execute
 
backend = Aer.get_backend('qasm_simulator')
job = execute(qc, backend, shots=1024)
result = job.result()
counts = result.get_counts()
 
print("Frequency Counts:", counts)

測定結果の解釈

  • 得られるビット列の出現頻度から、どの周波数(周期)の出現頻度が高いかがわかる。
  • 例えば、周期4のデータなら、対応するビット列が頻繁に現れる。

補足知識:QFT の理論

  • QFT は古典的なフーリエ変換の量子版。
  • 計算量が**O(log² N)**と効率的で、大規模データの周波数解析に適している。
  • 数式(離散フーリエ変換):

まとめ

手順 内容
データ準備 時系列データのサンプリング
正規化 振幅を 0~1 にスケーリング
エンコード 量子ビットにデータを反映
QFT 周波数領域に変換
測定・解釈 ビット列の頻度分布で周期解析

注意点

  • 現時点では小規模データが対象(8~16 サンプル程度)
  • ノイズが多いデータは事前のフィルタリングが効果的
  • 将来的には量子古典ハイブリッドでのスケーラブルな解析が期待される。

ヘッドウォータース

Discussion