You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在4D表面八分象限均匀分布点?求3D实现的扩展方案

4D球面八分象限内均匀布点的思路验证与建议

问题背景

已实现3D球面八分象限内的均匀布点,代码如下:

n_samples = 100
N = int(np.floor(np.sqrt(0.25+2*n_samples) -0.5))

phis = np.linspace(start=0, stop=0.25*np.pi, num=N)

# points = np.empty((int(N*(N+1)/2), 3))
points = []
for n in range(1,N+1):
    phi = phis[n-1]
    for theta in np.linspace(start=0, stop=0.5*np.pi, num=n):
        x = np.sin(phi)*np.cos(theta)
        y = np.sin(phi)*np.sin(theta)
        z = np.cos(phi)
        points.append([x,y,z])

points = np.array(points)

df = pd.DataFrame(points, columns=['x', 'y', 'z'])
fig = px.scatter_3d(df, x='x', y='y', z='z')
fig.show()

尝试扩展到4D球面时,采用三次方程计算N,代码如下但遇到困难,需验证思路正确性并寻求建议:

n_samples = 100
poly = [1, 1.5, 0.5, 3*n_samples]
N = int(np.floor(-np.real(np.roots(poly)[0])) - 1)

phi_1s = np.linspace(start=0, stop=0.25*np.pi, num=N)

# points = np.empty((int(N*(N+1)/2), 3))
points = []
for n in range(1,N+1):
    phi_1 = phi_1s[n-1]
    for phi_2 in np.linspace(start=0, stop=0.25*np.pi, num=n):
        for phi_3 in np.linspace(start=0, stop=0.5*np.pi, num=n):
            x1 = np.cos(phi_1)
            x2 = np.sin(phi_1)*np.cos(phi_2)
            x3 = np.sin(phi_1)*np.sin(phi_2)*np.cos(phi_3)
            x4 = np.sin(phi_1)*np.sin(phi_2)*np.sin(phi_3)
            points.append([x1, x2, x3, x4])

points = np.array(points)

df = pd.DataFrame(points, columns=['x', 'y', 'z', 'c'])
fig = px.scatter_3d(df, x='x', y='y', z='z', color='c')

思路验证与建议

1. 坐标转换的正确性

你的4D球面坐标转换是正确的,这是n维球面的标准球坐标参数化方式,满足(x_1^2 + x_2^2 + x_3^2 + x_4^2 = 1),确保点确实落在4D单位球面上。

2. 采样数计算的问题

3D代码中,通过二次方程计算N是合理的,因为3D八分象限内的点数量为(\sum_{k=1}^N k = N(N+1)/2)。但4D部分的三次方程推导有误:

  • 按你的三重循环逻辑,4D八分象限内的点数量应为(\sum_{k=1}^N k^2 = N(N+1)(2N+1)/6),对应三次方程为(N^3/3 + N^2/2 + N/6 - n_samples = 0),系数应为[1/3, 1/2, 1/6, -n_samples],这样计算出的N才能更接近目标采样数。

3. 均匀性优化

当前循环的线性等分角度方式无法保证4D球面上的点均匀分布,因为球坐标下不同角度对应的表面积元存在差异。3D中可能靠经验调整实现近似均匀,但4D需考虑表面积权重:

  • 4D球面的表面积元为(\sin^2\phi_1 \sin\phi_2 d\phi_1 d\phi_2 d\phi_3),采样时需根据该权重调整角度间隔,而非简单线性等分。
  • 更易实现的替代方案:采用随机采样+拒绝法,生成4维正态分布点后归一化到球面,再筛选八分象限的点,示例代码:
import numpy as np
import pandas as pd
import plotly.express as px

n_samples = 100
# 生成4维正态分布点
points = np.random.normal(size=(n_samples*2, 4))
# 归一化到4D球面
points = points / np.linalg.norm(points, axis=1, keepdims=True)
# 筛选所有坐标非负的八分象限点
points = points[(points >= 0).all(axis=1)][:n_samples]

df = pd.DataFrame(points, columns=['x', 'y', 'z', 'c'])
fig = px.scatter_3d(df, x='x', y='y', z='z', color='c')
fig.show()

4. 可视化建议

  • 你用px.scatter_3d将第四维度以色标展示的方式是合理的。
  • 可尝试主成分分析(PCA) 降维,将4D数据投影到3D空间并保留最大方差,更直观展示分布:
from sklearn.decomposition import PCA

pca = PCA(n_components=3)
points_3d = pca.fit_transform(points)
df_pca = pd.DataFrame(points_3d, columns=['pc1', 'pc2', 'pc3'])
df_pca['c'] = points[:,3]
fig = px.scatter_3d(df_pca, x='pc1', y='pc2', z='pc3', color='c')
fig.show()

内容的提问来源于stack exchange,提问作者karthik subramanian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:05:18