2017-03-22 4 views
1

2 중 교차 유효성 검사를하고 싶은 입력 2D 히스토그램이 있습니다. 문제는 히스토그램에서 상호 배타적 인 두 개의 무작위 샘플 데이터를 추출하는 방법을 모르겠다는 것입니다. 각 데이터 요소의 위치 정보 목록이 두 개인 경우 쉽게 동일하게 목록의 데이터를 섞어 목록을 균등하게 분할 할 수 있습니다.무작위로 히스토그램 데이터를 선택하십시오. MATLAB

list1 = [1,2,3,3,5,6,1]; 
list2 = [1,3,6,6,5,2,1]; 

idx = randperm(length(list1)); % ie. idx = [4 3 1 5 6 2 7] 
shlist1 = list1(idx); % shlist1 = [3,3,1,5,6,2,1] 
shlist2 = list2(idx); % shlist2 = [6,6,1,5,2,3,1] 

slist1 = shlist1(1:3); % slist1 = [3,3,1] 
elist1 = shlist1(4:6); % elist1 = [5,6,2,1] 
slist2 = shlist2(1:3); % slist2 = [6,6,1] 
elist2 = shlist2(4:6); % elist2 = [5,2,3,1] 

을하지만이 같은 데이터를 막대 그래프로 나에게 제시 한 경우

hist = [2 0 0 0 0 0] 
     [0 0 0 0 0 1] 
     [0 1 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 0 0 1 0] 
     [0 0 2 0 0 0] 

나는 결과가이

과 같이 할 것을 권장합니다

그래서 목록은 내가 이런 짓을 했을까

hist1 = [0 0 0 0 0 0] 
     [0 0 0 0 0 1] 
     [0 1 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 1 0 0 0] 

hist2 = [2 0 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 0 0 1 0] 
     [0 0 1 0 0 0] 

데이터의 다른 절반이 무작위로 두 개의 새로운 히스토그램에 똑같이 할당됩니다.

각 bin hist (i, j)의 임의의 정수 높이를 취하여이를 hist1 (i, j)의 등가 bin에 추가하고 hist2 (i, j)와의 차이를 더하는 것과 동일합니까?

% hist as shown above 
hist1 = zeros(6); 
hist2 = zeros(6); 
for i = 1:length(hist(:,1))*length(hist(1,:)) 
    randNum = rand; 
    hist1(i) = round(hist(i)*randNum); 
    hist2(i) = hist(i) - hist1(i); 
end 

해당하는 경우 더 좋은 방법/내장 방법이 있습니까?

내 실제 히스토그램은 300x300 크기이며 약 6,000,000 개의 데이터 요소가 포함되어 있으며 빠른 속도가 필요합니다. 어떤 도움 :)에 대한

감사

편집 : 그것의 전체 확률 밀도 함수를 유지하지 않는 는 내가 만든 코드의 제안 비트, 목록에서 위치 점의 무작위 표본을 복용에 해당하지 않습니다 자료. 히스토그램을 반으로 줄이면 6 백만 포인트가 좋지만 몇 가지 방법으로는 여전히 작동 할 수있는 방법을 기대하고 있습니다.

답변

0

rand 또는 randi을 사용하여 두 개의 히스토그램을 생성 할 수 있습니다. 첫 번째 방법은 더 효율적이지만 두 번째 방법은 더 무작위입니다.

h = [[2 0 0 0 0 0] 
     [0 0 0 0 0 1] 
     [0 1 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 0 0 1 0] 
     [0 0 2 0 0 0]]; 

%using rand  
h1 = round(rand(size(h)).*h); 
h2 = h - h1; 

%using randi 
h1 = zeros(size(h)); 
for k = 1:numel(h) 
    h1(k) = randi([0 h(k)]); 
end 
h2 = h - h1; 
+0

고마워요. 제가 제안한 방법과 똑같은 일을합니다. 우아하고 효율적 일뿐입니다. 원래 제안한 방법의 문제점은 히스토그램이 확률 밀도 함수를 나타 내기 때문에 목록에서 위치 정보의 무작위 샘플을 가져온 것처럼 일반적인 모양을 보존해야합니다. 위의 방법에서는 대다수를 얻으 려 할 때 PDF가 많은 빈의 데이터를 거의 갖지 않을 가능성이 있습니다. – user1153070

+0

데이터 세트가 무한대 인 경우이 메소드는 각 막대 그래프를 반으로 분할하고 각 반을 두 개의 다른 막대 그래프에 저장해야합니다. 히스토그램을 반으로 줄이는 것만으로는 정확하지 않을 수도 있습니다. – user1153070

+0

@ user1153070 당신이 원하는 것을 지정해야한다고 생각합니다. 분할 방법 (반감)이 승인 된 종이/책을 기반으로한다면 당신이 옳고 원하는 것을하십시오. 그러나 당신의 질문에 당신이 배열을 임의로 랜덤하게 분할하는 효율적인 방법을 원한다고 대답했습니다. – rahnema1

0

H가 2D 히스토그램이라고 가정합니다. 다음 코드는 해당 인덱스의 개수에 비례하는 확률을 가진 임의의 단일 인덱스를 추출합니다. 이는 내가 원하는 것입니다.

cc = cumsum(H(:)); 
if cc(1) ~= 0 
    cc = [0; cc]; 
end 
m = cc(end); 
ix = find(cc > m*rand, 1); 

여러 샘플을 추출하려면 한 번의 호출로 n 개의 샘플을 추출하는 고유 한 찾기 기능 (효율적으로 이진 검색이 가능)을 작성해야합니다. 이렇게하면 각 인덱스에서 히스토그램 카운트에 비례하는 확률로 선택된 인덱스 벡터 (ix_vec라고 함)가 제공됩니다.

우리가 X에 의해 히스토그램의 각 위치에 해당하는 숫자 값을 표시 그런 경우에, 당신의 무작위 표본이다 : 두 번째 무작위 표본 세트에 대한

R1 = X(ix_vec); 

를 반복합니다.