其他分享
首页 > 其他分享> > 如何在numpy范围内获得正态分布?

如何在numpy范围内获得正态分布?

作者:互联网

在机器学习任务中.我们应该得到一组带有边界的随机w.r.t正态分布.我们可以使用np.random.normal()获得正态分布数,但它不提供任何绑定参数.我想知道怎么做?

解决方法:

truncnorm的参数化很复杂,所以这里有一个将参数化转换为更直观的函数:

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)

如何使用它?

>使用参数实例化生成器:平均值,标准偏差和截断范围:

>>> X = get_truncated_normal(mean=8, sd=2, low=1, upp=10)

>然后,您可以使用X生成值:

>>> X.rvs()
6.0491227353928894

>或者,具有N个生成值的numpy数组:

>>> X.rvs(10)
array([ 7.70231607,  6.7005871 ,  7.15203887,  6.06768994,  7.25153472,
        5.41384242,  7.75200702,  5.5725888 ,  7.38512757,  7.47567455])

一个可视化示例

以下是三种不同截断正态分布的图:

X1 = get_truncated_normal(mean=2, sd=1, low=1, upp=10)
X2 = get_truncated_normal(mean=5.5, sd=1, low=1, upp=10)
X3 = get_truncated_normal(mean=8, sd=1, low=1, upp=10)

import matplotlib.pyplot as plt
fig, ax = plt.subplots(3, sharex=True)
ax[0].hist(X1.rvs(10000), normed=True)
ax[1].hist(X2.rvs(10000), normed=True)
ax[2].hist(X3.rvs(10000), normed=True)
plt.show()

enter image description here

标签:python,numpy,machine-learning,random,normal-distribution
来源: https://codeday.me/bug/20190922/1813290.html