2011-11-20 2 views
1

나는 인덱스 의 색인 p 및 해당 가중치가 있습니다. 이 대체물이없는 k 개의 샘플을 얻고 싶습니다. 여기서 선택은 가중치에 무작위로 비례하여 수행됩니다.대체하지 않고 가중치 샘플링

내가 randsample

J = randsample(p,k,true,w) 

말에 의해 교체와 선택에 사용 될 수 있다는 것을 알고 있지만 나는 매개 변수 false 대신 true로를 호출 할 때, 나는

??? Error using ==> randsample at 184 
Weighted sampling without replacement is not supported. 

내가 내 자신의 기능을 썼다 얻을 예 : discussed in here :

p = 1:n; 
J = zeros(1,k); 
for i = 1:k 
    J(i) = randsample(p,1,true,w); 
    w(p == J(i)) = 0; 
end 

그러나 루프에 k 반복이 있으므로이 작업을 수행하는 데 더 짧은 방법을 원합니다. 의견 있으십니까?

편집 : 나는 무작위로 일부 가중치 기준에 행렬 비례의 k 고유의 열을 선택합니다. 그래서 대신 교체없이 샘플링을 사용합니다.

답변

3

교체가 필요없는 샘플링은 샘플이 더 이상 독립적이지 않으므로 어떤 종류의 루프는 피할 수 없다고 생각합니다. 게다가 대체하지 않고 샘플링 할 때 실제로 가중치는 무엇을 의미합니까?

비교적 작은 샘플 크기의 경우 성능에 문제가 있음을 알지 못합니다. 기본적으로 내가 생각할 수있는 모든 솔루션은 사용자가 한 일을 수행하지만 실제로는 randsample에서 진행중인 작업을 확장 할 수 있습니다.

+0

내가 할 수있는 방법을 찾지 못했습니다. 여기 알고리즘 (http://stackoverflow.com/questions/2140787/select-random-k-elements-from-a-list-whose-elements-have-weights)은 광산과 비슷하며 O (n + k)에서 작동합니다.) 시각. 답장을 보내 주셔서 감사합니다. 나는 왜 이것이 필요한지 질문에 추가 할 것이다. – petrichor

1

나는 for를 계속 사용해야한다고 생각 하나, 해당 weight를 하나 줄이면 좋습니다.

w(p == J(i)) = w(p == J(i)) -1; 
0

샘플 수 소자의 수보다 훨씬 작은 경우에 잘 수행 petrichor의 루프에 대한 접근에 대한 대안은 여분으로 가중 된 랜덤 샘플을 계산하고 중복을 제거하는 것이다. 물론 샘플 수인 k이 요소 수 근처에 있으면 많은 반복이 필요하기 때문에 이것은 매우 나쁜 생각입니다.하지만 루프를 피함으로써 벽시계 성능이 향상되는 경우가 많습니다. 귀하의 마일리지가 다를 수 있습니다.

function I=randsample_noreplace(n,k,w) 
I = sort(randsample(n, k, true, w)); 
while 1 
    Idup = find(I(2:end)-I(1:end-1) ==0); 
    if length(Idup) == 0 
      break 
    else 
      I(Idup)=randsample(n, length(Idup), true, w); 
      I = sort(I); 
    end 
end 
0

당신이 컬럼의 많은 부분을 선택합니다 (즉, k는 매우 작은 n보다하지) 또는 무게가 매우 비대칭 인 경우에, 당신은 보장 제프의 솔루션이 세련미를 사용할 수 있습니다 randsample에 대한 각 호출은 이전 샘플과 다른 샘플을 생성합니다.

또한, 대체가없는 실제 샘플링이 정렬되지 않고 리턴되는 순서로 샘플을 리턴합니다.

function I=randsample_noreplace(n,k,w) 
I = randsample(n, k, true, w); 
while 1 
    [II, idx] = sort(I); 
    Idup = [false, diff(II)==0]; 
    if ~any(Idup) 
     break 
    else 
     w(I) = 0;   %% Don't replace samples 
     Idup (idx) = Idup; %% find duplicates in original list 
     I = [I(~Idup), (randsample(n, sum(Idup), true, w))]; 
    end 
end 

균일 가중치 30 개 값이 추가없이 라인 (26)과 비교하여 3 개 또는 4의 반복을 취 (최소 이득을 제공하는 경우)의 출력 (29)을 선택하는 단계를 포함한다. 가중치가 균등하게 선택되면 추가 선이 없으면 약 3 ~ 5 회의 반복이 소요되지만 약 80 회의 반복이 필요합니다.

또한, 반복 횟수가 K에 의해 제한되어 있지만 분포가 비뚤어.

1

이 여전히 검색 결과에 표시, 그래서 옵션으로 datasample 기능을 추가하고 싶었다. 다음 코드는 해당 벡터 myWeights에 따라 fromVector에서 5 단위의 가중 샘플을 제공합니다.

mySample = datasample(fromVector, 5, 'Replace', false, 'Weights', myWeights) 
관련 문제