螺旋角分布的功率谱分析:多窗谱 + FDR 校正

一、问题背景

素数螺旋映射 z_n = n\^{1+i} 将正整数沿对数螺旋线展开,其角坐标序列为:

复制代码
$$\theta_n = \ln n \pmod{2\pi}$$

检验该序列是否存在非随机周期性结构,是判断素数分布是否在螺旋几何下呈现系统性偏差的关键步骤。

传统周期图(如 Lomb-Scargle)在短数据、非均匀采样场景下存在高方差和频谱泄漏问题。本文采用多窗谱估计(Multitaper Spectral Estimation) 结合 FDR(False Discovery Rate)校正,对素数螺旋角序列进行功率谱分析。

二、方法原理

2.1 多窗谱估计(MTM)

多窗谱由 Thomson(1982)提出,核心思想是:用一组正交的 Slepian 序列(离散扁球序列,DPSS)作为数据窗,分别计算周期图后加权平均,从而降低方差。

对于长度为 N 的序列 x_t,第 k 个 Slepian 窗 v_k(n) 满足:

复制代码
$$\sum_{m=0}^{N-1} \frac{\sin(2\pi W(m-n))}{\pi(m-n)} v_k(m) = \lambda_k v_k(n)$$

其中 W 为带宽参数(典型取 W = \\frac{2}{N} 到 \\frac{5}{N}),\\lambda_k 为特征值。

第 k 个窗的功率谱估计:

复制代码
$$S_k(f) = \left|\sum_{n=0}^{N-1} x_n v_k(n) e^{-i2\pi fn}\right|^2$$

多窗谱估计为:

复制代码
$$\hat{S}(f) = \frac{\sum_{k=0}^{K-1} \lambda_k S_k(f)}{\sum_{k=0}^{K-1} \lambda_k}$$

K 通常取 2NW - 1(NW 为时间-带宽积)。

2.2 FDR 校正

对频率网格上每个频率点 f_j 计算功率 S(f_j),用卡方分布检验显著性:

复制代码
$$H_0: S(f_j) \sim \sigma^2 \chi^2_2 / 2$$

对 M 个频率点进行多重检验时,采用 Benjamini-Hochberg FDR 控制:

  1. 对每个频率点计算 p 值
  2. 将 p 值升序排列:p_{(1)} \\le p_{(2)} \\le \\dots \\le p_{(M)}
  3. 找到最大 k 使得 p_{(k)} \\le \\frac{k}{M} \\cdot \\alpha
  4. 拒绝所有 p_{(i)} \\le p_{(k)} 的零假设

控制 FDR 在 \\alpha = 0.05 或 0.01。

三、实验设计

3.1 数据准备

复制代码
复制代码
复制代码
import numpy as np
from scipy import signal
from scipy.stats import chi2
from statsmodels.stats.multitest import multipletests

# 生成素数螺旋角序列
def primes_up_to(N):
    is_prime = np.ones(N + 1, dtype=bool)
    is_prime[:2] = False
    for p in range(2, int(N ** 0.5) + 1):
        if is_prime[p]:
            is_prime[p*p::p] = False
    return np.where(is_prime)[0]

N = 200000
primes = primes_up_to(N)
angles = np.mod(np.log(primes), 2 * np.pi)

# 构造均匀采样序列(角坐标直方图)
n_bins = 360
hist, bin_edges = np.histogram(angles, bins=n_bins, range=(0, 2*np.pi))
# 去趋势(减去均值)
hist_detrended = hist - np.mean(hist)

3.2 多窗谱计算

复制代码
复制代码
复制代码
def multitaper_spectrum(x, NW=3, K=None):
    """
    x: 输入序列
    NW: 时间-带宽积(典型 2-4)
    K: 窗数量,默认 2*NW-1
    """
    N = len(x)
    if K is None:
        K = int(2 * NW) - 1
    
    # 生成 Slepian 窗(DPSS)
    # 使用 scipy.signal.windows.dpss
    W = NW / N
    tapers, eigenvalues = signal.windows.dpss(N, NW, K, return_ratios=True)
    
    # 计算 FFT 长度(零填充到 2 的幂)
    nfft = 2 ** int(np.ceil(np.log2(N)))
    freq = np.fft.fftfreq(nfft, d=1.0)[:nfft//2]
    
    # 每个窗的功率谱
    spectra = np.zeros((K, nfft//2), dtype=complex)
    for k in range(K):
        tapered = x * tapers[k]
        fft_val = np.fft.fft(tapered, n=nfft)
        spectra[k] = fft_val[:nfft//2]
    
    # 加权平均功率谱
    power = np.zeros(nfft//2)
    for k in range(K):
        power += eigenvalues[k] * np.abs(spectra[k])**2
    power /= eigenvalues.sum()
    
    return freq, power, spectra, eigenvalues

freq, power, spectra, eigvals = multitaper_spectrum(hist_detrended, NW=3, K=5)

3.3 显著性检验与 FDR 校正

复制代码
复制代码
复制代码
# 白噪声零假设下的卡方检验
# 功率服从 σ²·χ²(2)/2,σ² 用中位数估计
sigma2 = 2 * np.median(power)  # 中位数无偏估计
dof = 2 * K  # 自由度

# 计算每个频率点的 p 值
p_values = 1 - chi2.cdf(2 * power / sigma2, df=dof)

# Benjamini-Hochberg FDR 校正
reject, p_corrected, _, _ = multipletests(
    p_values, alpha=0.05, method='fdr_bh'
)

# 显著频率
sig_freq = freq[reject]
sig_power = power[reject]
sig_p = p_corrected[reject]

print(f"显著频率数量: {len(sig_freq)}")
print(f"显著频率 (cycles/point): {sig_freq[:10]}")
print(f"对应周期 (points/cycle): {1/sig_freq[:10]}")

3.4 零模型对比

复制代码
复制代码
复制代码
# 生成随机序列(泊松过程)作为零模型
np.random.seed(42)
random_hist = np.random.poisson(lam=np.mean(hist), size=n_bins)
random_hist_detrended = random_hist - np.mean(random_hist)

freq_rand, power_rand, _, _ = multitaper_spectrum(random_hist_detrended, NW=3, K=5)

# 比较素数序列与随机序列的谱特征
ratio = power / (np.median(power_rand) * np.ones_like(power))

四、结果解读

4.1 预期谱特征

特征 物理含义 预期
低频峰值 大尺度角聚集 素数序列应强于随机序列
高频平坦 小尺度随机性 两类序列应相似
显著频率 周期性结构 素数序列可能有少量显著峰

4.2 关键指标

指标 计算公式 判定标准
谱平坦度 \\frac{\\text{几何均值}}{\\text{算术均值}} < 0.1 表示谱尖锐
谱峰信噪比 \\max(\\text{power}) / \\text{median}(\\text{power}) > 5 表示显著峰
FDR 显著峰数 经校正后 p \< 0.05 的频率数 素数 > 随机
低频能量占比 \\sum_{f \< f_c} S(f) / \\sum S(f) 素数序列更高

4.3 与素数定理的关联

素数定理预测素数间隔 \\ln n 的平均尺度。在螺旋角序列中,这对应:

复制代码
$$\Delta\theta \approx \frac{\ln n}{n}$$

对功率谱的影响:低频能量集中,高频衰减。多窗谱应能检测到这种非均匀性。

五、与 Lomb-Scargle 的对比

维度 Lomb-Scargle 多窗谱 + FDR
方差 高(单窗) 低(多窗平均)
频率分辨率 依赖数据点 由 NW 参数控制
多重检验 需额外处理 内置 FDR 校正
非均匀采样 原生支持 需插值到均匀网格
计算复杂度 O(N log N) O(K·N log N)

六、结论

多窗谱 + FDR 校正为素数螺旋角分布的非随机性检验提供了一种频率域的统计方法:

  1. 多窗谱降低了传统周期图的方差,提高了弱信号的检测能力
  2. FDR 校正在多重检验下控制了假阳性率
  3. 与随机零模型对比提供了统计显著性基准
  4. 结果应与第 8 篇论文中提出的似然比 / 方差分析方法交叉验证

该方法不改变"素数螺旋角分布存在非随机结构"的结论,但为频率域证据提供了独立支持。


七、延伸阅读:螺旋生成论系列开放获取著作

本实验基于张智明《螺旋生成论》系列中提出的素数螺旋映射 z_n=n\^{1+i}。该系列已发布 70 余部专著与预印本,托管于 CERN 旗下 Zenodo 平台。

核心相关著作:

上述著作为统一数学框架假说。本实验为独立统计检验,结果以可复现计算为准。


开放获取汇总​

全集索引 https://doi.org/10.5281/zenodo.21211001 | 总汇编 https://doi.org/10.5281/zenodo.21199593 | ORCID https://orcid.org/0009-0003-7777-7694

相关推荐
H_unique7 小时前
Chat2Excel:接口自动化测试
python·测试工具·自动化
ss2737 小时前
AI全栈实战 | 3.3-02 Python 并发:有 GIL 为什么还用多线程,asyncio 和 JS 事件循环同源不同味
开发语言·javascript·python
菜鸟~noob2337 小时前
【电子战】第20篇:凸优化与对数障碍法【含matlab代码】
开发语言·matlab
空心木偶☜7 小时前
Langgraph操作时常见的错误
python·ai·ai编程·langgraph
Wang's Blog7 小时前
Java框架 SpringCloud 快速入门: 服务拆分案例 Demo
java·开发语言·spring cloud
cpolar技术支持7 小时前
外网测试机的异常传不回内网?自托管 Sentry,用 cpolar 打通错误上报链路
python·nginx·docker·cpolar·sentry
小小龙学IT7 小时前
Python SQLAlchemy 2.0 深度解析:从 Core 到 ORM 的数据访问双引擎
开发语言·数据库·python
2601_962885727 小时前
如何用 Python 计算 ROC 变动率指标做动量分析?
开发语言·python·算法
在世修行7 小时前
干货:文件上传端点解析
python·fastapi·接收上传
潼心1412o8 小时前
C++初阶(长期更新)第9讲:string(上)
开发语言·c++