단계별 병합
Coddy Machine Learning 여정의 비지도 학습 섹션에 포함된 레슨. 51개 중 16번째.
이 장에서는 데이터의 계층도를 만들고, 이를 그룹으로 나눕니다. 크기와 무게에 따라 분류한 열 가지 스포츠 공을 살펴보겠습니다.
트리는 아래에서 위로 자랍니다. 각 점을 하나씩 두고 시작한 다음, 가장 가까운 두 그룹을 합치고 반복합니다:
두 그룹 사이의 간격은 각 그룹 평균 사이의 간격입니다. 리스트를 병합하면 다음과 같습니다:
groups = [[2], [7], [15, 19], [33]]
groups[0] = groups[0] + groups[1] # 리스트들을 합치기
groups.pop(1) # [7]을 제거하기, 이제 그룹 0에 있음
print(groups)이것은 [[2, 7], [15, 19], [33]]을 출력합니다. 병합을 거듭하는 방식, 즉 응집형 군집화입니다.
챌린지
중급가족들은 해변 우산을 서로 가까이 세웁니다. spots에 있는 우산 10개를 병합하여 wanted개의 그룹이 남을 때까지 묶으세요. closest_pair(groups)는 가장 가까운 두 그룹의 위치 i, j를 반환합니다.
- 각 우산을 하나씩 목록에 담아 시작합니다.
wanted보다 그룹이 많으면 병합 결과를 출력하고, 해당 쌍을 합친 다음 두 번째 그룹을 제거합니다.- 남은 그룹을 출력합니다.
다른 우산 위치와 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())
# 아래에 코드를 작성하세요
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
비지도 학습의 모든 레슨
직접 연습해 보세요: 온라인 Python 컴파일러