2013-09-05 2 views
1

벡터에 포함 된 일부 숫자로 누적 분포를 만들어야합니다. 벡터는 내가 주어진 알고리즘에서 내적 연산이 발생하는 횟수를 계산합니다.벡터에서 누적 분포 만들기

예 벡터는 것

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

나는 0에서 기능 내장 (120)의 범위에 대해, 내가 미만 99 개의 제품을 가지고 확률을 음모하고 싶습니다

Cumdist(MyVector) 

현재 제공되는 cumdist보다 넓은 범위에서 플롯해야하므로 적절하지 않습니다.

나는

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)) 

편집

당신의 목표는 플롯의 x 범위를 수정하는 단지의 경우,

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

당신의 "선택적"경우는'xfull (1)'이 0이 아닌 98 ('min (myVector)')이어야한다는 것을 제외하면'ecdf'가 반환하는 것과 동일합니다. – horchler

+0

@horchler 이해가 안됩니다, 당신이 무언가를 관찰하기 전에 경험적 분포는 0이 될 것입니다. –

+0

경험적 CDF의 요점은 단지 데이터에 존재하는 값을 취한다는 것입니다. 최소 데이터 값은 분포의 하한에 상응하고 최대 데이터 값과 유사하다고 가정합니다. 이 경우 배포판의 지원에 '0'이 포함되었음을 나타내는 데이터가 없습니다. – horchler

1

5 시간과 대답을하지만 ... 또 다른 대답에 관심이 있다면 당신은에

을 시도하고 무엇 데이터의 empirical CDF을 가져 오는 것이 좋습니다. Matlab의 Statistics Toolbox는 통계적으로주의 깊게 정확하게 수행하는 기능을 가지고 있습니다 : ecdf. 당신은 경험적 분포의 진정한 모양을 표시 stairs 대신 plot을 사용할 수 있습니다

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

그래서 당신이 실제로 할 필요가있다.

+0

무언가가 옳지 않았지만 계단은 생각하지 않았다는 것을 느꼈습니다. 아주 좋아. –

관련 문제