2013-09-05 3 views
1

Мне нужно создать кумулятивное распределение из некоторых чисел, содержащихся в векторе. Вектор подсчитывает количество раз, когда операция точечного произведения происходит в алгоритме, который мне дал.Создание кумулятивного распределения от вектора

Пример вектор будет

myVector = [100 102 101 99 98 100 101 110 102 101 100 99] 

Я хотел бы построить вероятность того, что у меня есть меньше, чем 99 точечных продукты, против диапазона от 0 до 120. Встроенного функции

Cumdist(MyVector) 

Не подходит, поскольку мне нужно построить более широкий диапазон, чем в настоящее время предоставляет кумдист.

Я попытался с помощью

plot([0 N],cumsum(myVector)) 

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

Вот некоторые питона код, который делает то, что я хочу:

count = [x[0] for x in tests] 
found = [x[1] for x in tests] 
found.sort() 
num = Counter(found) 
freqs = [x for x in num.values()] 
cumsum = [sum(item for item in freqs[0:rank+1]) for rank in xrange(len(freqs))] 
normcumsum = [float(x)/numtests for x in cumsum] 

испытания представляет собой список чисел, представляющих число раз скалярное произведение было сделано.

Вот пример того, что я ищу:

Example cumulative distribution

+2

Не могли бы вы добавить дополнительную информацию? Пример даст нам больше понимания. – Nick

+0

@RodyOldenhuis Я думаю, что дубликаты должны давать более высокие увеличения, чем одиночные значения. –

ответ

3

Для создания кумулятивного распределения, вы не можете использовать cumsum на вектор непосредственно. Выполните следующие действия, вместо:

sortedVector = sort(myVector(:)); 
indexOfValueChange = [find(diff(sortedVector));true]; 
relativeCounts = (1:length(sortedVector))/length(sortedVector); 

plot(sortedVector(indexOfValueChange),relativeCounts(indexOfValueChange)) 

EDIT

Если ваша цель просто изменить й-диапазон вашего участка,

xlim([0 120]) 

должен делать то, что вам нужно.

+0

Как изменить ось x, чтобы перейти от 0 до 150, скажем? –

+0

@TomKealy: см. Мое редактирование – Jonas

+0

фантастическое спасибо! –

1

Вот как я бы это сделать:

myVector = [100 102 101 99 98 100 101 110 102 101 100 99]; 
N = numel(myVector); 
x = sort(myVector); 
y = 1:N; 
[xplot , idx] = unique(x,'last') 
yplot = y(idx)/N 
stairs(xplot,yplot) 

%Optionally 
xfull = [0 xplot 120] 
yfull = [0 yplot 1] 
stairs(xfull,yfull) 
+0

Ваш «необязательный» случай идентичен тому, что 'ecdf' возвращает в этом случае, за исключением того, что' xfull (1) 'должно быть 98 (' min (myVector) '), а не 0. – horchler

+0

@horchler Я не понимаю, прежде чем вы заметите что-то эмпирическое распределение будет 0. –

+0

Я думаю, что точка эмпирического CDF заключается в том, что он принимает только значения, присутствующие в данных. Он предполагает, что минимальное значение данных соответствует нижней границе распределения и аналогично для максимального значения данных. В этом случае нет данных, чтобы показать, что '0' даже содержится в поддержке распределения. – horchler

1

Пять часов и ответ уже приняты, но если вы все еще заинтересованы в другой ответ ...

Что вы пытаетесь do получает empirical CDF ваших данных. У Matlab's Statistics Toolbox, который, скорее всего, есть, есть функция, чтобы сделать это точно статистически: ecdf. Так что все, что вам действительно нужно сделать, это

myVector = [100 102 101 99 98 100 101 110 102 101 100 99]; 
[Y,X] = ecdf(myVector); 
figure; 
plot(X,Y); 

Вы можете использовать stairs вместо plot, чтобы отобразить истинную форму эмпирического распределения.

+0

Почувствовал, что что-то не так, но не думал о лестнице. Очень хорошо. –

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