티스토리 뷰

서평단활동

개발자를 위한 AI 알고리즘 (1일차)

잔잔한 물결처럼 2025. 12. 15. 23:50

영진닷컴에서 진행하는 서평단 이벤트에 참가하게 되어서 하던 취업준비는 잠시 멈추고 AI 알고리즘 공부를 하게 되었다. ㅎㅎ
책은 총 500페이지 정도 분량이고 난이도는 기본적인 파이썬 문법부터 설명하지만 상당히 깊은 내용도 많이 포함하고 있어서 많이 힘들수도 있을것 같다.

혹시 이책에 대해서 관심을 가지고 블로그에 왔다면 책의 목차를 보고 어떤 내용일지 가늠해 보기 바란다.

[1부] 기초 및 핵심 알고리즘

1장 알고리즘 개요

  • 1.1 알고리즘이란 무엇인가?
    • 1.1.1 알고리즘의 단계
    • 1.1.2 개발 환경
  • 1.2 파이썬 패키지
    • 1.2.1 SciPy 생태계
  • 1.3 알고리즘 설계 기법
    • 1.3.1 데이터 차원
    • 1.3.2 계산 차원
  • 1.4 성능 분석
    • 1.4.1 공간 복잡도 분석
    • 1.4.2 시간 복잡도 분석
    • 1.4.3 성능 평가
    • 1.4.4 빅오 표기법
    • 1.4.5 상수 시간 O(1) 복잡도
    • 1.4.6 선형 시간 O(n) 복잡도
    • 1.4.7 2차 시간 O(n²) 복잡도
    • 1.4.8 로그 시간 O(logn) 복잡도
  • 1.5 알고리즘 선택하기
  • 1.6 알고리즘 검증
    • 1.6.1 정확한 알고리즘, 근사 알고리즘, 무작위 알고리즘
    • 1.6.2 설명 가능성

2장 알고리즘에 사용되는 자료 구조

  • 2.1 파이썬 내장 자료형 탐색하기
    • 2.1.1 리스트
    • 2.1.2 튜플
    • 2.1.3 딕셔너리와 세트
    • 2.1.4 시리즈와 데이터프레임 사용하기
    • 2.1.5 행렬
  • 2.2 추상 자료형 탐색하기
    • 2.2.1 벡터
    • 2.2.2 스택
    • 2.2.3 큐
    • 2.2.4 트리

3장 정렬 및 탐색 알고리즘

  • 3.1 정렬 알고리즘 소개
    • 3.1.1 파이썬에서 변수 교환하기
    • 3.1.2 버블 정렬
    • 3.1.3 삽입 정렬
    • 3.1.4 병합 정렬
    • 3.1.5 셸 정렬
    • 3.1.6 선택 정렬
    • 3.1.7 정렬 알고리즘 선택하기
  • 3.2 탐색 알고리즘 소개
    • 3.2.1 선형 탐색
    • 3.2.2 이진 탐색
    • 3.2.3 보간 탐색
  • 3.3 실용 예제

4장 알고리즘 설계

  • 4.1 알고리즘 설계의 기본 개념 소개
    • 4.1.1 고려 1 - 정확성: 우리가 기대한 결과를 생성하고 있는가?
    • 4.1.2 고려 2 - 성능: 최적의 방식인가?
    • 4.1.3 고려 3 - 확장성: 더 큰 데이터세트에서 어떻게 작동할 것인가?
  • 4.2 알고리즘 전략 이해하기
    • 4.2.1 분할 정복 전략 이해하기
    • 4.2.2 동적 프로그래밍 전략 이해하기
    • 4.2.3 탐욕 알고리즘 이해하기
  • 4.3 실제 응용 - 외판원 문제(TSP) 해결
    • 4.3.1 무차별 대입 전략 사용하기
    • 4.3.2 탐욕 알고리즘 사용하기
    • 4.3.3 세 가지 전략 비교
  • 4.4 페이지랭크 알고리즘 소개
    • 4.4.1 문제 정의
    • 4.4.2 페이지랭크 알고리즘 구현하기
  • 4.5 선형 프로그래밍 이해하기
    • 4.5.1 선형 프로그래밍 문제 공식화하기
    • 4.5.2 실용 예제 - 선형 프로그래밍으로 공급능력 계획하기

5장 그래프 알고리즘

  • 5.1 그래프 이해하기: 간단한 소개
    • 5.1.1 그래프: 현대 데이터 네트워크의 중추
    • 5.1.2 그래프 기초: 정점(혹은 노드)
  • 5.2 그래프 이론과 네트워크 분석
  • 5.3 그래프 표현 방식
  • 5.4 그래프의 구조와 종류
    • 5.4.1 자아 중심 네트워크
  • 5.5 네트워크 분석 이론 소개
    • 5.5.1 최단 경로 이해하기
    • 5.5.2 중심성 지표 이해하기
    • 5.5.3 파이썬으로 중심성 계산하기
    • 5.5.4 소셜 네트워크 분석
  • 5.6 그래프 순회 이해하기
    • 5.6.1 BFS
    • 5.6.2 DFS
  • 5.7 사례 연구: 소셜 네트워크 분석으로 사기 탐지하기
    • 5.7.1 도입
    • 5.7.2 사례 연구에서 사기란 무엇인가?
    • 5.7.3 단순한 사기 분석 수행하기
    • 5.7.4 감시탑 사기 분석 방법 소개

[2부] 머신 러닝 알고리즘

6장 비지도 머신 러닝 알고리즘

  • 6.1 비지도 학습 개요
    • 6.1.1 데이터 마이닝 생명 주기에서 비지도 학습
    • 6.1.2 비지도 학습의 현재 연구 경향
    • 6.1.3 실용 예제
  • 6.2 클러스터링 알고리즘 이해하기
    • 6.2.1 유사도 계산하기
    • 6.2.2 k-평균 클러스터링 알고리즘
  • 6.3 계층적 클러스터링의 단계
  • 6.4 계층적 클러스터링 알고리즘 코드 작성하기
  • 6.5 DBSCAN 이해하기
  • 6.6 파이썬으로 DBSCAN을 사용하여 클러스터 생성하기
  • 6.7 클러스터 평가하기
    • 6.7.1 클러스터링 응용 분야
  • 6.8 차원 축소
    • 6.8.1 주성분 분석
  • 6.9 연관 규칙 마이닝
    • 6.9.1 규칙의 종류
    • 6.9.2 연관 규칙 마이닝을 위한 알고리즘

7장 전통적인 지도 학습 알고리즘

  • 7.1 지도 학습 이해하기
  • 7.2 지도 학습 문제 공식화하기
    • 7.2.1 가능 조건 이해하기
    • 7.2.2 분류 모델과 회귀 모델 차이 구분하기
  • 7.3 분류 알고리즘 이해하기
    • 7.3.1 분류 모델 과제 소개
    • 7.3.2 혼동 행렬
    • 7.3.3 재현율과 정밀도 간의 트레이드 오프 이해하기
  • 7.4 결정 트리 분류 알고리즘
    • 7.4.1 결정 트리 분류 알고리즘 이해하기
    • 7.4.2 결정 트리 분류 모델의 장단점
    • 7.4.3 사용 사례
  • 7.5 앙상블 기법 이해하기
    • 7.5.1 XGBoost 알고리즘으로 그라디언트 부스팅 구현하기
    • 7.5.2 앙상블 부스팅과 랜덤 포레스트 알고리즘의 차이 구분하기
    • 7.5.3 분류 모델 과제에 랜덤 포레스트 알고리즘 활용하기
  • 7.6 로지스틱 회귀
    • 7.6.1 가정
    • 7.6.2 관계 설정하기
    • 7.6.3 손실 함수와 비용 함수
    • 7.6.4 로지스틱 회귀를 사용해야 하는 경우
    • 7.6.5 분류 모델 과제에 로지스틱 회귀 알고리즘 활용하기
  • 7.7 SVM 알고리즘
    • 7.7.1 분류 모델 과제에 SVM 알고리즘 활용하기
    • 7.7.2 나이브 베이즈 알고리즘 이해하기
  • 7.8 베이즈 정리
    • 7.8.1 확률 계산하기
    • 7.8.2 곱셈 법칙과 AND 사건
    • 7.8.3 일반적인 곱셈 법칙
    • 7.8.4 OR 사건에 대한 덧셈 법칙
    • 7.8.5 분류 모델 과제에 나이브 베이즈 알고리즘 활용하기
  • 7.9 분류 알고리즘의 승자는...
  • 7.9.1 회귀 알고리즘 이해
  • 7.9.2 회귀 모델 과제 소개
  • 7.9.3 회귀 모델 문제 정의
  • 7.9.4 과거 데이터셋 탐색하기
  • 7.9.5 데이터 처리 파이프라인을 활용한 특징 공학
  • 7.10 선형 회귀
    • 7.10.1 단순 선형 회귀
    • 7.10.2 회귀 모델 평가하기
    • 7.10.3 다중 회귀
    • 7.10.4 회귀 모델 과제에 선형 회귀 알고리즘 활용하기
    • 7.10.5 선형 회귀는 언제 사용하는가?
    • 7.10.6 선형 회귀의 약점
    • 7.10.7 회귀 트리 알고리즘
    • 7.10.8 회귀 모델 문제에 회귀 트리 알고리즘 활용하기
    • 7.10.9 그라디언트 부스트 회귀 알고리즘
    • 7.10.10 회귀 모델 과제에 그라디언트 부스트 회귀 알고리즘 활용하기
  • 7.11 회귀 알고리즘의 승자는...
  • 7.12 실용 예제: 날씨 예측하기

8장 신경망 알고리즘

  • 8.1 신경망의 진화
    • 8.1.1 역사적 배경
    • 8.1.2 AI 겨울과 AI 봄의 시작
  • 8.2 신경망 이해하기
    • 8.2.1 퍼셉트론 이해하기
    • 8.2.2 신경망 직관적으로 이해하기
    • 8.2.3 딥러닝의 층 구조 이해하기
  • 8.3 신경망 훈련시키기
  • 8.4 신경망의 구조 이해하기
  • 8.5 경사 하강법 정의하기
  • 8.6 활성화 함수
    • 8.6.1 계단 함수
    • 8.6.2 시그모이드 함수
    • 8.6.3 ReLU
    • 8.6.4 쌍곡 탄젠트(tanh)
    • 8.6.5 소프트맥스
  • 8.7 도구 및 프레임워크
    • 8.7.1 케라스
  • 8.8 순차적 모델 또는 함수형 모델 선택하기
    • 8.8.1 텐서플로 이해하기
    • 8.8.2 텐서플로의 기본 개념 소개
    • 8.8.3 텐서에 대한 수학적 이해
  • 8.9 신경망 종류 이해하기
    • 8.9.1 합성곱 신경망
    • 8.9.2 생성적 적대 신경망
  • 8.10 전이 학습 활용하기
  • 8.11 사례 연구: 위조 문서 탐지에 딥 러닝 활용하기
    • 8.11.1 방법론

9장 자연어 처리를 위한 알고리즘

  • 9.1 자연어 처리 개론
  • 9.2 자연어 처리 용어 이해
    • 9.2.1 자연어 처리의 텍스트 전처리
  • 9.3 파이썬으로 데이터 정제하기
  • 9.4 단어 문서 행렬(Term Document Matrix) 이해
    • 9.4.1 TF-IDF 사용하기
    • 9.4.2 결과 요약 및 논의
  • 9.5 워드 임베딩 개론
  • 9.6 Word2Vec으로 워드 임베딩 구현하기
    • 9.6.1 유사도 점수 해석
    • 9.6.2 Word2Vec의 장단점
  • 9.7 사례 연구: 레스토랑 리뷰 감성 분석
    • 9.7.1 필요 라이브러리 및 데이터셋 가져오기
    • 9.7.2 정제된 말뭉치 구축: 텍스트 데이터 전처리
    • 9.7.3 텍스트 데이터를 숫자 특징으로 변환하기
    • 9.7.4 결과 분석하기
  • 9.8 자연어 처리 응용 분야

10장 순차 모델 이해하기

  • 10.1 순차 데이터 이해
    • 10.1.1 순차 모델의 종류
  • 10.2 순차 모델의 데이터 표현
  • 10.3 RNN 개론
    • 10.3.1 RNN 구조 이해
    • 10.3.2 첫 번째 타입스텝에서 RNN 훈련하기
    • 10.3.3 시간에 따른 역전파
    • 10.3.4 기본 RNN의 한계
  • 10.4 GRU(게이트 순환 유닛)
    • 10.4.1 업데이트 게이트 소개
    • 10.4.2 업데이트 게이트 구현
    • 10.4.3 은닉 셀 업데이트하기
  • 10.5 LSTM(장단기 메모리) 소개
    • 10.5.1 망각 게이트
    • 10.5.2 후보 셀 상태
    • 10.5.3 업데이트 게이트
    • 10.5.4 메모리 상태 계산하기
    • 10.5.5 출력 게이트
    • 10.5.6 모두 합치기
    • 10.5.7 순차 모델 코딩하기

11장 고급 순차 모델 알고리즘

  • 11.1 고급 순차 모델 기법의 발전
  • 11.2 오토인코더 탐색
    • 11.2.1 오토 인코더 코드 작성하기
    • 11.2.2 환경 준비
  • 11.3 Seq2Seq 모델 이해하기
    • 11.3.1 인코더
    • 11.3.2 사고 벡터
    • 11.3.3 디코더
    • 11.3.4 Seq2Seq의 특수 토큰
    • 11.3.5 정보 병목 딜레마
  • 11.4 어텐션 메커니즘 이해
    • 11.4.1 신경망에서 어텐션이란?
    • 11.4.2 어텐션 메커니즘의 세 가지 주요 측면
    • 11.4.3 어텐션 메커니즘 더 깊이 들여다보기
    • 11.4.4 어텐션 메커니즘의 문제
  • 11.5 셀프 어텐션 자세히 살펴보기
    • 11.5.1 어텐션 가중치
    • 11.5.2 인코더: 양방향 순환 신경망
    • 11.5.3 사고 벡터
    • 11.5.4 디코더: 일반 RNN
    • 11.5.5 훈련 대 추론
  • 11.6 트랜스포머: 셀프 어텐션 이후 신경망의 진화
    • 11.6.1 트랜스포머가 빛나는 이유
    • 11.6.2 파이썬 코드 분석
    • 11.6.3 출력 결과 이해하기
  • 11.7 대규모 언어 모델
    • 11.7.1 LLM에서의 어텐션 이해하기
    • 11.7.2 NLP의 대표 주자 탐색: GPT와 BERT
    • 11.7.3 강력한 LLM을 만들기 위한 딥 앤 와이드 모델 활용
  • 11.8 딥 앤 와이드 모델

[3부] 심화 주제

12장 추천 엔진

  • 12.1 추천 시스템 개론
  • 12.2 추천 엔진 유형
    • 12.2.1 내용 기반 추천 엔진
    • 12.2.2 협업 필터링 추천 엔진
    • 12.2.3 혼합 추천 엔진
  • 12.3 추천 시스템의 한계
    • 12.3.1 콜드 스타트 문제
    • 12.3.2 메타데이터 요구조건
    • 12.3.3 데이터 희소성 문제
    • 12.3.4 추천 시스템에서 사회적 영향이라는 양날의 검
  • 12.4 응용 분야
    • 12.4.1 넷플릭스의 고도화된 데이터 기반 추천
    • 12.4.2 아마존 추천 시스템의 진화
  • 12.5 실용 예제 - 추천 엔진 만들기
    • 12.5.1 프레임워크 설정하기
    • 12.5.2 데이터 불러오기: 리뷰 및 제목 가져오기
    • 12.5.3 데이터 병합: 종합적 관점 다듬기
    • 12.5.4 서술적 분석: 평점으로부터 통찰 도출하기
    • 12.5.5 추천을 위한 구조화: 행렬 만들기
    • 12.5.6 엔진 테스트: 영화 추천하기

13장 데이터 처리를 위한 알고리즘 전략

  • 13.1 데이터 알고리즘 개론
    • 13.1.1 데이터 알고리즘에서 CAP 정리의 중요성
    • 13.1.2 분산 환경에서의 저장
    • 13.1.3 CAP 정리와 데이터 압축의 연관성
  • 13.2 CAP 정리 소개
    • 13.2.1 CA 시스템
    • 13.2.2 AP 시스템
    • 13.2.3 CP 시스템
  • 13.3 데이터 압축 알고리즘 제대로 이해하기
    • 13.3.1 무손실 압축 기법
  • 13.4 실용 예제: CAP 정리와 압축 알고리즘에 초점을 맞춘 AWS의 데이터 관리
    • 13.4.1 CAP 정리 적용하기
    • 13.4.2 압축 알고리즘 사용하기
    • 13.4.3 장점을 정량화하기

14장 암호화

  • 14.1 암호학 개론
    • 14.1.1 가장 약한 연결고리의 중요성 이해하기
    • 14.1.2 기본 용어
    • 14.1.3 보안 요구사항 이해하기
    • 14.1.4 암호의 기본 설계 이해하기
  • 14.2 암호화 기법의 종류 이해하기
    • 14.2.1 암호화 해시 함수 사용하기
    • 14.2.2 대칭 암호화 사용하기
    • 14.2.3 비대칭 암호화
  • 14.3 예제: 머신 러닝 모델을 배포할 때의 보안 문제
    • 14.3.1 중간자 공격

15장 대규모 알고리즘

  • 15.1 대규모 알고리즘 개론
  • 15.2 대규모 알고리즘을 위한 고성능 인프라 특징
    • 15.2.1 탄력성
    • 15.2.2 잘 설계된 대규모 알고리즘의 특징
  • 15.3 멀티 리소스 처리 전략 수립
  • 15.4 병렬 컴퓨팅의 이론적 한계
    • 15.4.1 암달의 법칙
    • 15.4.2 암달의 법칙 도출하기
    • 15.4.3 병렬 컴퓨팅에서 GPU의 잠재력을 이끌어내는 CUDA
    • 15.4.4 아파치 스파크를 활용한 클러스터 컴퓨팅의 이점
  • 15.5 아파치 스파크가 대규모 알고리즘 처리를 가능하게 하는 방법
    • 15.5.1 분산 컴퓨팅
    • 15.5.2 메모리 내 처리
  • 15.6 클라우드 컴퓨팅에서 대규모 알고리즘 활용
    • 15.6.1 예제

16장 현실적 고려 사항

  • 16.1 알고리즘 솔루션이 마주한 도전 과제
    • 16.1.1 예상치 못한 것을 예측하기
  • 16.2 트위터 AI 봇, 테이의 실패
  • 16.3 알고리즘의 설명 가능성
    • 16.3.1 머신 러닝 알고리즘과 설명 가능성
  • 16.4 알고리즘 윤리 이해
    • 16.4.1 학습 알고리즘의 문제점
    • 16.4.2 윤리적 고려 사항 이해하기
    • 16.4.3 알고리즘 솔루션에 영향을 주는 요인
  • 16.5 모델 편향 줄이기
  • 16.6 알고리즘을 언제 사용할 것인가?
    • 16.6.1 블랙스완 사건과 그것이 알고리즘에 미치는 영향 이해하기

 

책이 다루는 내용이 처음에는 간단하지만 뒤로 가면 갈수록 많이 어려워진다.

빅데이터 분석기사, 정보처리기사 정도의 배경지식이 있어야 내용을 어느정도 소화하면서 읽을 수 있을것 같다.

 

오늘의 학습 내용

💻 개발의 단계

효율적인 소프트웨어 개발을 위해서는 단계적 접근이 필수다.

1단계: 설계 단계

  • 문제를 분석하고 해결 방안을 계획하는 과정
  • 어떻게 구현할 것인가에 대한 청사진 작성
  • 시간을 투자해 먼저 설계하면 나중의 오류를 줄일 수 있다

2단계: 코드 작성 단계

  • 설계 내용을 실제 프로그래밍 언어로 구현하는 과정
  • 설계 단계에서 정한 규칙과 구조에 따라 코드 작성
  • 테스트와 디버깅을 통해 품질 보증

📋 요구사항 분석

효과적인 소프트웨어 개발을 위해 두 가지 요구사항을 충족해야 한다.

기능적 요구사항 (Functional Requirements)

소프트웨어가 수행해야 하는 기능과 동작을 정의

특징:

  • 사용자가 원하는 결과를 제공하기 위한 요구사항
  • "무엇을 하는가"를 명확히 함
  • 예시: 데이터 검색, 계산, 저장, 사용자 인증 등

비기능적 요구사항 (Non-Functional Requirements)

성능, 보안, 안정성 등의 품질 요구사항을 정의

특징:

  • 소프트웨어가 얼마나 잘 작동하는지를 평가하는 지표
  • "얼마나 잘 하는가"를 명확히 함
  • 예시: 응답 시간 1초 이내, 메모리 사용량 500MB 이하, 99.9% 가용성 등

🐍 파이썬 프로그래밍 언어

파이썬의 정의

파이썬은 범용 프로그래밍 언어로, 다양한 분야에서 활용된다.

활용 분야:

  • 🌐 웹 개발 (Django, Flask)
  • 📊 데이터 분석 (Pandas, NumPy)
  • 🤖 머신러닝 및 인공지능 (TensorFlow, PyTorch)
  • ⚙️ 시스템 자동화
  • 🔬 과학 계산

"배터리 포함(Batteries Included)" 철학

파이썬의 핵심 설계 철학

정의:
표준 라이브러리가 기본적으로 풍부하게 제공된다는 의미

의미:

  • 파이썬을 설치하면 곧바로 많은 기능을 사용할 수 있다
  • 추가 패키지 없이도 다양한 작업을 수행 가능
  • 개발을 시작하기 위한 기초 도구가 모두 준비되어 있다

장점:

  • ✅ 초보자 진입 장벽 낮음
  • ✅ 개발 생산성 향상
  • ✅ 학습 곡선 완화
  • ✅ 즉시 프로젝트 시작 가능

즉, 파이썬은 기본 기능만으로도 많은 작업을 할 수 있는 완성도 높은 언어이다.


📦 파이썬 패키지 관리 체계

파이썬 패키지 인덱스 (PyPI: Python Package Index)

정의:
파이썬 공식 서드파티(제3자) 패키지 저장소

역할:

  • 개발자들이 만든 다양한 패키지를 공유하고 배포하는 중앙 집중식 플랫폼
  • 누구나 자신의 패키지를 등록하고 공개 가능
  • 검증된 안정적인 패키지들이 관리됨

특징:

  • 📚 수십만 개의 오픈소스 패키지 제공
  • 🌍 전 세계 개발자들의 협업
  • 📝 패키지별 상세한 문서 제공

웹사이트: https://pypi.org/


🛠️ pip 패키지 관리 시스템

pip는 파이썬 패키지 관리 도구로, PyPI에서 패키지를 다운로드하고 설치한다.

기본 명령어

1. 패키지 설치

 
bash
pip install PackageName

PyPI에서 최신 버전의 패키지를 다운로드하여 설치

2. 패키지를 최신 버전으로 업그레이드

 
bash
pip install PackageName --upgrade

이미 설치된 패키지를 최신 버전으로 업데이트

3. 특정 버전 설치

 
bash
pip install PackageName==2.1

특정 버전이 필요할 때 사용 (호환성 문제 해결)

pip의 장점

특징설명
쉬운 설치 한 줄의 명령어로 패키지 설치 가능
자동 의존성 처리 필요한 다른 패키지도 자동으로 설치
버전 관리 여러 버전 간 호환성 문제 해결 가능
직관적 사용하기 간단한 인터페이스
커뮤니티 지원 광범위한 커뮤니티 지원과 활발한 개발

📝 권장되는 패키지 관리 비법

requirements.txt 파일 활용

목적:
프로젝트가 필요로 하는 모든 패키지와 버전을 명시하여 관리

필요한 이유:

  • 👥 팀원과의 협업 시 동일한 환경 구성
  • 🔄 다른 컴퓨터에서 프로젝트 실행 시 동일한 결과 보증
  • 📦 배포 시 필요한 패키지를 명확히 명시
  • 🐛 버전 충돌로 인한 오류 방지

사용 방법

Step 1: requirements.txt 파일 생성

프로젝트 최상단에 requirements.txt 파일을 생성하고 다음과 같이 작성:

 
text
scikit-learn==0.24.1 tensorflow==2.5.0 numpy==1.19.5 pandas==1.2.4 matplotlib==3.3.4

작성 규칙:

  • 패키지명과 버전을 ==로 연결
  • 한 줄에 하나의 패키지
  • 특정 버전이 중요하면 PackageName==버전
  • 버전 상관없으면 PackageName (최신 버전 설치)

Step 2: 기록된 모든 패키지 설치

 
bash
pip install -r requirements.txt

이 명령어는 requirements.txt에 기록된 모든 패키지를 한 번에 설치한다.

실무 예제

프로젝트 구조:

 
text
my-project/ ├── requirements.txt ├── main.py ├── config.py └── data/

requirements.txt 예제 (데이터 분석 프로젝트):

 
text
# 데이터 분석 및 처리 pandas==1.3.5 numpy==1.21.0 scikit-learn==0.24.2 # 시각화 matplotlib==3.4.3 seaborn==0.11.2 # 머신러닝 tensorflow==2.7.0 keras==2.6.0 # 유틸리티 requests==2.26.0 python-dotenv==0.19.0

협업 시 흐름:

  1. 개발자 A: pip install -r requirements.txt → 동일한 환경 구성
  2. 개발자 B: pip install -r requirements.txt → 동일한 환경 구성
  3. 모두: 동일한 결과 도출 ✅

장점 요약

장점설명
재현성 어느 환경에서나 동일한 결과 재현 가능
협업 효율성 팀원과의 환경 동기화 자동화
배포 안정성 프로덕션 배포 시 필요한 패키지 명확히 명시
버전 관리 특정 버전 사용으로 호환성 문제 방지
문서화 프로젝트 의존성을 명확하게 기록

📚 학습 포인트 정리

개념핵심 내용
알고리즘 문제 해결의 단계별 규칙 집합
개발 단계 설계 → 코드 작성
요구사항 분석 기능적, 비기능적 요구사항 모두 고려
파이썬 배터리 포함 철학의 범용 언어
PyPI 파이썬 공식 패키지 저장소
pip 패키지 설치 및 관리 도구
requirements.txt 프로젝트 의존성 관리의 표준 방식

💡 알고리즘 학습의 의미

이 책을 통해 배운 기초 개념들은 다음을 가능하게 한다:

  • 📊 효율적인 코드 작성: 알고리즘의 특성을 이해하고 최적화된 코드 구현
  • 🔍 성능 개선: 시간 복잡도와 공간 복잡도를 고려한 개선
  • 🏗️ 견고한 설계: 요구사항 분석을 통한 체계적인 개발
  • 🛠️ 도구 활용: 파이썬과 다양한 패키지를 효과적으로 사용
  • 👥 협업 능력: 표준화된 패키지 관리로 팀 개발 효율화

🎓 초보 개발자를 위한 팁

  1. 먼저 설계하고 코딩하자 - 설계 단계의 중요성 이해
  2. 요구사항을 명확히 하자 - 기능과 성능 모두 정의
  3. 파이썬의 기본 기능부터 배우자 - 배터리 포함 철학 활용
  4. 패키지는 정확한 버전을 관리하자 - requirements.txt 사용 필수
  5. 재현성을 중시하자 - 동료와의 환경 동기화는 필수

 

SciPy 생태계

SciPy 생태계란?
파이썬 기반의 과학 계산, 데이터 분석, 머신러닝을 위한 라이브러리 모음

핵심 라이브러리

라이브러리역할주요 기능
NumPy 수치 계산 배열, 행렬 연산, 선형대수
Scikit-learn 머신러닝 분류, 회귀, 클러스터링, 전처리
Pandas 데이터 분석 DataFrame, 데이터 전처리, 시계열 분석
Matplotlib 데이터 시각화 그래프, 차트, 플롯

생태계의 특징:

  • 🔗 서로 연동되어 작동
  • 📊 데이터 수집 → 정제 → 분석 → 시각화 전체 파이프라인 지원
  • 🌍 전 세계 과학자, 데이터 분석가, 머신러닝 엔지니어들이 사용

🎯 알고리즘 설계의 주요 사항

효과적인 알고리즘을 설계하기 위해 반드시 확인해야 할 3가지 핵심 질문

1️⃣ 정확성 (Correctness)

"알고리즘이 기대한 결과를 생성하고 있는가?"

  • 입력된 데이터에 대해 올바른 출력을 생성하는가?
  • 모든 경우의 수에서 예상된 결과를 출력하는가?
  • 예시: 정렬 알고리즘이 실제로 오름차순으로 정렬하는가?

확인 방법:

  • 다양한 테스트 케이스 작성
  • 경계값(edge case) 테스트
  • 예상 결과와 실제 결과 비교

2️⃣ 최적성 (Optimality)

"최적의 방식인가?"

  • 같은 문제를 해결하는 여러 알고리즘 중 더 나은 방법이 있는가?
  • 같은 결과를 위해 더 적은 자원(시간, 메모리)을 사용할 수 있는가?
  • 예시: 정렬 알고리즘 중 시간복잡도가 O(n)인 알고리즘이 O(n²)인 알고리즘보다 우수한가?

확인 방법:

  • 시간 복잡도 분석
  • 공간 복잡도 분석
  • 여러 알고리즘 성능 비교

3️⃣ 확장성 (Scalability)

"더 큰 데이터셋에도 작동하는가?"

  • 작은 데이터(100개)에서는 작동하지만 큰 데이터(1,000만 개)에서는?
  • 알고리즘이 데이터 크기에 따라 어떻게 성능이 변하는가?
  • 예시: 메모리가 부족한 환경에서도 실행 가능한가?

확인 방법:

  • 다양한 크기의 데이터 테스트
  • 성능 추이 분석
  • 병목 지점 파악

🏗️ 알고리즘 유형 분류

알고리즘은 컴퓨터 자원 사용 특성에 따라 분류된다.

1. 데이터 집약 알고리즘 (Data-Intensive)

특징: 많은 데이터를 처리해야 함

  • 대용량 데이터 읽기 및 쓰기가 주요 작업
  • I/O(입출력) 성능이 중요
  • 예시: 빅데이터 분석, 로그 파일 처리, 데이터베이스 쿼리

최적화 전략:

  • 디스크 I/O 최소화
  • 캐싱 활용
  • 병렬 처리

2. 계산 집약 알고리즘 (Computation-Intensive)

특징: 복잡한 계산을 많이 수행해야 함

  • CPU 연산이 주요 작업
  • 알고리즘의 복잡도가 높음
  • 예시: 행렬 연산, 머신러닝 모델 학습, 이미지 처리

최적화 전략:

  • 연산 개수 감소
  • 알고리즘 선택 최적화
  • GPU 활용

3. 데이터 계산 집약 알고리즘 (Both Data & Computation-Intensive)

특징: 데이터도 많고 복잡한 계산도 수행

  • 빅데이터 처리 + 머신러닝
  • 전체 파이프라인의 효율성이 중요
  • 예시: 추천 시스템, 자연어 처리, 이미지 인식

최적화 전략:

  • 데이터 전처리 효율화
  • 분산 처리 (MapReduce, Spark)
  • 모델 최적화

📊 데이터 차원 분석

알고리즘을 설계할 때 데이터의 특성을 파악하는 3V 분석

3V: Volume, Velocity, Variety

V의미설명예시
Volume (규모) 데이터의 양 얼마나 많은 데이터인가? 1GB, 1TB, 1PB
Velocity (속도) 데이터의 수집/처리 속도 데이터가 얼마나 빠르게 들어오는가? 실시간 스트림, 배치 처리
Variety (다양성) 데이터의 형식 다양성 여러 종류의 데이터인가? 이미지, 텍스트, 숫자, 비디오

3V 분석의 중요성:

  • ✅ 적절한 알고리즘 선택
  • ✅ 필요한 인프라 결정
  • ✅ 처리 방식 결정 (배치 vs 실시간)

예시 분석:

 
text
SNS 피드 분석 알고리즘: - Volume: 매일 수십억 개의 게시물 (빅데이터) - Velocity: 실시간 스트림 처리 필요 (고속) - Variety: 텍스트, 이미지, 동영상, 링크 (다양함) → 분산 처리 + 실시간 스트리밍 + 다중 포맷 지원 필요

⚙️ 알고리즘 성능 분석

좋은 알고리즘이 갖춰야 할 3가지 필수 요소

1️⃣ 정확할 것 (Correctness)

알고리즘이 문제를 올바르게 해결하는가?

  • 모든 입력에 대해 올바른 결과 도출
  • 예외 상황 처리
  • 테스트 케이스 통과

측정 방법:

  • 단위 테스트 (Unit Test)
  • 통합 테스트 (Integration Test)
  • 성능 테스트 (Performance Test)

2️⃣ 이해 가능할 것 (Understandability)

코드와 알고리즘이 명확하고 유지보수 가능한가?

  • 변수명, 함수명이 명확한가?
  • 복잡한 로직에 주석이 있는가?
  • 다른 개발자가 이해하기 쉬운가?

개선 방법:

  • 의미 있는 변수명 사용
  • 함수 분리 (Single Responsibility)
  • 문서화

3️⃣ 효율적일 것 (Efficiency)

제한된 자원(시간, 메모리)을 최소한으로 사용하는가?

  • 실행 시간 최소화 (시간 복잡도)
  • 메모리 사용 최소화 (공간 복잡도)
  • 자원 활용 최적화

개선 방법:

  • 알고리즘 선택
  • 캐싱 활용
  • 데이터 구조 최적화

💾 공간 복잡도 최소화 지침

메모리 사용을 효율적으로 줄이기 위한 3가지 핵심 전략

1️⃣ 가능한 한 반복적으로 설계

재귀 대신 반복문 사용하기

 
python
# ❌ 나쁜 예: 재귀 (스택 메모리 과다 사용) def factorial_recursive(n): if n <= 1: return 1 return n * factorial_recursive(n - 1) # 매번 함수 호출이 스택에 쌓임 → O(n) 공간 필요 # ✅ 좋은 예: 반복문 (메모리 효율적) def factorial_iterative(n): result = 1 for i in range(2, n + 1): result *= i return result # O(1) 공간만 필요

효과:

  • 스택 메모리 절약
  • 콜 스택 오버플로우 방지
  • 실행 속도 향상

2️⃣ 반복 횟수 줄이기

불필요한 반복문 제거하기

 
python
# ❌ 나쁜 예: 중첩 루프 (O(n²) 시간, 많은 계산) def find_duplicates(arr): for i in range(len(arr)): for j in range(len(arr)): if i != j and arr[i] == arr[j]: return True return False # ✅ 좋은 예: 해시셋 사용 (O(n) 시간, 메모리는 추가 필요하지만 시간 단축) def find_duplicates(arr): seen = set() for num in arr: if num in seen: return True seen.add(num) return False

효과:

  • 실행 시간 단축
  • CPU 활용률 감소
  • 전력 소비 감소

3️⃣ 필요한 정보만 가져오고 불필요한 정보는 제거

불필요한 데이터 저장 제거하기

 
python
# ❌ 나쁜 예: 모든 중간 결과 저장 (O(n) 공간) def sum_of_squares(arr): results = [] # 불필요한 리스트 for num in arr: results.append(num ** 2) return sum(results) # 전체 배열 크기만큼 메모리 추가 사용 # ✅ 좋은 예: 최종 결과만 저장 (O(1) 공간) def sum_of_squares(arr): total = 0 for num in arr: total += num ** 2 return total # 상수 메모리만 사용

효과:

  • 메모리 사용량 대폭 감소
  • 더 큰 데이터셋 처리 가능
  • 캐시 효율성 향상

⏱️ 시간 복잡도 분석

알고리즘이 얼마나 빠르게 대규모 데이터를 처리할 수 있는지 평가하는 방법

핵심 질문 2가지

1️⃣ "이 알고리즘이 확장 가능한가?"

데이터 크기가 증가할 때 실행 시간이 어떻게 변하는가?

 
text
선형 탐색: O(n) - 데이터 10배 증가 → 실행 시간 10배 증가 - 확장성: 나쁨 (대규모 데이터에 부적합) 이진 탐색: O(log n) - 데이터 10배 증가 → 실행 시간 약간만 증가 - 확장성: 좋음 (대규모 데이터에 적합)

2️⃣ "이 알고리즘은 더 큰 데이터셋을 얼마나 잘 처리할 수 있는가?"

같은 시간 내에 처리할 수 있는 최대 데이터 크기는?

 
text
O(n): 1초 내 1,000만 개 처리 O(n²): 1초 내 3,000개 처리 O(log n): 1초 내 1조 개 처리 → 데이터가 클수록 O(log n) 선택!

시간 복잡도별 성능 비교

복잡도1,000개1,000,000개성능 평가
O(1) 1ns 1ns ⭐⭐⭐⭐⭐
O(log n) 10ns 20ns ⭐⭐⭐⭐
O(n) 1μs 1ms ⭐⭐⭐
O(n log n) 10μs 20ms ⭐⭐⭐
O(n²) 1ms 1000초 ⭐⭐
O(2ⁿ) 엄청 오래 불가능

🔀 알고리즘 분류 체계

알고리즘은 특성에 따라 다양하게 분류된다.

분류 1: 결정론적 vs 무작위

결정론적 알고리즘 (Deterministic Algorithm)

  • 정의: 같은 입력에 대해 항상 같은 결과 생성
  • 예시: 정렬, 이진 탐색, 버블 정렬
  • 특징: 예측 가능, 재현 가능
  • 사용 시나리오: 신뢰성이 중요한 경우
 
python
# 예: 정렬 알고리즘 arr = [3, 1, 4, 1, 5] sorted(arr) # 항상 [1, 1, 3, 4, 5] 반환

무작위 알고리즘 (Randomized Algorithm)

  • 정의: 실행할 때마다 다른 결과 가능 (확률적)
  • 예시: 퀵소트(랜덤 피벗), 몬테카를로 알고리즘
  • 특징: 평균적으로 효율적, 최악의 경우 대비
  • 사용 시나리오: 빠른 성능이 중요한 경우
 
python
# 예: 랜덤 선택 import random random.choice([1, 2, 3]) # 실행마다 다른 결과

분류 2: 정확한 vs 근사

정확한 알고리즘 (Exact Algorithm)

  • 정의: 최적의 해 또는 정확한 답 보장
  • 예시: 이진 탐색, 정렬, 동적 프로그래밍
  • 특징: 시간/메모리 많이 소요, 보장된 결과
  • 사용 시나리오: 정확성이 최우선 (금융, 의료)
 
python
# 예: 이진 탐색은 정확한 위치 반환 # 또는 "찾은 경우"의 정확한 인덱스 반환

근사 알고리즘 (Approximation Algorithm)

  • 정의: 충분히 좋은 해 반환 (최적이 아닐 수 있음)
  • 예시: 탐욕 알고리즘, 신경망, 헬스틱 알고리즘
  • 특징: 빠르고 메모리 효율적, 근사 오차 존재
  • 사용 시나리오: 속도/메모리가 더 중요 (추천, 예측)
 
python
# 예: 외판원 문제의 근사 해 # 최적 경로는 찾기 어렵지만, "꽤 좋은" 경로는 빠르게 찾기 가능

📦 파이썬의 자료구조들

프로그래밍에서 자료구조는 데이터를 효율적으로 저장하고 접근하는 방식

파이썬 내장 자료구조

자료구조순서중복변경용도
리스트 (List) 순차 데이터 저장
튜플 (Tuple) 불변 데이터 저장
딕셔너리 (Dict) ✅* 키-값 쌍 저장
셋 (Set) 중복 없는 데이터

추상 자료형 (Abstract Data Types)

개발자가 구현해야 하는 논리적 구조

스택 (Stack)

 
python
# LIFO (Last In First Out) # 예: 웹 브라우저 뒤로가기 stack = [] stack.append(1) # push stack.append(2) value = stack.pop() # pop → 2 반환

큐 (Queue)

 
python
# FIFO (First In First Out) # 예: 프린터 대기열 from collections import deque queue = deque() queue.append(1) # enqueue queue.append(2) value = queue.popleft() # dequeue → 1 반환

링크드 리스트 (Linked List)

 
python
# 노드가 다음 노드를 가리킴 # 장점: 삽입/삭제 O(1) (위치만 알 때) # 단점: 탐색 O(n)

트리 (Tree)

 
python
# 계층적 구조 # 예: 파일 시스템, DOM 구조 # # root # / \ # left right

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함