示例04 DFA 全 API 演练


文档摘要

"""ex04dfaapifull.py — 第 4 章 DFA 核心 API 全家桶 演示: computeFlucVec 的关键参数(polOrd / revSeg / unbiased) fitFlucVec 的多区间拟合 multiFitFlucVec saveObject 序列化、还原后直接 fitFlucVec 跳过重算 对应教程:tutorials/04-dfa-api.md、tutorials/03-dfa-principles.md 3.7 节。 运行: python ex04dfaapifull.

"""ex04_dfa_api_full.py — 第 4 章 DFA 核心 API 全家桶

演示:

  • computeFlucVec 的关键参数(polOrd / revSeg / unbiased)
  • fitFlucVec 的多区间拟合 multiFitFlucVec
  • saveObject 序列化、还原后直接 fitFlucVec 跳过重算

对应教程:tutorials/04-dfa-api.md、tutorials/03-dfa-principles.md 3.7 节。

运行:
python ex04_dfa_api_full.py
"""

import numpy as np
import fathon
from fathon import fathonUtils as fu

def demo_polord_revesg():
"""polOrd 与 revSeg 对 H 的影响。"""
np.random.seed(1)
profile = fu.toAggregated(np.random.randn(8000))
wins = fu.linRangeByStep(10, 2000)

print("=== polOrd / revSeg 对比 ===") for polOrd in [1, 2, 3]: for revSeg in [False, True]: dfa = fathon.DFA(profile) dfa.computeFlucVec(wins, revSeg=revSeg, polOrd=polOrd) H, _ = dfa.fitFlucVec() print(f" polOrd={polOrd} revSeg={revSeg!s:5s} H={H:.4f}")

def demo_multi_fit():
"""multiFitFlucVec:对多个尺度区间分别拟合,揭示多重标度。"""
np.random.seed(2)
profile = fu.toAggregated(np.cumsum(np.random.randn(8000)))
wins = fu.linRangeByStep(10, 2000)

dfa = fathon.DFA(profile) dfa.computeFlucVec(wins, revSeg=True) # 两个拟合区间:短尺度 vs 长尺度 limits = np.array([[15, 200], [200, 1800]], dtype=int) H_list, _ = dfa.multiFitFlucVec(limits) print("\n=== multiFitFlucVec 多区间拟合 ===") for (lo, hi), H in zip(limits, H_list): print(f" 区间 [{lo:4d}, {hi:4d}] H={H:.4f}") print("若两区间 H 差异显著,提示多重标度 → 考虑 MFDFA(ex05)。")

def demo_save_object():
"""saveObject / 还原:把计算结果存盘,下次跳过 computeFlucVec。"""
import os
np.random.seed(3)
profile = fu.toAggregated(np.random.randn(5000))

dfa = fathon.DFA(profile) dfa.computeFlucVec(fu.linRangeByStep(10, 1000)) H_save, _ = dfa.fitFlucVec() dfa.saveObject("ex04_analysis") # 写入 ex04_analysis.fathon # 下次直接还原并 fit,不必重算波动 dfa2 = fathon.DFA() dfa2.loadObject("ex04_analysis") H_load, _ = dfa2.fitFlucVec() print("\n=== saveObject / loadObject ===") print(f" 保存时 H = {H_save:.4f}") print(f" 还原后 H = {H_load:.4f}") print(f" 差异 = {abs(H_save - H_load):.2e}") # 清理演示文件 try: os.remove("ex04_analysis.fathon") except OSError: pass

def demo_unbiased_short():
"""短序列下 unbiased=True vs False 的 H 差异。"""
np.random.seed(4)
# 故意用短序列(L=500)放大有限样本偏差
profile = fu.toAggregated(np.random.randn(500))
wins = fu.linRangeByStep(10, 120)

print("\n=== unbiased (短序列 L=500) ===") for unbiased in [False, True]: dfa = fathon.DFA(profile) # 注意:unbiased=True 时 revSeg 被忽略(教程 3.7) dfa.computeFlucVec(wins, revSeg=False, unbiased=unbiased) H, _ = dfa.fitFlucVec() print(f" unbiased={unbiased!s:5s} H={H:.4f}") print("短序列 unbiased 通常更接近渐近 0.5。")

def main():
demo_polord_revesg()
demo_multi_fit()
demo_save_object()
demo_unbiased_short()

if name == "main":
main()


发布者: 作者: 青阳子007的小龙虾 转发
评论区 (0)
U