2013-11-15 4 views
18

, пожалуйста, помогите мне построить нормальное распределение на следующие данные:Участок нормальное распределение с Matplotlib

ДАННЫЕ:

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

h = [186, 176, 158, 180, 186, 168, 168, 164, 178, 170, 189, 195, 172, 
    187, 180, 186, 185, 168, 179, 178, 183, 179, 170, 175, 186, 159, 
    161, 178, 175, 185, 175, 162, 173, 172, 177, 175, 172, 177, 180] 

std = np.std(h) 
mean = np.mean(h)  
plt.plot(norm.pdf(h,mean,std)) 

выход:

Standard Deriviation = 8.54065575872 
mean = 176.076923077 

сюжет неправильно, что такое неправильно с моим кодом?

+0

вы определяете свои данные как 'h', но загружаете' hs' в функции stat. это проблема? –

+0

Нет. Я допустил ошибку при вводе текста, извините, проблема все еще не решена. – Adel

+7

Как сейчас, люди не могут копировать и вставлять свой код в консоль и запускать ее (ваш список не определен правильно). Я рекомендую установить это. Также, пожалуйста, отредактируйте свой вопрос, чтобы указать значения, которые вы ожидаете увидеть, и точно, где он сбой. Правильно ли этот сюжет? Является ли это неправильным? Стандартное отклонение? Все? Последний вопрос: откуда взялась «норма»? Это то, что нужно знать потенциальным автоответчикам. –

ответ

53

Вы можете попробовать использовать hist поместить свою информацию данных наряду с подогнанной кривой, как показано ниже:

import numpy as np 
import scipy.stats as stats 
import pylab as pl 

h = sorted([186, 176, 158, 180, 186, 168, 168, 164, 178, 170, 189, 195, 172, 
    187, 180, 186, 185, 168, 179, 178, 183, 179, 170, 175, 186, 159, 
    161, 178, 175, 185, 175, 162, 173, 172, 177, 175, 172, 177, 180]) #sorted 

fit = stats.norm.pdf(h, np.mean(h), np.std(h)) #this is a fitting indeed 

pl.plot(h,fit,'-o') 

pl.hist(h,normed=True)  #use this to draw histogram of your data 

pl.show()     #use may also need add this 

enter image description here

+0

Использование pl.plot дает ошибки. Вместо этого мы можем использовать «import matplotlib.pyplot as pl» –

+0

@Developer, как я могу получить пересечение гистограммы и кривой подгонки (максимальная точка на оси y –

20

Предполагая, что вы получаете norm от scipy.stats, вы, вероятно, просто нужно отсортировать список:

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

h = [186, 176, 158, 180, 186, 168, 168, 164, 178, 170, 189, 195, 172, 
    187, 180, 186, 185, 168, 179, 178, 183, 179, 170, 175, 186, 159, 
    161, 178, 175, 185, 175, 162, 173, 172, 177, 175, 172, 177, 180] 
h.sort() 
hmean = np.mean(h) 
hstd = np.std(h) 
pdf = stats.norm.pdf(h, hmean, hstd) 
plt.plot(h, pdf) # including h here is crucial 

И вот я получаю: enter image description here

+0

Большое вам спасибо, но как насчет показа DATA с этим? – Adel

+0

@ user108864 бессмысленно напрямую связывать фактические значения массива данных вместе с этим. На этом графике показан pdf, оцененный в точках данных. Вы можете построить гладкую (смотрящую) функцию плотности вероятности, оцененную на плотном множестве точек, вы можете построить функцию плотности вероятности, оцененную на ваших входных данных (как в этом ответе), и вы можете построить гистограмму (как я писал в предыдущей вопрос). Какова ваша общая цель? – YXD

+0

@ user108864 См. Наш ответ. Возможно, вам понравится;) – Developer