Я хочу подогнать свою гистограмму кривой, но не знаю, что делать - PullRequest
2 голосов
/ 04 июля 2019

Я хочу, чтобы нормальная кривая соответствовала уже имеющейся у меня гистограмме.navf2 - это список нормализованных случайных чисел, и гистограмма основана на них, и я хочу, чтобы кривая показала общий тренд гистограммы.

while len(navf2)<252:
    number=np.random.normal(0,1,None)
    navf2.append(number)
bin_edges=np.arange(70,130,1)
plt.style.use(["dark_background",'ggplot'])
plt.hist(navf2, bins=bin_edges, alpha=1)
plt.ylabel("Frequency of final NAV")
plt.xlabel("Ranges")
ymin=0
ymax=100
plt.ylim([ymin,ymax])
plt.show()

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Вот еще одно решение с использованием вашего кода, упомянутого в вопросе.Мы можем достичь ожидаемого результата без использования библиотеки 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()

Вот картинка с выводом:

random data set with normal curve

Надеюсь, это поможет, я устала держать его как можно ближе к вашемуОригинальный код, насколько это возможно!

0 голосов
/ 04 июля 2019

Вот, пожалуйста:

= ^ .. ^ =

from scipy.stats import norm
import numpy as np
import matplotlib.pyplot as plt

# create raw data
data = np.random.uniform(size=252)

# distribution fitting
mu, sigma = norm.fit(data)

# fitting distribution
x = np.linspace(-0.5,1.5,100)
y = norm.pdf(x, loc=mu, scale=sigma)

# plot data
plt.plot(x, y,'r-')
plt.hist(data, density=1, alpha=1)
plt.show()

Вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...