머신 러닝 및 신경망 - 페이지 67

 

2.1 NN 소개(L02: 최근접 이웃 방법)



2.1 NN 소개(L02: 최근접 이웃 방법)

안녕하세요 여러분, 다시 오신 것을 환영합니다! 환상적인 첫 주를 보내셨기를 바랍니다. 우리가 다룬 내용을 간단히 요약해 보겠습니다. 강의 1에서는 기계 학습의 개념을 소개하고 수업 프로젝트에 대한 가장 일반적인 질문에 대해 논의했습니다. 곧 프로젝트에 대한 별도 공지를 드리겠습니다. 언급하고 싶은 한 가지는 Piazza에서 프로젝트의 팀원을 찾을 수 있는 기능을 활성화했다는 것입니다. 자세한 내용은 별도 공지를 통해 공유하도록 하겠습니다.

이제 강의 2로 넘어가겠습니다. 오늘은 고전적인 기계 학습 알고리즘이며 오늘날에도 여전히 널리 사용되는 k-최근접 이웃(KNN) 알고리즘에 주로 초점을 맞출 것입니다. 기계 학습 알고리즘의 작동 방식을 이해할 수 있기 때문에 기계 학습에 대한 가장 온화하고 직접적인 소개라고 생각합니다. KNN이 더 이상 가장 인기 있는 알고리즘이 아닐 수도 있지만 프로젝트에 포함하는 것이 좋습니다. 분류 작업 및 연속 출력 예측을 위한 성능 벤치마크 역할을 합니다. KNN은 예측 정확도와 계산 효율성에 대한 통찰력을 제공할 수 있습니다.

KNN의 작동 방식을 설명하는 것과 함께 계산 측면에 대해 말하자면 Big O 표기법의 개념도 다룰 것입니다. 이 표기법은 일반적으로 컴퓨터 과학에서 다양한 알고리즘의 효율성을 분석하는 데 사용됩니다. 기술적으로 들릴 수 있지만 Big O 표기법을 이해하는 것은 기계 학습뿐만 아니라 일반적인 프로그래밍에도 유용합니다.

이 강의가 끝날 무렵 KNN을 활용하는 방법을 보여주기 위해 Python에서 몇 가지 예제를 시연할 것입니다. 그러나 이것은 간략한 개요이며 강의 3에서는 설치 및 NumPy 및 scikit-learn과 같은 주요 라이브러리를 포함하여 Python에 대해 더 깊이 파고들 것입니다.

그럼 강의 2 시작하겠습니다! 우리는 주로 KNN 소개를 포함하여 가장 가까운 이웃 방법에 초점을 맞출 것입니다. 좀 더 접근하기 쉽도록 강의를 여섯 부분으로 구성했습니다.

  1. 가장 가까운 이웃 방법의 응용: 웹 사용 데이터 마이닝, 생체 인식, 이미지 분류 및 단백질 분석과 같은 KNN의 실제 응용을 탐구합니다. 이러한 예는 주제에 동기를 부여하는 데 도움이 됩니다.

  2. 가장 가까운 이웃 방법: KNN에 들어가기 전에 가장 간단한 사례인 가장 가까운 이웃 방법에 대해 논의할 것입니다. 이 방법에는 쿼리 포인트와 가장 유사한 데이터 포인트를 찾고 해당 레이블을 예측으로 사용하는 것이 포함됩니다.

  3. 최근접 이웃 방법의 결정 경계: 최근접 이웃 방법이 결정 경계를 결정하는 방법을 살펴보고 내부 작동 방식을 더 잘 이해할 수 있습니다.

  4. K-최근접 이웃 방법 소개: 하나가 아닌 여러 개의 최근접 이웃을 고려하는 KNN으로 전환합니다. K-최근접 이웃 분류기와 회귀자를 다룰 것입니다.

  5. K-최근접 이웃 알고리즘의 Big O 런타임 복잡성: Big O 표기법을 사용하여 KNN의 계산 효율성을 살펴보겠습니다. 이 주제는 알고리즘의 성능을 분석하는 데 중요합니다.

  6. K-최근접 이웃 알고리즘 개선: 이 부분에서는 KNN의 성능을 향상시키기 위한 아이디어와 요령을 제시합니다. 이 섹션에서는 알고리즘 최적화에 중점을 둡니다.

이러한 개념적 부분을 다룬 후 Python에서 KNN을 적용하는 단계로 넘어갈 것입니다. 일부에게는 이것이 가장 즐거운 부분일 수 있지만 실제 구현에 들어가기 전에 먼저 개념을 파악하는 것이 중요합니다.

다음 강의 3강에서는 Python 설치에 대해 자세히 알아보고 NumPy 및 scikit-learn을 포함한 주요 라이브러리를 다룰 것입니다. 계속 지켜봐 주시기 바랍니다! 강의 2를 시작하겠습니다. 가장 가까운 이웃 방법과 K-최근접 이웃 알고리즘을 살펴보고 훈련 세트의 모든 데이터 포인트에 대해 이 프로세스를 계속합니다. 루프가 끝나면 쿼리 지점에 가장 가까운 데이터 지점을 식별하게 됩니다.

가장 가까운 지점을 찾은 후 해당 레이블을 쿼리 지점에 대한 예측 레이블로 사용합니다. 분류 문제에서 레이블은 종종 클래스나 범주를 나타내는 범주 값입니다. 회귀 문제에서 레이블은 연속 값입니다.

최근접 이웃 알고리즘의 예측 단계를 요약하면 다음과 같습니다.

  1. 가장 가까운 거리는 무한대로, 가장 가까운 점은 None으로 초기화합니다.
  2. 트레이닝 세트의 각 데이터 포인트에 대해:
    • 현재 데이터 포인트와 쿼리 포인트 사이의 거리를 계산합니다.
    • 거리가 가장 가까운 거리보다 작은 경우:
      • 가장 가까운 거리를 현재 거리로 업데이트합니다.
      • 가장 가까운 지점을 현재 데이터 지점으로 설정합니다.
  3. 가장 가까운 지점의 레이블을 쿼리 지점에 대한 예측 레이블로 사용합니다.

이제 하나의 가장 가까운 이웃 방법에 대해 논의했으므로 k 가장 가까운 이웃의 보다 일반적인 경우로 이동하겠습니다. k개의 최근접 이웃 알고리즘은 가장 가까운 데이터 포인트를 찾는 개념을 k개의 가장 가까운 데이터 포인트를 찾는 것으로 확장합니다. 가장 가까운 이웃만 고려하는 대신 쿼리 포인트에 가장 가까운 교육 세트의 k 데이터 포인트를 고려합니다.

분류의 경우 예측 레이블은 k개의 가장 가까운 이웃 중에서 다수결로 결정됩니다. 각 이웃의 투표는 동일한 가중치를 가지며 가장 높은 투표 수를 가진 클래스가 예측 레이블이 됩니다.

회귀 문제의 경우 예측 레이블은 종종 k개의 최근접 이웃 레이블의 평균 또는 중앙값입니다. 레이블을 결합하는 특정 방법은 문제의 특성과 원하는 결과에 따라 다릅니다.

가장 가까운 이웃 방법의 결정 경계를 설명하기 위해 2차원 특징 공간을 고려해 보겠습니다. 서로 다른 기호(예: 삼각형과 사각형)로 표시되는 클래스 0과 클래스 1의 두 클래스가 있습니다. 결정 경계는 서로 다른 클래스의 영역을 구분하는 선 또는 곡선입니다.

가장 가까운 이웃 방법의 경우 결정 경계는 훈련 데이터 포인트의 윤곽을 따릅니다. 특징 공간의 각 포인트는 가장 가까운 학습 데이터 포인트의 레이블을 기준으로 분류됩니다. 결정 경계는 부드러운 곡선이 아니라 각 훈련 포인트 주변의 작은 영역 모음입니다.

k가 1보다 큰 k개의 가장 가까운 이웃 방법을 사용하면 결정 경계가 더 부드러워집니다. 더 많은 인접 포인트를 고려함에 따라 개별 교육 데이터 포인트의 영향이 줄어들어 보다 일반화된 경계가 생성됩니다. 결정 경계는 k개의 가장 가까운 이웃의 과반수 투표에 의해 결정되므로 클래스 간에 더 매끄럽고 연속적인 분리가 이루어집니다.

결정 경계의 개념을 이해하는 것은 k개의 최근접 이웃 알고리즘의 성능과 한계를 평가하는 데 중요합니다. 결정 경계의 모양과 복잡성은 새로운 데이터 포인트를 정확하게 분류하거나 예측하는 알고리즘의 기능에 영향을 줄 수 있습니다.

k 최근접 이웃 알고리즘에 대해 논의하는 것 외에도 알고리즘 효율성에 대한 주제도 다룰 것입니다. Big O 표기법은 다양한 알고리즘의 효율성을 분석하고 비교하는 일반적인 방법입니다. 입력 크기가 증가함에 따라 실행 시간이 증가하는 방식을 나타내는 알고리즘의 시간 복잡도 측정값을 제공합니다.

k 최근접 이웃 알고리즘의 런타임 복잡성을 분석하면 계산 효율성을 이해하는 데 도움이 됩니다. 이 주제를 간략하게 살펴보고 알고리즘의 효율성이 대규모 데이터 세트의 성능에 어떤 영향을 미칠 수 있는지 논의할 것입니다.

이 강의가 끝날 무렵 Python을 사용하여 k개의 최근접 이웃 알고리즘을 구현하는 실제 예제에 대해 자세히 살펴보겠습니다. 분류 및 회귀 작업에 알고리즘을 사용하는 방법을 시연하고 실제 시나리오에서 응용 프로그램을 보여줍니다. 그러나 구현에 뛰어들기 전에 k개의 최근접 이웃의 기본 개념과 원리를 파악하는 것이 필수적입니다.

요약하자면, 강의 2에서 우리는 최근접 이웃 알고리즘의 간단한 사례로서 하나의 최근접 이웃 방법을 다루었습니다. 알고리즘이 쿼리 포인트에 가장 가까운 데이터 포인트를 결정하는 방법과 예측을 위해 가장 가까운 포인트의 레이블을 사용하는 방법을 살펴보았습니다. 또한 가장 가까운 이웃 방법에서 결정 경계의 개념과 모양을 소개했습니다. 또한 하나가 아닌 여러 개의 최근접 이웃을 고려하는 k개의 최근접 이웃 알고리즘에 대해 논의했습니다. 예측 레이블이 분류 문제에서 다수결로 결정되고 회귀 문제에서 평균 또는 중앙값이 어떻게 결정되는지 언급했습니다. 또한 k 최근접 이웃 알고리즘을 포함하여 알고리즘의 효율성을 분석하는 데 Big O 표기법과 그 적용에 대해 간략하게 설명했습니다.

다음 강의 3강에서는 파이썬을 이용한 k개의 최근접 이웃 알고리즘 구현에 대해 파고들 것입니다. 이 알고리즘을 효과적으로 활용하는 데 필요한 단계, 라이브러리 및 기술을 다룰 것입니다. 그럼 다음 강의에 꼭 참여해주세요!

 

2.2 최근접 이웃 결정 경계(L02: Nearest Neighbor Methods)



2.2 최근접 이웃 결정 경계(L02: Nearest Neighbor Methods)

이 두 번째 비디오에서는 최근접 이웃 알고리즘의 결정 경계를 살펴보고 특히 최근접 이웃 분류기에 초점을 맞춥니다. 인간이 시각화하기 더 쉽기 때문에 설명 목적으로 2차원 데이터 세트를 사용할 것입니다.

데이터 세트는 파란색 점으로 표시된 5개의 데이터 포인트로 구성됩니다. 점 A와 B를 확대하고 이들 사이의 결정 경계를 살펴보겠습니다. 결정 경계는 점 A와 B를 구분하는 선 또는 경계입니다. 가장 가까운 이웃 모델을 데이터 세트에 맞추면 이 결정 경계는 어떻게 생겼을까요?

이 질문에 대답하려면 등거리의 개념을 이해해야 합니다. 결정 경계에 있는 모든 지점은 지점 A와 B에서 등거리에 있어야 합니다. 잠시 비디오를 일시 중지하고 결정 경계가 어떻게 생겼는지 생각해 보십시오. 점 A와 B의 결정 경계는 유클리드 거리 메트릭을 사용하여 그린 선입니다. 이 직선 위의 모든 점은 점 A와 B에서 등거리에 있습니다. 즉, 직선 위의 점과 점 A와 B 사이의 거리는 직선 위의 모든 곳에서 동일합니다. 이제 점 A와 C로 이동하여 결정 경계를 결정하겠습니다. 점 A와 C에 대한 결정 경계는 A와 C를 연결하는 선에 수직인 선입니다. 이 선의 모든 점은 점 A와 C에서 등거리에 있습니다.

C와 D와 같은 데이터 세트의 모든 점 쌍에 대해 이 연습을 계속하여 각각의 결정 경계를 결정할 수 있습니다. 각 점 쌍에 대해 이러한 모든 결정 경계를 조합하여 오른쪽 하단 모서리에 표시된 것처럼 가장 가까운 이웃 분류기의 결정 경계를 얻습니다.

다이어그램을 자세히 보면 보로노이 다이어그램 또는 보로노이 테셀레이션과 유사하다는 것을 알 수 있습니다. 이 다이어그램은 데이터 세트를 영역으로 나누고 각 영역은 한 쌍의 점 사이의 결정 경계에 해당합니다. 경계선의 각 점은 인접한 두 점과 같은 거리에 있습니다.

그러나 아직 끝나지 않았습니다. 이전 슬라이드에서는 실제 클래스 레이블을 고려하지 않고 결정 영역만 표시했습니다. 이제 클래스 레이블을 데이터 세트에 다시 도입하겠습니다. 삼각형은 클래스 1을 나타내고 사각형은 클래스 0을 나타냅니다.

가장 가까운 이웃 알고리즘이 분류에 사용할 결정 영역을 얻으려면 동일한 클래스 레이블에 속하는 영역의 합집합을 취해야 합니다. 예를 들어 빨간색 삼각형에는 빨간색 삼각형의 가장 가까운 점에 해당하는 경계로 둘러싸인 결정 영역이 있습니다. 마찬가지로 파란색 사각형에는 자체 결정 영역이 있습니다. 이 영역을 각각의 색상으로 채워서 가장 가까운 이웃 분류기의 결정 경계를 얻습니다.

이해도를 테스트하기 위해 간단한 질문을 던집니다. 데이터 세트의 5개 데이터 포인트가 주어졌을 때 물음표 포인트에 가장 가까운 포인트는 무엇입니까? 영상을 잠시 멈추고 답을 생각해보세요. 이 질문에 답하려면 친밀도를 결정하는 데 사용되는 거리 척도에 대한 지식이 필요합니다. 이 경우 유클리드 거리를 사용하지만 다른 거리 측정도 사용할 수 있습니다. 선택한 거리 측정에 따라 물음표 지점에 가장 가까운 지점이 다를 수 있습니다.

비디오에서는 유클리드 거리와 맨해튼 거리의 두 가지 거리 측정 방법을 시연했습니다. 유클리드 거리는 두 점 사이의 직선 거리를 측정하는 반면 맨해튼 거리는 좌표 간의 절대 차이를 합하여 거리를 측정합니다.

또한 동영상에서는 특징 분포를 고려한 Mahalanobis 거리를 간략하게 언급합니다. 표준 편차 측면에서 분포에 대한 데이터 포인트의 거리를 고려합니다. 두 벡터 사이의 각도를 측정하는 코사인 유사도는 거리 측정으로도 언급됩니다.

실제로 거리 측정의 선택은 특정 문제와 데이터 세트의 특성에 따라 다릅니다. 당면한 문제에 따라 신중하게 선택해야 하는 최근접 이웃 알고리즘의 하이퍼파라미터로 간주할 수 있습니다.

이제 하나의 최근접 이웃 알고리즘의 확장인 k-최근접 이웃 알고리즘에 대해 논의해 보겠습니다. k-최근접 이웃 알고리즘에서는 가장 가까운 점만 고려하는 대신 쿼리 점에 가장 가까운 k개의 점을 고려합니다. k-최근접 이웃 알고리즘의 결정 경계는 투표 메커니즘에 의해 결정됩니다. 특정 클래스의 결정 영역 내의 각 포인트는 해당 클래스에 대한 투표에 기여합니다. k개의 가장 가까운 이웃 중에서 가장 높은 투표 수를 가진 클래스가 쿼리 포인트에 대한 예측 클래스로 할당됩니다.

예를 들어 녹색 별표로 표시되는 쿼리 지점이 있다고 가정해 보겠습니다. 3-최근접 이웃 알고리즘을 사용하는 경우 쿼리 지점에 가장 가까운 3개의 지점을 찾습니다. 이러한 포인트 중 두 개는 클래스 0에 속하고 하나는 클래스 1에 속하는 경우 다수결로 쿼리 포인트를 클래스 0에 할당합니다. 마찬가지로 k 값을 5로 늘리면 쿼리에 가장 가까운 5개 포인트를 고려합니다. 가리키다. 이러한 포인트 중 3개는 클래스 1에 속하고 2개는 클래스 0에 속하는 경우 다수결로 쿼리 포인트를 클래스 1에 할당합니다.

k 값을 선택하는 것은 k-최근접 이웃 알고리즘에서 중요한 고려 사항입니다. k 값이 작을수록 알고리즘이 데이터의 로컬 변동에 너무 민감해지는 과적합이 발생할 수 있습니다. 반면에 k 값이 클수록 결정 경계가 너무 부드러워지고 더 미세한 세부 사항을 캡처하지 못하는 과소 적합이 발생할 수 있습니다. 모든 알고리즘과 마찬가지로 트레이드 오프가 있으며 k의 선택은 데이터 세트와 당면한 문제에 따라 다릅니다. 다양한 k 값으로 실험하고 교차 검증과 같은 기술을 사용하여 최적의 값을 찾는 것이 일반적입니다.

k-최근접 이웃 알고리즘은 k개의 가장 가까운 점을 고려하여 하나의 최근접 이웃 알고리즘을 확장합니다. 결정 경계는 k개의 가장 가까운 이웃의 클래스 레이블을 기반으로 하는 투표 메커니즘에 의해 결정됩니다. k의 선택은 과적합과 과소적합 사이의 균형을 맞추기 위해 신중하게 선택해야 하는 하이퍼파라미터입니다.

 

2.3 K-최근접 이웃(L02: Nearest Neighbor Methods)



2.3 K-최근접 이웃(L02: Nearest Neighbor Methods)

이전 비디오에서 앞서 논의한 모든 거리 측정이 메트릭이 아니라는 점을 언급했습니다. 예를 들어 코사인 유사도는 삼각형 부등식을 충족하지 않기 때문에 적절한 메트릭으로 간주되지 않습니다. 삼각형 부등식은 A와 C로 표시된 두 데이터 포인트 사이의 거리가 A와 B, B와 C 사이의 거리의 합보다 작거나 같아야 함을 나타냅니다. 그러나 적절한 메트릭이 아님에도 불구하고 코사인 유사성은 여전히 특정 상황에서 실제로 매우 유용합니다.

이제 이전에 논의한 최근접 이웃 방법의 확장인 k-최근접 이웃(k-NN) 접근 방식을 살펴보겠습니다. k-NN 모델은 하나가 아닌 여러 개의 최근접 이웃을 고려하여 하나의 최근접 이웃 방법을 일반화하므로 비교적 간단합니다.

이 비디오에서는 k-NN 모델의 예를 제시합니다. 우리는 x1과 x2의 두 가지 기능과 십자, 원 및 삼각형으로 표시되는 서로 다른 클래스가 있는 장난감 데이터 세트를 가지고 있습니다. 우리의 목표는 중앙에 물음표로 표시된 데이터 포인트를 분류하는 것입니다. 예측을 위해 유클리드 거리 측정을 사용하여 물음표 주변의 특정 반경 내의 데이터 포인트를 고려합니다.

이제 질문은 다음과 같습니다. 주어진 예에 대한 이 k-NN 접근 방식에서 k의 값은 무엇입니까? 잠시 생각해 보면 분류하려는 지점에 가장 가까운 5개의 데이터 지점을 고려하고 있기 때문에 k가 5라는 것을 알게 될 것입니다.

5개의 가장 가까운 이웃을 고려하여 각 클래스의 발생 횟수를 계산합니다. 예를 들어 삼각형 1개, 원 1개, 십자 3개를 찾으면 다수결로 예측된 클래스 레이블을 쿼리 지점에 할당합니다. 이 경우 예측 클래스 레이블은 5개의 가장 가까운 이웃 중에서 가장 많이 발생하므로 삼각형이 됩니다.

기술적으로는 k-NN에서 "복수 투표"가 있지만 실제로는 일반적으로 "다수 투표"라고 합니다. 여러 클래스가 동일한 개수를 갖는 투표 프로세스에 동점이 있는 경우 소프트웨어 패키지는 일반적으로 하나의 레이블을 임의로 선택하거나 클래스 레이블 인덱스가 더 낮은 레이블을 선택합니다.

다수결에 대한 보다 공식적인 정의를 제공하기 위해 k개의 가장 가까운 이웃을 나타내는 하위 집합 D sub k를 고려해 보겠습니다. 델타 함수의 합계를 최대화하는 클래스 레이블(y)로 다수결을 정의합니다. 델타 함수는 a가 b(일치 레이블)와 같으면 1을, 그렇지 않으면 0을 반환합니다. 각 이웃에 대한 델타 값을 합산하여 가장 자주 발생하는 클래스 레이블을 찾을 수 있습니다.

k-NN을 사용한 회귀 분석의 경우 프로세스가 더 간단합니다. 클래스 레이블 대신 연속 대상 값을 처리합니다. k-NN 회귀에 대한 예측(h)은 k개의 최근접 이웃 대상 값의 평균입니다.

다음 비디오에서는 k-최근접 이웃 알고리즘의 런타임 복잡성 분석과 관련된 Big O 분석 주제에 대해 자세히 살펴보겠습니다. 알고리즘의 효율성을 이해하는 것은 알고리즘의 성능과 확장성을 평가하는 데 중요합니다. Big O 분석은 입력 크기가 증가함에 따라 알고리즘의 실행 시간이 어떻게 증가할지 추정하는 방법을 제공합니다. 이 분석은 알고리즘 선택 및 최적화에 대한 정보에 입각한 결정을 내리는 데 도움이 됩니다.

k-최근접 이웃 알고리즘에서 Big O 분석을 수행하려면 교육 인스턴스 수(n)와 기능 수(d)라는 두 가지 주요 요소를 고려해야 합니다. 이러한 요소는 주어진 쿼리 포인트에 대해 k개의 가장 가까운 이웃을 찾는 계산 비용을 결정합니다.

k-최근접 이웃의 가장 간단한 구현에서 쿼리 포인트와 모든 교육 인스턴스 사이의 거리를 계산하여 시간 복잡도가 O(nd)가 됩니다. 이는 알고리즘의 실행 시간이 교육 인스턴스 수와 기능 수에 따라 선형적으로 증가한다는 것을 의미합니다.

그러나 k-최근접 이웃 알고리즘을 최적화하고 계산 비용을 줄이는 방법이 있습니다. 일반적인 접근 방식 중 하나는 kd-트리 또는 볼 트리와 같은 가장 가까운 이웃 검색을 가속화하는 데이터 구조를 사용하는 것입니다. 이러한 데이터 구조는 교육 인스턴스를 계층적 방식으로 분할하여 보다 효율적인 이웃 검색을 허용합니다.

이러한 데이터 구조를 사용하여 검색 시간을 O(log n) 또는 경우에 따라 O(1)로 줄일 수 있습니다. 이 개선 사항은 특히 대규모 데이터 세트의 경우 알고리즘 속도를 크게 향상시킵니다.

거리 메트릭의 선택이 알고리즘의 런타임 복잡성에도 영향을 미친다는 점에 유의하는 것이 중요합니다. 유클리드 거리와 같은 일부 거리 메트릭은 효율적으로 계산할 수 있는 반면 맨해튼 거리와 같은 다른 메트릭은 더 많은 계산 리소스가 필요할 수 있습니다.

시간 복잡도 외에도 k-최근접 이웃 알고리즘의 공간 복잡도도 고려해야 합니다. 공간 복잡도는 학습 인스턴스를 저장하는 데 필요한 메모리 양과 효율적인 이웃 검색에 사용되는 추가 데이터 구조를 나타냅니다. 최적화된 구현을 위한 공간 복잡도는 일반적으로 O(nd) 또는 O(n)입니다.

전반적으로 k-최근접 이웃 알고리즘의 런타임 및 공간 복잡성을 이해하면 확장성을 평가하고 대규모 데이터 세트 또는 실시간 애플리케이션으로 작업할 때 정보에 입각한 결정을 내리는 데 도움이 됩니다.

다음 비디오에서는 이러한 개념을 자세히 살펴보고 알고리즘 효율성에 대한 보다 자세한 분석을 제공합니다. k-최근접 이웃에 대한 Big O 분석에 대한 심도 있는 토론을 기대해 주세요.

 

2.4 K-최근접 이웃의 Big O(L02: Nearest Neighbor Methods)



2.4 K-최근접 이웃의 Big O(L02: Nearest Neighbor Methods)

이제 특히 Big O 표기법과 k-최근접 이웃(KNN) 알고리즘의 런타임 복잡성에 중점을 둔 런타임 복잡성 주제에 대해 자세히 살펴보겠습니다.

Big O 표기법은 알고리즘의 효율성을 분석하기 위해 컴퓨터 과학에서 사용되는 개념입니다. 주로 입력 크기가 증가함에 따라 알고리즘의 실행 속도가 어떻게 작동하는지 결정하는 런타임 복잡성을 나타냅니다. 또한 Big O 표기법을 사용하여 알고리즘의 메모리 효율성을 분석하여 실행에 필요한 메모리 양을 나타낼 수도 있습니다.

KNN의 경우 훈련 단계에는 훈련 데이터 세트 저장이 포함되며 이는 메모리 집약적일 수 있습니다. 대규모 교육 데이터 세트를 저장하려면 상당한 양의 RAM 또는 하드 드라이브 저장 공간이 필요할 수 있습니다. 저장 공간은 시간이 지남에 따라 저렴해졌지만 수백만 개의 이미지와 같은 대규모 데이터 세트를 처리할 때 여전히 제한이 있을 수 있습니다.

그러나 예측 단계에서 KNN의 런타임 복잡성으로 초점을 이동해 보겠습니다. 계속 진행하기 전에 Big O 표기법에 대해 간단히 소개하겠습니다. 일반적으로 함수로 표시되는 알고리즘의 효율성을 설명하는 데 사용되는 표기법입니다. 이러한 함수는 O(1)(상수), O(log n)(대수) 등을 포함한 일반적인 예와 함께 알고리즘의 런타임 복잡성을 나타냅니다. 이러한 함수는 입력 크기(n)에 따라 알고리즘의 실행 시간이 어떻게 확장되는지 나타냅니다.

런타임 복잡성을 더 잘 이해하기 위해 O(1)에서 기하급수적 복잡성에 이르기까지 효율성의 오름차순으로 함수를 정렬할 수 있습니다. 이러한 맥락에서 상수 함수는 입력 크기의 영향을 받지 않고 일관된 실행 속도를 보장하므로 이상적입니다. 로그 및 선형 함수도 효율적이지만 상수 함수만큼 이상적이지는 않습니다. 그러나 복잡성이 2차, 3차, 지수로 증가함에 따라 알고리즘의 효율성이 크게 저하됩니다. 기하급수적 복잡성은 특히 해로우며 특히 기계 학습에서 대규모 데이터 세트를 처리할 때 피해야 합니다.

n(입력 크기) 측면에서 런타임 복잡성을 시각화하기 위해 플롯을 생성할 수 있습니다. 여기서 x축은 n을 나타내고 y축은 알고리즘의 복잡성을 나타냅니다. n이 증가하면 특정 함수의 성능이 점점 저하됩니다. 2차, 3차 또는 지수와 같이 복잡도가 높은 알고리즘은 실행 시간이 과도하게 길어질 수 있으므로 피하는 것이 중요합니다.

이제 주어진 함수에 대한 Big O 표기법을 도출하는 방법을 살펴보겠습니다. 예를 들어, 2차 함수 f(x) = ax^2 + bx + c를 고려하십시오. Big O 표기법을 도출할 때 가장 빠르게 성장하는 지배 용어에 중점을 둡니다. 이 경우 지배 항은 x^2입니다. 따라서 이 함수의 Big O 표기법은 2차 복잡도를 나타내는 O(x^2)가 됩니다.

이 프로세스를 더 자세히 설명하기 위해 다른 함수를 고려해 보겠습니다. 함수 f(x) = ax(log x)가 있다고 가정합니다. 다시, 우리는 x(log x)인 우세 항을 식별합니다. 여기서는 상수 요소 a를 무시하고 항 x(log x)에 초점을 맞춥니다. 결과적으로 이 함수에 대한 Big O 표기법은 로그 선형 복잡성을 나타내는 O(x log x)가 됩니다.

로그의 밑(예: 로그 밑 2 또는 자연 로그)은 Big O 표기법에 영향을 미치지 않는다는 점을 언급할 가치가 있습니다. 서로 다른 기준은 런타임 복잡성을 결정할 때 무시할 수 있는 배율 인수만 도입합니다. 따라서 단순화를 위해 일반적으로 밑을 지정하지 않고 자연 로그(log)를 고려합니다.

이해를 더욱 확고히 하기 위해 Big O 표기법을 계산 알고리즘에 적용하는 방법을 보여 주는 행렬 곱셈을 위한 Python 함수를 살펴보겠습니다. 이 함수는 두 행렬 A와 B 사이에서 행렬 곱셈을 수행합니다. 설명을 위해 의도적으로 구현이 비효율적이지만 런타임 복잡성을 분석할 수 있습니다.

이 함수는 크기가 nxn인 빈 행렬 C를 초기화하는 것으로 시작합니다. 여기서 n은 입력 행렬의 차원입니다. 그런 다음 행렬 A의 각 i행과 행렬 B의 각 열 j를 반복합니다. 중첩된 루프 내에서 행렬 A의 i행과 행렬 B의 j열의 내적을 계산하여 결과를 해당 셀에 저장합니다. 매트릭스 C

행렬 곱셈 함수에 대한 Python 코드는 다음과 같습니다.

def matrix_multiplication(A, B):
    n = len(A)  # Assuming square matrices of size n x n
    C = [[ 0 ] * n for _ in range(n)]  # Initialize matrix C
    
     for i in range(n):
         for j in range(n):
             for k in range(n):
                C[i][j] += A[i][k] * B[k][j]  # Calculate dot product and update C[i][j]
    
    return C
이 함수의 런타임 복잡성을 분석하기 위해 분석해 보겠습니다. 외부 루프는 n번 반복하여 행렬 A의 행을 나타냅니다. 두 번째 루프도 n번 반복하여 행렬 B의 열을 나타냅니다. 이 루프 내부에는 내적 계산을 나타내는 n번 반복되는 중첩 루프도 있습니다. 따라서 전체 복잡도는 3차 복잡도를 나타내는 O(n^3)입니다.

3차 복잡도는 특히 큰 값의 n에 대해 이상적이지 않다는 점에 유의하는 것이 중요합니다. 입력 크기가 커질수록 이 함수의 실행 시간이 크게 늘어납니다. 결과적으로 더 큰 행렬의 경우 Strassen 알고리즘 또는 O(n^2.81)과 같이 더 나은 런타임 복잡성을 달성하는 기타 최적화된 접근 방식과 같은 행렬 곱셈을 수행하는 데 더 효율적인 알고리즘을 사용해야 합니다.

요약하면 Big O 표기법으로 표시되는 알고리즘의 런타임 복잡성을 이해하는 것은 효율성과 확장성을 평가하는 데 중요합니다. 이를 통해 입력 크기가 증가함에 따라 알고리즘의 성능을 추정할 수 있으므로 다양한 시나리오에 가장 적합한 알고리즘을 선택하고 대규모 데이터 세트에 대해 비효율적인 알고리즘을 피할 수 있습니다.

 

2.5 k-최근접 이웃 개선(L02: Nearest Neighbor Methods)



2.5 k-최근접 이웃 개선(L02: Nearest Neighbor Methods)

이 비디오에서는 하이퍼파라미터의 특정 수정 및 고려를 통해 K-최근접 이웃 알고리즘을 개선하는 주제를 탐구합니다. 이전 비디오에서 우리는 가장 가까운 이웃을 찾는 효율성을 향상시키기 위해 데이터 구조로 우선 순위 큐를 사용하는 것에 대해 논의했습니다. 이 우선 순위 큐는 각각의 새로운 이웃에 대한 전체 훈련 세트 검색을 피하는 데 도움이 됩니다.

이제 공간 분할 데이터 구조를 활용하여 K-최근접 이웃 알고리즘의 계산 성능을 향상시키는 또 다른 접근 방식을 살펴보겠습니다. 이러한 데이터 구조 중 하나는 훈련 예제에 대한 검색 프로세스를 촉진하기 위한 공간 분할 구조 역할을 하는 힙입니다. 데이터 구조 내에서 데이터 세트를 하위 집합으로 나누면 모든 교육 데이터 포인트에 대한 거리 계산의 필요성을 최소화할 수 있습니다.

공간 분할 방법 중 하나는 버킷팅(bucketing)이라고 합니다. 여기에는 기능 측정으로 정의된 동일한 크기의 버킷 또는 경계와 같은 특정 기준에 따라 데이터 세트를 하위 집합 또는 버킷으로 나누는 작업이 포함됩니다. 그렇게 함으로써 쿼리 포인트의 이웃을 찾을 때 전체 트레이닝 세트를 검색하지 않고 특정 버킷 내의 관련 포인트에만 집중할 수 있습니다. 이 최적화는 검색 프로세스의 효율성을 크게 향상시킵니다.

또 다른 공간 분할 기술은 데이터 세트를 분할하기 위해 하이퍼큐브를 구성하는 KD 트리입니다. 이 방법은 버케팅과 다르지만 거리 계산 횟수를 줄여 검색 효율성을 향상시킨다는 목적을 공유합니다. KD 트리는 특히 많은 수의 기능이 있는 데이터 세트에 적합합니다.

마찬가지로, 볼 트리 알고리즘은 공간 파티션으로 하이퍼스피어를 생성합니다. KD 트리와 볼 트리 사이의 선택은 데이터 세트의 특성에 따라 다릅니다. 차원이 높은 데이터 세트의 경우 볼 트리 알고리즘이 선호되는 경우가 많습니다. 널리 사용되는 도구인 scikit-learn 기계 학습 라이브러리는 K-최근접 이웃 분류기 알고리즘에 대한 다양한 옵션을 제공하여 데이터 세트를 기반으로 가장 효율적인 공간 분할 알고리즘을 자동으로 선택한다는 점은 주목할 가치가 있습니다. 그러나 원하는 경우 이 설정을 수동으로 재정의할 수 있습니다.

또한 차원 축소 기술을 사용하여 K-최근접 이웃의 성능을 향상시킬 수 있습니다. 차원 감소는 특징 추출과 특징 선택의 두 가지 방식으로 제공됩니다. 기능 추출에는 기존 기능을 변환하거나 결합하여 데이터의 저차원 표현을 생성하는 작업이 포함됩니다. 반면에 기능 선택에는 새 기능을 만들지 않고 사용 가능한 기능의 하위 집합을 선택하는 작업이 포함됩니다. 기능 수를 줄임으로써 거리 계산의 계산 비용을 줄이고 잠재적으로 알고리즘의 효율성을 향상시킬 수 있습니다. 또한 고차원 데이터 세트는 종종 차원의 저주로 인해 과적합으로 인해 일반화 성능이 저하될 수 있습니다. 따라서 차원 축소도 이 문제를 완화하는 데 도움이 될 수 있습니다.

K-최근접 이웃의 계산 성능을 최적화하기 위해 편집 또는 가지치기 기술을 탐색할 수 있습니다. 가지치기는 결정 경계에 영향을 주지 않고 교육 세트에서 불필요한 데이터 포인트를 제거하는 것입니다. 중복 포인트를 제거함으로써 비교 및 거리 계산 횟수를 줄여 알고리즘을 보다 효율적으로 만들 수 있습니다. 마찬가지로 프로토타입을 만들려면 훈련 데이터 포인트의 밀집된 영역을 단일 대표 포인트로 교체해야 합니다. 이 전략은 알고리즘의 예측 정확도를 유지하면서 스토리지 공간 요구 사항을 줄입니다.

또한 하이퍼파라미터 튜닝은 K-최근접 이웃 알고리즘의 예측 성능을 향상시키는 데 중요한 역할을 합니다. 하이퍼파라미터는 알고리즘의 동작에 영향을 주지만 학습 데이터에서 학습되지 않는 조정 가능한 설정입니다. 여기에는 K 값(고려할 이웃 수), 기능 스케일링, 사용된 거리 측정 및 거리 계산을 위한 가중치 체계가 포함됩니다. 이러한 하이퍼파라미터에 적절한 값을 선택하면 알고리즘의 성능에 상당한 영향을 미칠 수 있습니다. 그러나 모델을 훈련 데이터에 과대적합하지 않도록 주의하고 피하는 것이 중요합니다.

공간 분할 데이터 구조를 활용하고, 차원 축소 기술을 사용하고, 편집 및 가지치기 방법을 적용하고, 하이퍼 매개변수를 미세 조정함으로써 K-최근접 이웃 알고리즘의 계산 성능과 예측 성능을 모두 향상시킬 수 있습니다.

 

2.6 Python의 K-최근접 이웃(L02: Nearest Neighbor Methods)



2.6 Python의 K-최근접 이웃(L02: Nearest Neighbor Methods)

K-최근접 이웃에 대한 포괄적인 논의 후 텍스트는 인기 있는 scikit-learn 라이브러리를 사용하여 K-최근접 이웃의 구현을 보여주는 Python 예제로 진행됩니다. 저자는 모든 측면이 즉시 명확하지 않을 수 있음을 인정하고 독자들에게 향후 강의에서 Python, NumPy 및 scikit-learn에 대해 더 깊이 파고들 것이라고 확신합니다. 그럼에도 불구하고 제공된 예제는 이러한 도구가 작동하는 방식에 대한 하향식 관점을 제공하는 티저 역할을 합니다.

구현 예제를 지원하기 위해 저자는 독자가 코드 예제를 찾을 수 있는 웹 사이트를 참조합니다. 또한 저자는 zip 파일을 사용하거나 복제하여 GitHub에서 리포지토리를 다운로드하는 과정을 설명합니다. 실제 도구로서의 GitHub의 중요성을 강조하면서 저자는 GitHub 프로필을 보유하고 프로젝트를 공유하는 것이 잠재적인 고용주에게 자신의 작업을 보여주는 데 유리할 수 있다고 제안합니다.

이 텍스트는 GitHub 링크와 "git clone" 명령을 사용하여 리포지토리를 복제하는 방법에 대한 자세한 지침을 제공합니다. Windows 사용자의 경우 프로세스가 약간 다를 수 있음을 인정하면서 저자는 TA(조교)의 자습서나 지원을 받을 것을 권장합니다. 저장소가 성공적으로 복제되면 작성자는 독자에게 폴더로 이동하도록 지시하고 "git pull" 명령을 사용하여 업데이트를 얻을 수 있다고 설명합니다.

코드 예제로 이동하여 작성자는 Jupyter Notebook, 특히 Jupyter Lab을 열고 명령을 단계별로 실행하는 방법을 보여줍니다. 독자를 압도하지 않기 위해 저자는 각 실행 후 출력을 지우는 것의 중요성을 강조합니다. 또한 저자는 사용된 소프트웨어 패키지의 버전을 표시하는 Jupyter Notebook의 워터마크 확장 기능의 유용성을 언급합니다. 이 정보는 문제 해결에 도움이 되며 결과의 복제 가능성을 보장합니다. 구현을 용이하게 하기 위해 Pandas, NumPy, Matplotlib 및 scikit-learn과 같은 필수 패키지가 설치됩니다.

다음으로 저자는 CSV 파일에서 Iris 데이터 세트를 로드하고 "head" 및 "tail"과 같은 명령을 사용하여 데이터 세트를 미리 보는 방법을 보여줍니다. 데이터는 "read_csv" 함수를 사용하여 Pandas DataFrame에 로드됩니다. 기계 학습이 일반적으로 NumPy 배열을 사용한다는 점에 주목하면서 저자는 scikit-learn이 DataFrames도 지원한다는 점을 강조합니다. 이를 설명하기 위해 작성자는 NumPy 배열을 만들기 위해 DataFrame에서 특정 열을 추출하는 예를 제공합니다. 학습 예제 및 기능의 수를 나타내는 배열의 모양은 "shape" 명령을 사용하여 표시됩니다.

이 텍스트는 Python 및 scikit-learn 라이브러리를 사용하여 기계 학습 워크플로를 구성하는 일련의 단계를 설명합니다. 다음은 이러한 단계에 대한 자세한 요약입니다.

  1. 인덱스 및 레이블 섞기: 저자는 데이터 세트에서 인덱스 및 레이블을 섞는 프로세스를 논의하여 워크플로를 시작합니다. 셔플링의 목적은 데이터 요소의 순서를 무작위로 지정하여 각 레이블이 기능 매트릭스의 올바른 행에 해당하는지 확인하는 것입니다.

  2. 데이터 세트 분할: 데이터 세트는 훈련 세트와 테스트 세트로 나뉩니다. 작성자는 훈련 세트에 대한 처음 105개의 예를 수동으로 선택하고 테스트 세트에 대한 나머지 45개의 예를 예약합니다. 이 구분은 기계 학습 모델의 성능을 평가하는 데 중요합니다.

  3. scikit-learn 및 Iris 데이터 세트 소개: 저자는 scikit-learn 라이브러리, 특히 Iris 데이터 세트 및 "train_test_split" 기능의 구현을 소개합니다. Iris 데이터셋은 분류 작업에 널리 사용되는 인기 있는 데이터셋입니다. "train_test_split" 기능은 자동으로 데이터 세트를 섞고 교육 및 테스트를 위해 지정된 비율로 분할합니다.

  4. 산점도 행렬을 사용한 시각화: 저자는 데이터 집합을 시각화하기 위해 "산점도 행렬"이라는 편리한 기능을 제공합니다. 이 함수는 matplotlib 라이브러리를 활용하여 대각선에 히스토그램이 표시된 산점도 행렬을 만듭니다. 산점도 행렬은 데이터 세트의 여러 기능 간의 관계를 시각적으로 나타냅니다.

  5. 산점도 행렬 데모: 저자는 Iris 데이터 세트를 플로팅하여 산점도 행렬의 사용법을 보여줍니다. 다양한 종류의 꽃을 나타내기 위해 다양한 색상이 할당됩니다. 특히 저자는 꽃잎 길이와 너비와 같은 특정 기능이 서로 다른 꽃 클래스를 구별하는 데 특히 유용하다고 강조합니다.

  6. k-최근접 이웃(k-NN) 분류기 소개: 저자는 인접 데이터 포인트와의 근접성을 기반으로 데이터 포인트를 분류하는 간단한 알고리즘인 k-NN(최근접 이웃) 분류기에 대해 설명합니다. k-NN 분류기를 인스턴스화하기 위해 작성자는 3개의 이웃이 있는 객체를 생성합니다.

  7. k-NN 분류기 피팅: k-NN 분류기는 "적합" 방법을 사용하여 트레이닝 세트에 피팅됩니다. 이 단계는 제공된 교육 데이터를 사용하여 모델을 교육합니다.

  8. 테스트 세트에 대한 예측: 저자는 적합 k-NN 분류기를 사용하여 "예측" 방법을 사용하여 테스트 세트에 대한 예측을 수행합니다. 예측은 "pred"라는 변수에 저장됩니다.

  9. 성능 평가: 모델의 성능을 평가하기 위해 작성자는 예측 레이블("pred"에 저장됨)과 테스트 세트의 실제 레이블("y_test"에 저장됨)을 비교합니다. 올바른 예측의 수를 계산하여 테스트 세트에 대한 모델의 정확도를 결정할 수 있습니다.

  10. 결론 및 추가 탐색: k-최근접 이웃 알고리즘 및 다양한 옵션에 대한 추가 정보는 scikit-learn 문서를 탐색하도록 독려하는 것으로 강의를 마무리합니다. 또한 저자는 k-NN 분류기가 사용하는 기본 거리 메트릭에 대해 독자들에게 질문을 던지고 이 측면을 조사하고 논의하기 위한 연습을 제안합니다.

강의는 K-최근접 이웃 개념, scikit-learn 라이브러리를 사용한 구현 예제, GitHub에서 리포지토리 다운로드 및 복제 지침, Jupyter Notebook 및 Jupyter Lab 소개, 데이터 세트 로드 등 다양한 주제에 대한 포괄적인 설명을 제공합니다. Pandas DataFrame으로 변환하고 열 추출 및 NumPy 배열로의 변환을 시연합니다.

 

3.1 (선택 사항) Python 개요



3.1 (선택 사항) Python 개요

지금까지 모두 즐거운 한 주를 보내고 강의를 즐기시기 바랍니다. 오늘 저는 최근 강의에서 다룬 몇 가지 중요한 주제에 대해 이야기하고 싶습니다.

먼저 가나안 개선에 대한 강의를 진행하였고, 이어서 psychic learn을 활용한 Python에서의 kin 구현에 대한 강의를 진행하였습니다. 당신을 알아가기 위한 인트로 퀴즈에 대한 당신의 피드백을 바탕으로, 나는 당신들 대부분이 프로그래밍 배경이 있거나 이전에 프로그래밍 수업을 들은 적이 있다는 것을 발견했습니다. 이것은 이 과정에서 당신에게 매우 유익할 것이기 때문에 좋은 소식입니다. 그러나 저는 여러분 중 약 절반만이 Python에 대한 확실한 경험을 가지고 있다는 것을 알았습니다. 따라서 Python으로 과학 컴퓨팅을 시작하고 심령 학습을 더 자세히 살펴보기 전에 Python을 처음 사용하는 사람들을 위해 Python을 설정하는 데 도움이 될 것이라고 생각했습니다. 이렇게 하면 다음 강의가 모든 사람을 위해 보다 원활하게 진행될 수 있습니다.

가벼운 메모로, 나는 당신이 좋아하는 취미에 대해 읽는 것을 정말 즐겼습니다. 많은 분들이 크로스컨트리 스키, 달리기, 하이킹과 같은 야외 활동에 대한 제 사랑을 공유하는 것 같습니다. 비오는 날과 긴 겨울로 인해 그러한 기회가 제한될 수 있음을 이해하지만 자연에서 보내는 시간은 정말 상쾌합니다. 여러분 중 일부는 비디오 게임에 대한 관심도 언급했으며 한 학생은 Zelda 시리즈를 언급하기도 했습니다. 나도 이 시리즈의 열렬한 팬임을 인정해야 하며 눈 내리는 크리스마스 날이나 바쁜 하루를 보낸 후 긴장을 풀기 위해 플레이하는 것을 즐깁니다.

계속해서 약속대로 오늘 강의는 선택사항입니다. 이미 강력한 Python 경험이 있고 컴퓨터에 Python이 설정되어 있는 경우 다음 세 비디오를 건너뛸 수 있습니다. 그러나 Python을 처음 접하거나 설정하는 데 도움이 필요한 경우 시청하는 것이 좋습니다. 이 비디오는 파이썬에 대한 나의 경험을 바탕으로 동기 부여와 실용적인 조언을 제공할 것입니다. 이 과정에서 Python을 사용하기 위해 전문 프로그래머가 될 필요는 없다는 점에 유의하는 것이 중요합니다. 기계 학습에 필요한 기본 사항에 중점을 둘 것이며 진행하면서 더 많은 것을 배우게 될 것입니다.

다음 주에는 K-최근접 이웃 알고리즘을 구현하는 첫 번째 실제 숙제가 있습니다. 이 과제에서는 심령 학습을 사용하는 것 외에도 자신의 코드를 작성해야 합니다. 따라서 이번 주에 숙제 준비를 위해 Python을 설정하는 것이 도움이 될 것입니다. 괜찮아요; KNN 알고리즘에 대한 이해를 돕기 위한 과제로, 첫 숙제인 만큼 크게 어렵지는 않을 것입니다. 이 과제를 완료하면 개념적 기계 학습 측면을 더 깊이 파고들 것입니다.

더 진행하기 전에 코스 진행 상황에 대한 간략한 개요를 살펴보겠습니다. 첫 주에는 기계 학습과 K-최근접 이웃에 대한 소개를 다뤘습니다. 현재 우리는 계산 기반에 초점을 맞춘 두 번째 주에 있습니다. 이러한 기초는 나중에 다양한 기계 학습 개념을 구현하는 데 사용할 것이기 때문에 매우 중요합니다. 따라서 초기에 Python과 그 사용법에 익숙해지는 것이 중요합니다. 이번 강의에서는 주로 Python과 이를 설정하는 방법에 대해 논의할 것입니다. Mac에서 설정 프로세스를 시연할 예정이지만 TA가 Windows 관련 질문에 도움을 드릴 수 있습니다.

Python은 해석되고 동적인 프로그래밍 언어로, C나 C++와 같은 정적으로 유형이 지정되는 언어에 비해 대화식이며 사용자 친화적입니다. Python은 이러한 언어보다 느릴 수 있지만 우리의 목적에 중요한 문제는 아닙니다. 다음 강의에서 살펴볼 많은 과학 컴퓨팅 라이브러리는 C 또는 Fortran으로 작성되었으며 빠른 실행 시간을 제공합니다. Python은 Django와 같은 웹 프레임워크와 Instagram 및 Dropbox와 같은 인기 있는 서비스를 포함하여 다양한 애플리케이션에서 널리 사용되는 다목적 프로그래밍 언어입니다.

이제 간단한 프로그램을 작성하여 파이썬을 C와 같은 정적 유형 언어와 비교해 봅시다. C에서는 변수를 선언하고 정수, 실수 또는 문자와 같은 데이터 유형을 명시적으로 지정해야 합니다. 다음은 C로 작성된 간단한 프로그램의 예입니다.

#include <stdio.h>

int main() {
     int age = 25 ;
     float height = 1.75 ;
     char initial = 'J' ;

    printf( "My age is %d\n" , age);
    printf( "My height is %.2f meters\n" , height);
    printf( "My initial is %c\n" , initial);

     return 0 ;
}
이 C 프로그램에서 변수 age, height 및 initial을 각각의 데이터 유형으로 선언했습니다. 그런 다음 이 변수에 값을 할당하고 printf()를 사용하여 인쇄했습니다.

이제 Python에서 동일한 프로그램을 비교해 보겠습니다.

age = 25
height = 1.75
initial = 'J'

print( "My age is" , age)
print( "My height is" , height, "meters" )
print( "My initial is" , initial)
Python에서는 변수 유형을 명시적으로 선언할 필요가 없습니다. 변수에 값을 직접 할당할 수 있으며 Python은 데이터 유형을 자동으로 유추합니다. print() 함수는 출력을 표시하는 데 사용됩니다.

Python의 단순성과 가독성은 초보자와 숙련된 프로그래머 모두에게 탁월한 선택입니다. 과학 컴퓨팅, 데이터 분석, 기계 학습 등에 적합하도록 만드는 방대한 라이브러리 및 프레임워크 생태계가 있습니다.

이제 컴퓨터에서 Python을 설정하는 단계로 넘어갑시다. Python을 설치하는 방법에는 여러 가지가 있지만 Anaconda 배포판을 사용하는 것이 좋습니다. Anaconda 배포판에는 과학 컴퓨팅에 유용한 여러 라이브러리가 사전 패키지되어 있습니다. Anaconda를 설치하는 단계는 다음과 같습니다.

  1. Anaconda 웹 사이트( https://www.anaconda.com/products/individual )를 방문하여 운영 체제(Windows, macOS 또는 Linux)에 적합한 설치 프로그램을 다운로드하십시오.

  2. 설치 프로그램을 실행하고 화면의 지시를 따릅니다. 특정 기본 설정이 없는 경우 기본 설치 옵션을 선택할 수 있습니다.

  3. 설치가 완료되면 컴퓨터에 Anaconda Navigator 및 Anaconda Prompt(또는 Anaconda PowerShell Prompt)가 설치되어 있어야 합니다. Python 환경 및 패키지를 관리하기 위한 편리한 도구입니다.

  4. Anaconda Navigator를 열고 "환경" 탭을 클릭합니다. 여기에서 이 과정에 대한 새 환경을 만들 수 있습니다. "만들기" 버튼을 클릭하고 환경 이름(예: "기계 학습")을 제공하고 Python 버전(Python 3.x 선호)을 선택합니다. "만들기"를 클릭하여 환경을 만듭니다.

  5. 환경이 생성되면 Anaconda Navigator에서 "홈" 탭을 클릭합니다. 사용 가능한 애플리케이션 및 환경 목록이 표시되어야 합니다. 창 상단의 드롭다운 메뉴에서 새로 만든 환경을 선택합니다.

  6. "홈" 탭에서 Jupyter 노트북 섹션 아래의 "설치" 버튼을 클릭합니다. 이렇게 하면 대화형 프로그래밍 및 Python 코드 실행에 사용할 Jupyter Notebook이 설치됩니다.

  7. 설치 후 Jupyter Notebook 옆의 "Launch" 버튼을 클릭합니다. 그러면 웹 브라우저에서 Jupyter Notebook을 실행하는 새 탭이 열립니다.

축하해요! Anaconda 배포를 사용하여 Python 및 Jupyter Notebook을 성공적으로 설치했습니다. 이제 이 과정을 위해 Python으로 코딩을 시작할 준비가 되었습니다. 다음 강의에서는 Python을 사용한 과학 컴퓨팅에 대해 더 깊이 알아보고 scikit-learn이라는 유명한 라이브러리를 탐색합니다.

설치 과정에서 문제가 발생하거나 질문이 있는 경우 주저하지 말고 토론 포럼에서 질문하거나 TA에 도움을 요청하십시오.

이러한 지침은 Anaconda에만 적용되지만 Miniconda 또는 표준 Python 배포판과 같은 다른 Python 배포판을 사용하려는 경우에도 과정을 따라갈 수 있습니다.

Free Download | Anaconda
  • www.anaconda.com
Everything you need to get started in data science on your workstation. Free distribution install Thousands of the most fundamental DS, AI, and ML packages Manage packages and environments from desktop application Deploy across hardware and software platforms
 

3.2 (선택사항) 파이썬 설정


3.2 (선택사항) 파이썬 설정

과정의 두 번째 비디오에서는 설정 프로세스와 Python 설치 방법에 대해 설명합니다. 이전 비디오에서는 Python을 동적 해석 언어로 강조하면서 해석 및 동적 프로그래밍 언어의 기본 사항을 다뤘습니다.

설치를 진행하기 전에 동영상을 시청하고 시청하는 동안 컴퓨터에 아무 것도 설치하지 않는 것이 중요합니다. 이 예방 조치를 통해 결정을 내리기 전에 다양한 설치 옵션을 완전히 이해할 수 있습니다. 올바른 지식 없이 소프트웨어를 설치하면 나중에 후회할 수 있습니다.

시작하려면 컴퓨터에 최신 Python 버전이 이미 설치되어 있는지 확인하는 것이 좋습니다. Mac 또는 Linux에서는 "which Python" 명령을 사용하여 설치 위치 및 버전을 확인할 수 있습니다. 마찬가지로 Windows에서는 "where" 명령을 사용하여 설치 위치를 찾을 수 있습니다.

많은 Mac에는 전통적으로 오래된 버전의 Python, 특히 Python 2가 함께 제공됩니다. Python 커뮤니티에서 Python 2를 더 이상 지원하지 않으므로 Python을 업데이트하는 것이 좋습니다. 이상적으로는 최신 3.9 버전이 아직 개발 중이므로 Python 3.8 또는 3.7을 설치하는 것이 좋습니다.

Python을 설치하는 공식적인 방법은 python.org를 방문하여 설치 프로그램을 다운로드하는 것입니다. 그러나 종종 선호되는 대체 접근 방식은 Anaconda 또는 더 구체적으로 Miniconda를 사용하는 것입니다. Miniconda는 불필요한 라이브러리를 포함하지 않는 경량 버전의 Anaconda로 컴퓨터의 저장 공간을 절약합니다. Anaconda는 사전 설치된 라이브러리와 함께 제공되지만 Miniconda는 보다 사용자 정의된 설치 프로세스를 허용합니다.

개인적으로 강사는 Python 과학 컴퓨팅 커뮤니티의 많은 구성원이 가지고 있는 편리함과 긍정적인 경험 때문에 Miniconda를 사용할 것을 권장합니다. Miniconda는 필요한 모든 패키지 버전이 설치되었는지 확인하고 패키지 종속성을 관리하는 포괄적인 패키지 관리자를 제공합니다. 이 기능을 사용하면 안정적이고 호환 가능한 개발 환경을 보다 쉽게 유지할 수 있습니다.

Miniconda를 설치하려면 문서 웹사이트 docs.conda.io를 방문하여 최신 영어 버전의 Miniconda 설치 페이지로 이동하십시오. 여기에서 운영 체제에 적합한 설치 프로그램을 선택할 수 있습니다. Mac 사용자의 경우 bash 설치 프로그램이 일반적으로 사용됩니다. 설치 프로그램을 다운로드한 후 스크립트를 실행하고 라이선스 계약에 동의한 다음 설치 위치를 선택합니다.

Miniconda가 설치되면 이제 업데이트된 버전이 표시되는 Python 셸을 열어 기본 Python 버전을 확인할 수 있습니다. Miniconda는 또한 다양한 환경을 관리하기 위한 도구를 제공하므로 다양한 프로젝트에 대해 격리된 환경을 만들 수 있습니다. 이 과정에 필요하지는 않지만 여러 프로젝트를 동시에 작업하는 경우 이러한 환경이 유용할 수 있습니다.

다음 강의에 필요한 "numpy" 패키지와 같은 패키지를 설치하려면 패키지 관리자 "pip" 또는 Conda 설치 프로그램을 사용할 수 있습니다. Miniconda를 사용 중이므로 더 나은 호환성과 버전 관리를 위해 가능하면 Conda 설치 프로그램을 사용하는 것이 좋습니다. 그러나 Conda에서 패키지를 사용할 수 없는 경우 "pip"를 사용할 수 있습니다.

"mlxtend" 패키지와 같이 Conda에서 사용할 수 없는 패키지를 설치해야 하는 경우 Conda Forge를 탐색할 수 있습니다. Conda Forge는 더 광범위한 Conda 커뮤니티에서 지원하는 라이브러리를 호스팅하는 커뮤니티 기반 리포지토리입니다. Conda Forge에서 원하는 패키지를 검색하면 해당 패키지와 관련된 설치 지침을 찾을 수 있습니다.

Conda 패키지 관리자를 사용하여 "conda update" 뒤에 패키지 이름을 사용하거나 "pip"와 함께 "pip install --upgrade" 뒤에 패키지 이름을 사용하여 패키지를 업데이트할 수도 있습니다.

이 설치 및 패키지 관리 지침을 따르면 이 과정을 위해 Python을 원활하고 효율적으로 설정할 수 있습니다.

Conda Forge 채널에서 패키지를 설치하려면 다음 명령을 사용할 수 있습니다.

conda install -c conda-forge <패키지 이름>

예를 들어 Conda Forge에서 MLX Extent 패키지를 설치하려면 다음을 사용합니다.

콘다 설치 -c conda-forge mlx_ext

이 명령은 Conda Forge 채널에서 패키지를 검색하여 환경에 설치합니다.

Conda Forge 또는 다른 Conda 채널에서 필요한 패키지를 사용할 수 없는 경우 pip 패키지 관리자를 사용하여 설치할 수도 있습니다. Pip은 Python의 기본 패키지 관리자이며 이를 통해 Python 패키지 색인(PyPI)에서 패키지를 설치할 수 있습니다.

pip를 사용하여 패키지를 설치하려면 다음 명령을 사용할 수 있습니다.

pip install <패키지 이름>

예를 들어 pip를 사용하여 "example-package"라는 패키지를 설치하려면 다음을 사용합니다.

pip 설치 예제 패키지

<package-name>을 설치하려는 패키지의 실제 이름으로 바꾸십시오.

Conda와 pip를 모두 사용하는 경우 일반적으로 Conda를 기본 패키지 관리자로 사용하여 패키지 호환성을 유지하고 종속성을 관리하는 것이 좋습니다. 그러나 Conda에서 패키지를 사용할 수 없는 경우 pip를 사용하는 것이 적합한 대안입니다.

이것으로 Conda 및 pip를 사용하여 Python을 설치하고 패키지를 관리하기 위한 설정 지침을 마칩니다. 컴퓨터에 무엇이든 설치하기 전에 비디오 자습서를 시청하고 원활한 설치 프로세스를 위해 권장 단계를 따르십시오.

 

3.3 (선택 사항) Python 코드 실행


3.3 (선택 사항) Python 코드 실행

강의 3의 세 번째이자 마지막 동영상에서는 Python 코드를 실행하는 다양한 방법을 시연합니다. 이 비디오는 다가오는 숙제에 사용할 하나의 문서에서 편리한 코딩, 텍스트 작성, 방정식 렌더링 및 플로팅을 허용하는 파일 형식 및 프로그램인 Jupiter 노트북에 초점을 맞춥니다.

Jupiter 노트북에 들어가기 전에 먼저 Python 인터프리터 또는 일부 사람들이 REPL(Read-Eval-Print Loop)이라고 부르는 Python 코드를 실행하는 가장 쉬운 방법을 보여드리겠습니다. 인터프리터는 Python 코드의 대화형 실행을 허용합니다. 즉, 코드가 즉시 평가됩니다. 인터프리터를 사용하려면 터미널을 열고 "python"을 입력하면 됩니다. 여기에서 Python 식을 입력하고 결과를 즉시 확인할 수 있습니다. 예를 들어 "print(1 + 2)"를 입력하면 "3"이 표시됩니다. 값 반복 및 인쇄와 같은 보다 복잡한 작업에 인터프리터를 사용할 수도 있습니다.

인터프리터는 빠른 계산이나 계산에 유용할 수 있지만 더 복잡한 코드를 작성하는 데는 권장되지 않습니다. 계산을 놓치기 쉽고 뒤로 스크롤하여 이전에 실행한 명령을 찾는 것이 번거로울 수 있습니다. 따라서 보다 복잡한 코드의 경우 Python 스크립트나 Jupiter 노트북을 사용하는 것이 좋습니다.

다음으로 IPython이라는 대체 대화식 Python 인터프리터를 소개합니다. IPython은 구문 색상, 쉬운 코드 수정을 위한 히스토리 기능, 마법 명령을 포함하여 일반 인터프리터에 비해 추가 기능을 제공합니다. 매직 명령은 퍼센트 기호(%)로 시작하고 유용한 기능을 제공하는 특수 명령입니다. 이러한 예 중 하나는 다른 코드 구현을 벤치마킹할 수 있는 "timeit" 매직 명령입니다. 문자열을 뒤집는 두 가지 기능을 구현하고 "timeit" 명령을 사용하여 효율성을 비교하여 이를 보여줍니다.

IPython의 이점을 설명한 후 Jupiter 노트북은 원래 IPython 위에 구축되었기 때문에 IPython 노트북이라고 불렀다고 설명합니다. 지금도 Jupiter 노트북은 IPython에 의존하여 동일한 이점과 추가 기능을 제공합니다. IPython을 설치하기 위해 Conda를 사용하고 추가 문서를 위해 IPython 웹사이트를 보여줍니다.

계속해서 Python 스크립트를 사용하는 Python 코드를 실행하는 두 번째 방법에 대해 설명합니다. 이 방법은 확장자가 .py인 파일을 만들고, 파일에 코드를 작성하고, 명령줄에서 실행하는 작업을 포함합니다. 루프를 사용하여 0에서 4까지의 숫자를 인쇄하는 Python 스크립트의 예를 제공합니다.

마지막으로 깨끗하고 읽기 쉬운 코드를 작성하기 위해 PEP 8과 같은 코딩 스타일 지침을 준수하는 것이 중요하다는 점을 언급합니다. Visual Studio Code와 같은 통합 개발 환경에서 Flake8과 같은 린터를 사용하여 스타일 문제를 식별하고 수정하여 코드의 전반적인 품질을 개선하는 방법을 보여줍니다.

비디오는 인터프리터 사용, Python 스크립트 생성, IPython 및 Jupiter 노트북의 이점 활용을 포함하여 Python 코드를 실행하는 다양한 방법을 다루었습니다. 각 방법에는 고유한 장점이 있으며 다양한 목적에 적합합니다.

 

4.1 NumPy 소개(L04: Python의 과학 컴퓨팅)



4.1 NumPy 소개(L04: Python의 과학 컴퓨팅)

이 자습서에서는 배열 생성, 요소 액세스, 배열 작업 수행 등 NumPy의 기본 사항을 다룹니다. 의 시작하자!

시작하려면 NumPy 라이브러리를 가져와야 합니다. 일반적으로 np라는 별칭으로 가져옵니다. 다음 코드를 실행하여 NumPy를 가져옵니다.

import numpy as np
이제 NumPy를 가져왔으므로 첫 번째 배열을 만들어 보겠습니다. NumPy 배열은 Python 목록을 입력으로 사용하는 np.array() 함수를 사용하여 생성됩니다. 다음 코드를 실행하여 배열을 만듭니다.

arr = np.array([1, 2, 3, 4, 5])
print(arr)
다음 출력이 표시되어야 합니다.

[1 2 3 4 5]
축하해요! 첫 번째 NumPy 배열을 만들었습니다. 이제 배열에서 수행할 수 있는 몇 가지 기본 작업을 살펴보겠습니다.

배열 요소에 액세스

NumPy 배열의 요소에 액세스하려면 Python 목록과 유사한 인덱싱 및 슬라이싱을 사용할 수 있습니다. 인덱싱은 0부터 시작합니다.

다음 코드를 실행하여 배열의 요소에 액세스합니다.

 print (arr[ 0 ])   # Access the first element
print (arr[ 2 ])   # Access the third element
print (arr[- 1 ])   # Access the last element
출력은 다음과 같습니다.

1
3
5
슬라이싱을 사용하여 배열의 요소 범위에 액세스할 수도 있습니다. 슬라이싱 구문은 start:stop:step입니다. 여기서 start는 시작 인덱스, stop은 중지 인덱스(제외), step은 단계 크기입니다.

다음 코드를 실행하여 배열을 슬라이스합니다.

 print (arr[ 1 : 4 ])   # Access elements from index 1 to 3
print (arr[:: 2 ])   # Access every other element

출력은 다음과 같습니다.

[2 3 4]
[1 3 5]
어레이 작업

NumPy 배열은 더하기, 빼기, 곱하기 및 나누기와 같은 다양한 수학 연산을 지원합니다. 이러한 작업은 배열에 요소별로 적용됩니다.

다음 코드를 실행하여 배열 작업을 수행합니다.

arr1 = np. array ([ 1 , 2 , 3 ])
arr2 = np. array ([ 4 , 5 , 6 ])

# Addition
print (arr1 + arr2)

# Subtraction
print (arr1 - arr2)

# Multiplication
print (arr1 * arr2)

# Division
print (arr1 / arr2)
출력은 다음과 같습니다.

 [5 7 9]
[-3 -3 -3]
[4 10 18]
[0.25 0.4  0.5]
NumPy는 또한 배열에 적용할 수 있는 다양한 수학 함수를 제공합니다. 예를 들어 np.sin() 함수를 사용하여 배열의 사인을 계산할 수 있습니다.

다음 코드를 실행하여 수학 함수를 배열에 적용합니다.

arr = np. array ([ 0 , np.pi/ 2 , np.pi])

# Calculate sine
print (np.sin(arr))
출력은 다음과 같습니다.

[0.0000000e+00 1.0000000e+00 1.2246468e-16]

배열 모양 및 모양 변경

NumPy 배열의 모양은 행과 열의 수와 같은 차원을 나타냅니다. shape 속성을 사용하여 배열의 모양을 확인할 수 있습니다.

다음 코드를 실행하여 배열의 형태를 확인합니다.

arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape)
출력은 다음과 같습니다.

(2, 3)
reshape() 함수를 사용하여 배열의 모양을 변경할 수도 있습니다. 이 함수를 사용하면 데이터를 변경하지 않고 배열의 크기를 조정할 수 있습니다.

다음 코드를 실행하여 배열을 재구성합니다.

arr = np.array([1, 2, 3, 4, 5, 6])
reshaped_arr = arr.reshape((2, 3))
print(reshaped_arr)
출력은 다음과 같습니다.

[[1 2 3]
 [4 5 6]]
이것은 NumPy로 수행할 수 있는 기본 작업 중 일부에 불과합니다. 라이브러리는 배열을 효율적으로 사용하기 위한 다양한 기능과 기능을 제공합니다. NumPy의 기능에 대해 자세히 알아보려면 NumPy 설명서를 살펴보는 것이 좋습니다.