Open ysh329 opened 5 months ago
# clip不是必须的,超了就超了,+inf或-inf
a=np.random.normal(0, 800, 100000).clip(high, low).astype("float16")
# 有小数位(不为0)的概率
(np.abs(a-a.astype("int64")) > 0).tolist().count(True) / a.size
# 在区间[-1000, 1000]的概率
((-1000<a) & (a<1000)).tolist().count(True) / a.size
深蓝色区域是距平均值小于一个标准差之内的数值范围。在正态分布中,此范围所占比率为全部数值之68%,根据正态分布,两个标准差之内的比率合起来为95%;三个标准差之内的比率合起来为99%。
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.truncnorm.html https://stackoverflow.com/questions/36894191/how-to-get-a-normal-distribution-within-a-range-in-numpy
# https://stackoverflow.com/questions/36894191/how-to-get-a-normal-distribution-within-a-range-in-numpy
from scipy.stats import truncnorm
def get_truncated_normal(mean=0, sd=1, low=0, upp=10):
return truncnorm(
(low - mean) / sd, (upp - mean) / sd, loc=mean, scale=sd)
NumPy 的 sum 在计算浮点数求和时候,会避免求和的计算方式是挨个累加到最终的结果上的,因为这每一次的累加过程,都会导致 rounding 误差,最终就放大了。 NumPy 是使用一种数值更好的方式,即 partial pairwise summation,这种方式可以在很多使用场景上提高精度。
Partial pairwise summation(部分成对求和)是一种数值分析中的技术,它用于提高数值积分或级数求和的精度。这种方法通常在数值计算中用于减少累积误差,特别是在计算长序列的和时。
在传统的求和方法中,例如直接求和或者使用Kahan求和算法,随着求和项数的增加,累积的舍入误差可能会变得显著。这是因为每次加法运算都可能引入一些舍入误差,而这些误差会随着求和项数的增加而累积。
Partial pairwise summation(部分成对求和)的计算过程:
浮点数加法的非结合性:
(a + b) + c
不一定等于 a + (b + c)
,因为在计算机中,每次浮点数加法操作都可能引入舍入误差。减少误差传播:
分治法的优势:
提高数值稳定性: