2013-04-19 22 views
0

Предполагается, что y является вектором со случайными номерами, следующим за распределением f(x)=sqrt(4-x^2)/(2*pi). В настоящий момент я использую команду hist(y,30). Как я могу построить функцию распределения f(x)=sqrt(4-x^2)/(2*pi) в ту же гистограмму?График Matlab в гистограмме

+0

Разве вы уже черчения его с 'hist'? –

+0

Грубая идея состоит в том, чтобы вызвать hist с двумя выходами, поэтому он дает вам центры и подсчеты. Затем вы вручную закроете график и наложите масштабированную функцию плотности поверх графика штриха. См. Мой ответ ниже. – rajb245

ответ

1

Вместо нормализации численно вы также можете сделать это, найдя теоретический коэффициент масштабирования следующим образом.

nbins = 30; 
nsamples = max(size(y)); 
binsize = (max(y)-min(y))/nsamples 
hist(y,nbins) 
hold on 
x1=linspace(min(y),max(y),100); 
scalefactor = nsamples * binsize 
y1=scalefactor * sqrt(4-x^2)/(2*pi) 
plot(x1,y1) 

Обновление: Как это работает.

Для любого набора данных, который достаточно велик, чтобы дать хорошее приближение к PDF (назовем его f (x)), интеграл от f (x) по этой области будет приблизительно равен единице. Однако мы знаем, что площадь под любая гистограмма точно равна общему количеству выборок, умноженному на ширину бина.

Таким образом, очень простой масштабный коэффициент для перевода pdf в линию с гистограммой - Ns * Wb, общее количество точек выборки умножается на ширину бункеров.

+0

Этот ответ не имеет достаточного контекста сам по себе. Можете ли вы улучшить ответ, чтобы быть самодостаточным? – rajb245

+0

Я думал, что вычисление «scalefactor» было довольно ясно из предоставленного кода. Однако я могу добавить некоторые подробности **, почему ** этот конкретный масштабный коэффициент работает. См. Обновленный ответ. – Stuart

1

Приведем пример другой функции распределения, стандартной нормали. Чтобы сделать именно то, что вы говорите, вы делаете это:

nRand = 10000; 
y = randn(1,nRand); 
[myHist, bins] = hist(y,30); 
pdf = normpdf(bins); 
figure, bar(bins, myHist,1); hold on; plot(bins,pdf,'rx-'); hold off; 

Это, вероятно, НЕ то, что вы на самом деле хотите. Зачем? Вы заметите, что ваша функция плотности выглядит как тонкая линия в нижней части графика гистограммы. Это связано с тем, что гистограмма представляет собой количество чисел в ячейках, а функция плотности нормируется на интеграцию в единицу. Если у вас есть сотни предметов в корзине, то функция плотности не будет соответствовать шкале, поэтому у вас есть проблема масштабирования или нормализации. Либо вы должны нормализовать гистограмму, либо построить масштабированную функцию распределения. Я предпочитаю, чтобы масштабировать функцию распределения, так что мои отсчеты бы бессмысленно, когда я смотрю на гистограмму:

normalizedpdf = pdf/sum(pdf)*sum(myHist); 
figure, bar(bins, myHist,1); hold on; plot(bins,normalizedpdf,'rx-'); hold off; 

Ваш случай тот же, за исключением того, вы будете использовать функцию F (х) вы указали вместо normpdf команда.

1

Позвольте мне добавить еще один пример смеси:

%# some normally distributed random data 
data = randn(1e3,1); 

%# histogram 
numbins = 30; 
hist(data, numbins); 
h(1) = get(gca,'Children'); 
set(h(1), 'FaceColor',[.8 .8 1]) 

%# figure out how to scale the pdf (with area = 1), to the area of the histogram 
[bincounts,binpos] = hist(data, numbins); 
binwidth = binpos(2) - binpos(1); 
histarea = binwidth*sum(bincounts); 

%# fit a gaussian 
[muhat,sigmahat] = normfit(data); 
x = linspace(binpos(1),binpos(end),100); 
y = normpdf(x, muhat, sigmahat); 
h(2) = line(x, y*histarea, 'Color','b', 'LineWidth',2); 

%# kernel estimator 
[f,x,u] = ksdensity(data); 
h(3) = line(x, f*histarea, 'Color','r', 'LineWidth',2); 

legend(h, {'freq hist','fitted Gaussian','kernel estimator'}) 

hist

Смежные вопросы