2014-11-13 3 views
0

일부 인구를 설명하는 값 목록이 있습니다. 아래의 히스토그램 에서처럼 값은 두 개의 피크로 분산됩니다. histogram with two distinct peaks파이썬에서 인구를 2로 나누기

배포판 중앙의 "간격"을 자동으로 감지하고 초기 목록을 양면으로 나누는 간단한 방법이 있습니까? 가능한 경우 numpy를 사용하는 것이 이상적입니다.

편집 추가 : 나는 "합리적"인 더 강력한 방법이있다 바라고 있어요, 분명히 난 그냥 목록을 정렬 할 수 있습니다 그것을 반복과 제 제로 값을 분할하지만, 심지어 두 개의 피크 경우 그렇게 명확하게 분리되어 있지 않습니다. 스트라이크로 코멘트가 작동하지 않습니다. 데이터는 0이 아닌 히스토그램입니다.

+0

하나의 분할 ? 예를 들어 하나 더 많은 샘플이 있다면 어떻게 되나요? 0.4 –

+0

글쎄요, 오직 2 개의 하위 집단 만이 원래 가정의 일부였습니다. 그러나 당신은 저에게 특별한 경우에 대해 질문하게했습니다! – lost

답변

1

예를 들어 그룹에 연속적인 샘플의 두 개의 '그룹'이있는 경우와 같이 사전에 분포에 대한 정보가있는 경우. 그런 다음 순진한 알고리즘을 사용할 수 있습니다 : 두 샘플 간의 더 큰 차이를 찾으십시오.

그러나 집합 (클러스터)에 인구 spliting의 문제가 아닌 사소한이며, 일반적으로 기계 학습 클러스터링 알고리즘을 통해 해결 : 제기로 http://scikit-learn.org/stable/modules/clustering.html

+0

감사합니다. 실제로이 질문을 정확히 받아 들일 것이지만, 원래의 질문에 정확히 답할 것이지만 추가 답변으로 더 유연한 접근법을 제안하십시오. – lost

0

장 - 루의 대답은 질문에 적합합니다. 그러나 작동하면서 간단한 구현을하면 문제에 대해 좀 더 생각할 수 있었고, 유용 할 경우에 대비해 생각해 보았습니다.

def split_population2(seq, n_bins): 
    """ Split a population into sub-populations 

     Based on binning the data into n_bins and finding contigous groups of non-empty bins. 

     Returns [lowest, ..., highest] all of which are sorted sequences 
    """ 
    sorted_pop = sorted(seq) 

    # bin the data into n_bins in a 2d structure, one sequence for each bin: 
    _ , bins = np.histogram(sorted_pop, bins=n_bins) 
    bin_indices = np.digitize(sorted_pop, bins) 
    binned = [] 
    for i in range(len(bins)+1): 
     binned.append([]) 
    for ix_bin, v in zip(bin_indices, sorted_pop): 
     binned[ix_bin].append(v) 

    # now join-up non-empty bins 
    joined_bins = [[]] # so 2D, with initially 1 sub-list 
    len_last_bin = 0 
    for bin in binned: 
     len_bin = len(bin) 
     if len_bin == 0 and len_last_bin != 0: # will correctly handle the case where bin 0 is empty 
      joined_bins.append([]) 
     if len_bin != 0: 
      joined_bins[-1].extend(bin) 
     len_last_bin = len_bin 

    return joined_bins 

나는이 2 개 이상의 하위 인구가있는 경우에 작동하고, 하위 집단이 명확하게 분리되는 경우에 상대적으로 견고해야한다고 생각합니다. 단점은 어떤 경우에는 대답이 n_bins에 대해 선택된 값에 달려 있다는 것입니다.

original histogram histogram showing sub-populations

관련 문제