Menu
CoddyTech

단계별 병합

Coddy Machine Learning 여정의 비지도 학습 섹션에 포함된 레슨. 51개 중 16번째.

이 장에서는 데이터의 계층도를 만들고, 이를 그룹으로 나눕니다. 크기와 무게에 따라 분류한 열 가지 스포츠 공을 살펴보겠습니다.

열 가지 스포츠 공을 나타낸 트리 다이어그램. 골프공, 테니스공, 야구공처럼 작은 공은 한쪽 아래에서 서로 합쳐지고, 축구공과 농구공처럼 큰 공은 반대쪽에서 합쳐집니다. 점선이 트리를 잘라 두 그룹으로 나눕니다

트리는 아래에서 위로 자랍니다. 각 점을 하나씩 두고 시작한 다음, 가장 가까운 두 그룹을 합치고 반복합니다:

강을 따라 2, 7, 15, 19, 33미터 지점에 있는 다섯 개의 텐트를 다섯 줄로 그렸습니다. 1단계에서는 15와 19를 합치고, 2단계에서는 2와 7을 합치며, 3단계에서는 그 두 그룹을 합치고, 4단계에서는 33을 더합니다

두 그룹 사이의 간격은 각 그룹 평균 사이의 간격입니다. 리스트를 병합하면 다음과 같습니다:

groups = [[2], [7], [15, 19], [33]]
groups[0] = groups[0] + groups[1]  # 리스트들을 합치기
groups.pop(1)  # [7]을 제거하기, 이제 그룹 0에 있음
print(groups)

이것은 [[2, 7], [15, 19], [33]]을 출력합니다. 병합을 거듭하는 방식, 즉 응집형 군집화입니다.

challenge icon

챌린지

중급

가족들은 해변 우산을 서로 가까이 세웁니다. spots에 있는 우산 10개를 병합하여 wanted개의 그룹이 남을 때까지 묶으세요. closest_pair(groups)는 가장 가까운 두 그룹의 위치 i, j를 반환합니다.

  1. 각 우산을 하나씩 목록에 담아 시작합니다.
  2. wanted보다 그룹이 많으면 병합 결과를 출력하고, 해당 쌍을 합친 다음 두 번째 그룹을 제거합니다.
  3. 남은 그룹을 출력합니다.

다른 우산 위치와 wanted가 3인 경우:

Merge [33] and [35]
Merge [30] and [33, 35]
Merge [3] and [8]
3 groups: [[3, 8], [30, 33, 35], [70]]

직접 해보기

import numpy as np

# 인명구조대 탑에서 비치파라솔 10개가 있는 곳까지의 거리(미터)
spots = [2, 9, 11, 31, 45, 46, 69, 74, 92, 96]


# 평균이 가장 가까운 두 그룹의 위치 i, j (i < j)를 반환합니다
def closest_pair(groups):
    best_i, best_j = 0, 1
    best_gap = abs(np.mean(groups[0]) - np.mean(groups[1]))
    for i in range(len(groups)):
        for j in range(i + 1, len(groups)):
            gap = abs(np.mean(groups[i]) - np.mean(groups[j]))
            if gap < best_gap:
                best_i, best_j, best_gap = i, j, gap
    return best_i, best_j


wanted = int(input())

# 아래에 코드를 작성하세요
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

비지도 학습의 모든 레슨

직접 연습해 보세요: 온라인 Python 컴파일러