Вот еще одно решение с использованием вашего кода, упомянутого в вопросе.Мы можем достичь ожидаемого результата без использования библиотеки scipy.нам нужно будет сделать три вещи, вычислить среднее значение набора данных, вычислить стандартное отклонение набора и создать функцию, которая генерирует нормальную или гауссову кривую.
Чтобы вычислить среднее значение, мы можем использовать функцию внутри библиотеки numpy, т.е. mu = np.mean(your_data_set_here)
Стандартное отклонение набора - это квадратный корень из суммы разностей значений и среднегоквадрат https://en.wikipedia.org/wiki/Standard_deviation. Мы можем выразить это в коде следующим образом, снова используя библиотеку numpy:
data_set = [] # some data set
sigma = np.sqrt(1/(len(data_set))*sum((data_set-mu)**2))
Наконец, мы должны построить функцию для нормальной кривой или гауссовой https://en.wikipedia.org/wiki/Gaussian_function,он зависит как от среднего значения (mu
), так и от стандартного отклонения (sigma
), поэтому мы будем использовать их в качестве параметров в нашей функции:
def Gaussian(x,sigma,mu): # sigma is the standard deviation and mu is the mean
return ((1/(np.sqrt(2*np.pi)*sigma))*np.exp(-(x-mu)**2/(2*sigma**2)))
, объединяя все вместе, выглядит следующим образом:
import numpy as np
import matplotlib.pyplot as plt
navf2 = []
while len(navf2)<252:
number=np.random.normal(0,1,None) # since all values will be between 0,1 the bin size doesnt work
navf2.append(number)
navf2 = np.asarray(navf2) # convert to array for better results
mu = np.mean(navf2) #the avg of all values in navf2
sigma = np.sqrt(1/(len(navf2))*sum((navf2-mu)**2)) # standard deviation of navf2
x_vals = np.arange(min(navf2),max(navf2),0.001) # create a flat range based off data
# to build the curve
gauss = [] #store values for normal curve here
def Gaussian(x,sigma,mu): # defining the normal curve
return ((1/(np.sqrt(2*np.pi)*sigma))*np.exp(-(x-mu)**2/(2*sigma**2)))
for val in x_vals :
gauss.append(Gaussian(val,sigma,mu))
plt.style.use(["dark_background",'ggplot'])
plt.hist(navf2, density = 1, alpha=1) # add density = 1 to fix the scaling issues
plt.ylabel("Frequency of final NAV")
plt.xlabel("Ranges")
plt.plot(x_vals,gauss)
plt.show()
Вот картинка с выводом:
Надеюсь, это поможет, я устала держать его как можно ближе к вашемуОригинальный код, насколько это возможно!