#matlab #plot #statistics #distribution
#matlab #график #Статистика #распределение
Вопрос:
x = [1 2 3 3 4]
cdfplot(x)
После поиска в Google я обнаружил, что приведенный выше код нарисует для меня кумулятивную функцию распределения в Matlab.
Есть ли простой способ нарисовать функцию плотности вероятности?
Для пояснения. Мне нужен график с равномерно распределенной осью x. И я бы предпочел, чтобы это не выглядело как гистограмма. (У меня были бы миллионы целых чисел)
Извините, обновите еще раз. Мои данные представляют собой целые числа, но на самом деле они представляют время (я ожидаю несколько довольно высоких пиков при точно таком же значении, в то время как другое значение должно выглядеть так, как будто они не являются дискретными). Я на самом деле начинаю задаваться вопросом, действительно ли это не дискретные целые числа по своей сути. CDF определенно сработал бы, но при переходе к PDF кажется, что это сложнее, чем я ожидал.
Комментарии:
1. Что вы подразумеваете под «равномерно распределенной осью x»?
2. @gnovice, Как вы сделали в новом ответе.
3. Взгляните на функцию ksdensity. Это реализация оценки плотности ядра. mathworks.com.au/help/toolbox/stats/ksdensity.html
Ответ №1:
Вы можете сгенерировать дискретное распределение вероятностей для ваших целых чисел, используя функцию hist
:
data = [1 2 3 3 4]; %# Sample data
xRange = 0:10; %# Range of integers to compute a probability for
N = hist(data,xRange); %# Bin the data
plot(xRange,N./numel(data)); %# Plot the probabilities for each integer
xlabel('Integer value');
ylabel('Probability');
И вот результирующий график:
Обновить:
В более новых версиях MATLAB hist
функция больше не рекомендуется. Вместо этого вы можете использовать histcounts
функцию, подобную so, для получения того же рисунка, что и выше:
data = [1 2 3 3 4];
N = histcounts(data, 'BinLimits', [0 10], 'BinMethod', 'integers', 'Normalization', 'pdf');
plot(N);
xlabel('Integer value');
ylabel('Probability');
Комментарии:
1. @gnovice: просто небольшая точка, которую вы должны, в общем, разделить на площадь гистограммы, а не на количество точек данных , чтобы получить pdf. Итак, последняя строка должна гласить
bar(X,N/trapz(X,N))
. Поскольку в этом примере точки отсчета являются целыми числами с интервалом в единицу, обаnumel
иtrapz
дают один и тот же ответ,4
но если это не так, они будут разными.2. @yoda: Вы правы, но Джин упомянул о необходимости делать это для целых значений (т. Е. дискретного распределения вероятностей), поэтому я подумал, что сделаю это проще.
3. Спасибо за ваш ответ, у меня есть еще один вопрос, gnovice. Комментарий @ yoda вызвал мое беспокойство. Будет ли это по-прежнему работать правильно, если x = [100 200 400 400 550]
4. Я попробую оба на своих реальных данных. Спасибо вам всем!
5. @Gene: Если бы у вас был
data = [100 200 400 400 550];
и указан диапазон целых чисел типаxRange = 0:600;
, вы бы получили график, который в основном равнялся 0, за исключением пиков 0,2, когда x равно 100, 200 и 550, и пика 0,4, когда x равно 400. В качестве альтернативного способа отображения ваших данных вы можете попробовать стержневой график вместо обычного линейного графика. Это может выглядеть лучше.
Ответ №2:
Если вам нужна функция непрерывного распределения, попробуйте это.
x = [1 2 3 3 4]
subplot(2,1,1)
ksdensity(x)
axis([-4 8 0 0.4])
subplot(2,1,2)
cdfplot(x)
grid off
axis([-4 8 0 1])
title('')
Который выводит это.
Функция кумулятивного распределения находится внизу, оценка плотности ядра — вверху.
Ответ №3:
введите «ksdensity» в справке matlab, и вы узнаете функцию, которая предоставит вам непрерывную форму PDF. Я думаю, это именно то, что вы ищете.
Ответ №4:
В дополнение к гладкому PDF, полученному с помощью ksdensity(x)
, вы также можете построить гладкий график CDF с помощью ksdensity(x,'function','cdf')
.