2016-04-06 7 views
4

Мне нужно вычислить плотность вероятности функции 1/2-х, где х представляет собой случайное число в диапазоне от 0 до 1.MATLAB Гистограмме Проблема

Моего кода выглядит следующим образом:

n=10^6; 
b=10^2; 

x=(1./(2-(rand(1,n)))); 

a=histfit(x,b,'kernel'); % Requires Statistics and Machine Learning Toolbox 
xlim([0.5 1.0]) 

И я получаю приличный график, который выглядит следующим образом:

enter image description here

Как это может быть очевидно, есть несколько проблем с этим:

  1. MATLAB рисует припадок, который отличается от моей гистограммы, потому что он считает в пустом пространстве вне [0.5 1] диапазона функции, а также. Это приводит к искаженной подгонке к краям. (Причина, по которой вы не видите пустое место, потому что я ввел xlim там)

  2. Я не знаю, как я мог бы разделить каждое значение по оси Y на 10^6, что дало бы мне мой плотность вероятности.

Заранее спасибо.

+0

но 'kernel' метод делает 100 оконных средний ваши данные, поэтому он предназначен для непрерывных данных ... Я не думаю, что вы можете избежать этого, если не расширить свои данные и отбросьте первую и последнюю ячейки вашей гистограммы ... – GameOfThrows

+0

Вот что я подумал, как мне расширить данные? Я не * имею * использовать ядро, поэтому, если есть лучший вариант, который я хотел бы знать. Другие дают кривые, которые не подходят вообще. – wololo

ответ

2

1. Лучший результат можно получить, используя ksdensity и указав опору для распределения.

2. Используя hist, у вас есть доступ к подсчетам и центрам, таким образом нормализация, чтобы получить плотность, проста.

Код для демонстрации предложения:

rng(125) 
n=10^6; 
b=10^2; 

x=(1./(2-(rand(1,n)))); 

subplot(1,2,1) 
a = histfit(x,b,'kernel'); 
title('Original') 
xlim([0.5 1.0]) 

[f,c] = hist(x,b); 
% normalization to get density 
f = f/trapz(c,f); 

% kernel density 
pts = linspace(0.5, 1, 100); 
[fk,xk] = ksdensity(x, pts, 'Support', [0.5, 1]); 

subplot(1,2,2) 
bar(c,f) 
hold on 
plot(xk,fk, 'red', 'LineWidth', 2) 
title('Improved') 
xlim([0.5 1.0]) 

Сравнивая результаты: enter image description here

EDIT: Если вам не нравится концовка:

pts = linspace(0.5, 1, 500); 
[fk,xk] = ksdensity(x, pts, 'Support', [0.5, 1]); 
bar(c,f) 
hold on 
plot(xk(2:end-1),fk(2:end-1), 'red', 'LineWidth', 2) 
title('Improved_2') 
xlim([0.5 1.0]) 

enter image description here

+0

Спасибо, но я получаю ту же проблему, когда я увеличиваю график. Однако это определенно улучшилось. – wololo

+0

Я бы не назвал это той же проблемой, поскольку улучшенная функция плотности ядра поддерживает [0,5, 1.0] по сравнению с исходным решением, которое распространяется на это. Если вам не нравятся резко падающие окончания, вы можете просто оставить первый и последний элементы 'fk' и' xk'. Оконечность поддержки может быть достигнута путем экстраполяции. Точность может быть улучшена за счет большего количества очков 'pts'. – Arpi

3

Чтобы решить обе свои проблемы, я предлагаю использовать hist (обратите внимание, что если у вас есть версия выше 2010b, вместо этого вы должны использовать histogram) вместо histfit, чтобы сначала получить значения вашей гистограммы, а затем сделать регрессию и построить их:

n=10^6; 
b=10^2; 
x=(1./(2-(rand(1,n)))); 

[counts,centers]=hist(x,b); 
density = counts./trapz(centers, counts); 
%// Thanks to @Arpi for this correction 
polyFitting = polyfit(centers,density,3) 
polyPlot = polyval(polyFitting,centers) 
figure 
bar(centers,density) 
hold on 
plot(centers,polyPlot,'r','LineWidth',3) 

Вы также можете изменить разрешение, отрегулировав значение b, которое в настоящее время установлено на 100. Также попробуйте разные регрессии, чтобы посмотреть, какой из них вы предпочитаете.

result looks like

+0

Правильная плотность будет 'counts/trapz (центры, counts)'. Я был бы осторожен с использованием полинома для представления функции cdf, некоторые теоретические обоснования всегда должны быть предпочтительными. – Arpi

+0

Правда, что касается использования полинома для представления этой функции cdf, я использовал это для простоты, я думаю, что OP мог использовать любой тип фитинга, который он предпочитает. – GameOfThrows

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