Files

50 lines
5.6 KiB
Python

"""Synthetic geometric controls; no model weights, training or GPU."""
import argparse,json,csv,hashlib,time
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
def main(root):
root=Path(root);root.mkdir(parents=True,exist_ok=False);started=time.monotonic();rng=np.random.default_rng(20261111);d,k,n=128,16,20000
# Construct actual vectors, then measure norms. Inactive coordinates are zero.
radii={};checks={}
for name,active,radial_dim in [('uniform_d_ball',d,d),('uniform_k_ball',k,k),('sparse_same_radial',k,d),('sparse_sphere',k,None)]:
direction=rng.normal(size=(n,active));direction/=np.linalg.norm(direction,axis=1,keepdims=True)
radius=np.ones(n) if radial_dim is None else rng.uniform(size=n)**(1/radial_dim)
vectors=np.zeros((n,d));vectors[:,:active]=direction*radius[:,None]
measured=np.linalg.norm(vectors,axis=1);np.testing.assert_allclose(measured,radius,atol=1e-14)
checks[name]={'active_dimensions':active,'max_norm':float(measured.max()),'mean_squared_norm':float(np.mean(measured**2)),'radial_dimension':radial_dim}
radii[name]=measured;del vectors,direction
np.savez_compressed(root/'measured-radii.npz',**radii)
rows=[]
for a in [.8,.9,.95,.99]:
for name,x in radii.items():
m=checks[name]['radial_dimension'];theory=0. if m is None else a**m;empirical=float(np.mean(x<=a))
# Six standard errors plus finite-sample allowance; diagnostic, not a model-quality claim.
assert abs(empirical-theory)<=6*np.sqrt(theory*(1-theory)/n)+6/n
rows.append({'distribution':name,'radius_fraction':a,'theory_probability':theory,'empirical_probability':empirical,'sample_count':n})
with (root/'interior-probabilities.csv').open('w') as f:
w=csv.DictWriter(f,fieldnames=list(rows[0]));w.writeheader();w.writerows(rows)
fig,axs=plt.subplots(1,2,figsize=(12,4.5),layout='constrained');labels={'uniform_d_ball':'Uniform 128D ball','uniform_k_ball':'Uniform 16D ball embedded in 128D','sparse_same_radial':'16-sparse, same radii as 128D ball law','sparse_sphere':'16-sparse, fixed radius 1'}
styles=['-','-','--',':']
for (name,x),style in zip(radii.items(),styles):
xx=np.sort(x);yy=np.arange(1,n+1)/n;axs[0].plot(xx,yy,style,label=labels[name]);axs[1].plot(xx,yy,style,label=labels[name])
axs[0].set(xlim=(.65,1.005),ylim=(0,1),xlabel='Measured norm / common radius R',ylabel='Interior probability: P(norm <= r)',title='Empirical radial CDF')
axs[1].set(xlim=(.97,1.001),ylim=(0,1),xlabel='Measured norm / R',title='Near-boundary detail')
for ax in axs:ax.grid(alpha=.2)
axs[0].legend(fontsize=8,loc='upper left');fig.suptitle('Same ambient dimension and outer radius; sparsity alone does not fix radial probability')
for ext in ['png','pdf','svg']:fig.savefig(root/('sparse_shell_controls.'+ext),dpi=180)
proof={'passed':True,'ambient_dimension':d,'sparse_dimensions':k,'sample_count_per_distribution':n,'seed':20261111,'outer_radius':1,'controls':checks,'elapsed_seconds':time.monotonic()-started,'limitations':['synthetic distributions, not trained-network parameters','same outer radius, not same mean squared norm','changing angular support alone leaves the chosen radial law unchanged','fixed-radius shell is a deliberately structured counterexample']}
(root/'audit.json').write_text(json.dumps(proof,indent=2)+'\n')
lines=['# 稀疏分布与高维壳:条件定理及反例','', '在同一外半径R下,若X在d维球内均匀分布,P(||X||<=aR)=a^d。若X均匀分布于嵌入该空间的k维子空间球,则概率为a^k。0<a<1、k<d时严格有a^k>a^d。','', '因此用户猜想在上述模型下成立。k仍很大时也有薄壳,只是由有效维度k决定,而非环境维度d。','', '| r/R | 128维均匀球(理论) | 16维子空间均匀球(理论) | 内部概率倍数 |','|---|---:|---:|---:|']
for a in [.8,.9,.95,.99]:lines.append(f'| {a} | {a**d:.6g} | {a**k:.6g} | {a**(k-d):.6g} |')
lines+=['', '模拟构造4组实际128维向量,每组20000个,再测量其范数:全维均匀球、16维子空间均匀球、同样16稀疏但采用原128维球半径分布、以及全部固定在半径R的16稀疏点。前两者验证条件定理;后两者说明仅凭稀疏不能保证内部概率增加。','', '所有组外半径相同,但平均范数并未强行匹配。若把每个向量都归一化为相同范数,径向差异会被直接抹去。固定半径组的浮点误差约1e-16;理论上全部在球面,图中仅为数值表示。','', '这不证明好模型的参数更靠内部。用于模型时还需明确采样单元、中心、半径和缩放约定;参数可做保持功能的重参数化,原点距离不是模型质量不变量。','', '文件:run.py为生成程序;measured-radii.npz为全部实测范数;interior-probabilities.csv保留理论与经验概率;三种图格式及SHA清单便于长期保存。没有读取、训练或改动任何模型。']
lines+=['', '有限样本说明:每组20000个点不足以精确估计约1e-6的极小尾概率;极小概率和倍数以解析公式为准,不把零次命中当成严格零概率。']
(root/'REPORT.md').write_text('\n'.join(lines)+'\n')
(root/'checksums.json').write_text(json.dumps({p.name:hashlib.sha256(p.read_bytes()).hexdigest() for p in sorted(root.iterdir()) if p.is_file()},indent=2)+'\n')
print((root/'REPORT.md').read_text(),end='')
if __name__=='__main__':
p=argparse.ArgumentParser();p.add_argument('--out',required=True);a=p.parse_args();main(a.out)