如何解决有没有办法将正态曲线拟合到点?
作为一个小项目,我制作了一个程序,可以多次掷骰子。每次投掷时,它都会对骰子的结果求和并将其添加到列表中。最后用 matplot 绘制数据。
import random
from collections import Counter
import matplotlib.pyplot as plt
nd = int(input("Insert number of dice: "))
nt = int(input("Insert number of throws: "))
print(nd," dice thrown ",nt," times")
print("Generating sums,please hold....")
c = 0
i = 0
sum = 0
sums = []
while nt >= i :
while nd >= c:
g = random.randint(1,6)
sum = sum + g
c += 1
sums.append(sum)
i = i+1
c=0
sum = 0
print("Throw ",i," of ",nt)
sums.sort()
max = max(sums)
min = min(sums)
print("||Maximum result: ",max," ||Minimum result: ",min)
print("Now ordering results")
f = Counter(sums)
y = list(f.values())
x = list(f.keys())
print("Rappresenting results")
plt.plot(x,y)
plt.xlabel("Risultati")
plt.ylabel("Frequenza")
plt.title("Distribuzione delle somme")
plt.grid(True)
plt.tight_layout()
plt.show()
我想知道如何将高斯曲线拟合到点上以使图形更清晰
解决方法
总和的均值和标准差是高斯法线所需的参数。分布的 pdf 的面积为 1
。要将其缩放到与直方图相同的大小,需要乘以输入值的数量 (len(sums)
)。
将代码转换为使用 numpy 数组,一切都会变得更快:
import numpy as np
from collections import Counter
import matplotlib.pyplot as plt
from scipy.stats import norm
nd = 10000 # int(input("Insert number of dice: "))
nt = 10000 # int(input("Insert number of throws: "))
print(nd,"dice thrown",nt,"times")
print("Generating sums,please hold....")
sums = np.zeros(nt,dtype=np.int)
for i in range(nt):
sums[i] = np.sum(np.random.randint(1,7,nd))
sums.sort()
xmax = sums.max()
xmin = sums.min()
print("||Maximum result: ",xmax," ||Minimum result: ",xmin)
print("Now ordering results")
f = Counter(sums)
y = list(f.values())
x = list(f.keys())
print("Plotting results")
plt.plot(x,y)
mean = sums.mean()
std = sums.std()
xs = np.arange(xmin,xmax + 1)
plt.plot(xs,norm.pdf(xs,mean,std) * len(sums),color='red',alpha=0.7,lw=3)
plt.margins(x=0)
plt.xlim(xmin,xmax)
plt.ylim(ymin=0)
plt.tight_layout()
plt.show()
PS:这里有一些代码添加到问题的代码中,使用numpy仅用于计算均值和标准差。 (请注意,当您使用 sum
作为变量名时,当您尝试使用 Python 的 sum()
函数时会出现错误。因此,强烈建议避免将变量命名为 sum
和max
。)
def f(x):
return norm.pdf(x,std) * len(sums)
mean = np.mean(sums)
std = np.std(sums)
xs = range(xmin,xmax+1)
ys = [f(x) for x in xs]
plt.plot(xs,ys,lw=3)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。