20

私はグーグルで検索し、テストしましたが、これで私は頭がおかしくなりました。類似性によってグループ化する必要がある数字のリストがあります。たとえば、[1, 6, 9, 100, 102, 105, 109, 134, 139] のリストでは、1 6 9 がリストに入れられ、100、102、105、および 109 がリストに入れられます。リスト、および134と139。私は数学が苦手で、これを試してみましたが、うまくいきません。できるだけ明確にするために、互いに 10 の値以内にある数値をグループ化したいと考えています。誰でも助けることができますか?ありがとう。

4

3 に答える 3

39

クラスター分析を行うには多くの方法があります。簡単な方法の 1 つは、連続するデータ要素間のギャップ サイズを確認することです。

def cluster(data, maxgap):
    '''Arrange data into groups where successive elements
       differ by no more than *maxgap*

        >>> cluster([1, 6, 9, 100, 102, 105, 109, 134, 139], maxgap=10)
        [[1, 6, 9], [100, 102, 105, 109], [134, 139]]

        >>> cluster([1, 6, 9, 99, 100, 102, 105, 134, 139, 141], maxgap=10)
        [[1, 6, 9], [99, 100, 102, 105], [134, 139, 141]]

    '''
    data.sort()
    groups = [[data[0]]]
    for x in data[1:]:
        if abs(x - groups[-1][-1]) <= maxgap:
            groups[-1].append(x)
        else:
            groups.append([x])
    return groups

if __name__ == '__main__':
    import doctest
    print(doctest.testmod())
于 2013-02-09T01:31:56.090 に答える
6

これにより、グループが見つかります。

nums = [1, 6, 9, 100, 102, 105, 109, 134, 139]
for k, g in itertools.groupby(nums, key=lambda n: n//10):
    print k, list(g)

0 [1, 6, 9]
10 [100, 102, 105, 109]
13 [134, 139]

サンプルが示すように nums が実際にソートされていない場合は、最初にソートする必要があることに注意してください。

于 2013-02-09T01:29:33.817 に答える