"관련성" 측정항목을 기준으로 값을 그룹화하는 방법은 무엇입니까?

"관련성" 측정항목을 기준으로 값을 그룹화하는 방법은 무엇입니까?

세 개의 열이 있는 파일이 있습니다. 열 1과 2에는 동일한 그룹에서 가져온 숫자가 포함됩니다. 파일에는 일반적으로 그룹의 각 구성원 쌍에 대해 한 줄이 포함되어 있습니다.N회원님, 있어야 합니다.N×(N−1)/2줄.

3열은 1열과 2열의 숫자가 얼마나 밀접하게 관련되어 있는지 보여줍니다.

연결성이 0.2 이상인 연속 값 그룹(예: 범위)으로 소스 세트를 분할하고 싶습니다. 예를 들어, 다음과 같은 작은 데이터 세트에서:

입력하다:

1   2       0.222
1   3       0.213
1   4       0.014
1   5       0.001
1   6       0.555
1   7       0.509
2   3       0.213
2   4       0.014
2   5       0.001
2   6       0.555
2   7       0.709
2   8       0.509
3   4       0.995
3   5       0.323
3   6       0.555
3   7       0.225
3   8       0.001
4   5       0.095
4   6       0.058
4   7       0.335
4   8       0.005
5   6       0.995
5   7       0.658
5   8       0.650
6   7       0.431
6   8       0.333
7   8       0.754

출력은 다음과 같아야 합니다.

산출:

   G1: 1 2 3    G2: 4   G3 :5 6 7 8

1과 2, 3 사이의 연결성은 0.2보다 크기 때문에 1, 2, 3은 첫 번째 그룹에 배치되어야 합니다. 실제로 한 세트의 모든 숫자 쌍에는 충분한 연결성이 있어야 합니다. 1/2/3과 6 사이에는 높은 상관관계가 있지만(0.555 > 0.2), 이전 숫자(4와 5)는 1과 낮은 상관관계를 가지므로 6을 첫 번째 그룹에 배치해서는 안 됩니다. 따라서 4와 5를 건너뛰고 첫 번째 그룹의 숫자를 6과 연결할 수 없습니다.

4번은 5번과 밀접한 관련이 없으므로 4번은 단독으로 두 번째 그룹에 속해야 합니다. 4가 7과 관련성이 높다고 하더라도 이전 숫자(5와 6)는 4와 관련성이 낮기 때문에 중간 숫자를 건너뛰어 4와 7을 연결할 수 없습니다.

5는 6, 7, 8과의 연결성이 높습니다. 또한 숫자 쌍(예: 6/7, 6/8, 7/8)도 함께 높은 연결성을 갖습니다. 따라서 이들은 세 번째 그룹에 배치되어야 합니다. 이것이 바로 이 모든 숫자를 하나의 그룹에 배치할 수 있는 이유입니다.

실제 데이터는 숫자 1에서 시작하지 않고 100,000개 이상의 행이 있다는 점에 유의하세요. 그래서 그것은 거대합니다.

이것은 내 실제 데이터의 일부입니다.
입력:

    49997 49998 0.082
    49997 49999 0.953
    49997 50000 0.060
    49998 49999 0.288
    49998 50000 0.288
    49999 50000 0.265

출력은 다음과 같아야 합니다.

  G1:49997   G3: 49998 49999 50000

답변1

루프 입력. 첫 번째 숫자가 동일하고 연결성이 임계값을 초과하는 경우 동일한 그룹에 숫자를 추가합니다. 연결이 너무 낮으면 첫 번째 열의 두 번째 숫자가 나타날 때까지 아무 작업도 수행하지 마세요.

#!/usr/bin/perl
use warnings;
use strict;

my $THRESHOLD = 0.2;

my $next;
my @groups;
while (<>) {
    my ($n1, $n2, $connectedness) = split;
    @groups = ([ $next = $n1 ]) unless defined $next;
    if ($next == $n1) {
        if ($connectedness > $THRESHOLD) {
            push @{ $groups[-1] }, $n1 unless @{ $groups[-1] };
            push @{ $groups[-1] }, $n2;

        } else {
            $next = $n2;
            push @groups, [$n2];
        }
    }
}

for my $i (1 .. @groups) {
    print "Group $i: @{ $groups[ $i - 1 ] }\n";
}

관련 정보