<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python | 정진영의 포트폴리오</title><link>https://wjdwlsdud.github.io/tags/python/</link><atom:link href="https://wjdwlsdud.github.io/tags/python/index.xml" rel="self" type="application/rss+xml"/><description>Python</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>ko</language><lastBuildDate>Mon, 13 Oct 2025 00:00:00 +0000</lastBuildDate><image><url>https://wjdwlsdud.github.io/media/sharing.jpg</url><title>Python</title><link>https://wjdwlsdud.github.io/tags/python/</link></image><item><title>Machine Learning</title><link>https://wjdwlsdud.github.io/studying/mr/</link><pubDate>Mon, 13 Oct 2025 00:00:00 +0000</pubDate><guid>https://wjdwlsdud.github.io/studying/mr/</guid><description>&lt;h2 id="머신러닝-학습-일지-데이터로-컴퓨터를-가르치다"&gt;머신러닝 학습 일지: 데이터로 컴퓨터를 가르치다&lt;/h2&gt;
&lt;p&gt;3학년 2학기가 되면서 &lt;strong&gt;기계학습&lt;/strong&gt;이라는 교과목을 접하게 되었습니다. 매주 월, 수 16시에 공과대학 7호관 523호실에서 송현제 교수님의 수업을 듣고 있습니다. 위의 첨부되어 있는 링크에서 송현제 교수님 사이트에서 정보를 확인 하실 수 있습니다!&lt;/p&gt;
&lt;p&gt;&amp;lsquo;머신러닝&amp;rsquo;이라는 단어, 처음에는 왠지 어렵고 복잡하게만 느껴졌습니다. 하지만 막상 배워보니, 생각보다 우리 삶과 가까운, 흥미로운 기술이라는 것을 알게 되었습니다. 제가 배운 머신러닝의 기초적인 개념들을 쉬운 말로 한번 정리해 보았습니다.&lt;/p&gt;
&lt;p&gt;🧐 &lt;strong&gt;머신러닝, 그게 뭔데?&lt;/strong&gt;
제가 이해한 머신러닝은 아주 간단한 아이디어에서 시작합니다. 컴퓨터에게 &amp;lsquo;이건 사과야&amp;rsquo;, &amp;lsquo;이건 오렌지야&amp;rsquo;라고 하나하나 모든 규칙을 알려주는 대신, 수많은 데이터를 보여주고 컴퓨터가 스스로 패턴이나 규칙을 배우게 하는 기술입니다.&lt;/p&gt;
&lt;p&gt;마치 어린아이가 강아지 사진 수백 장을 보고 &amp;lsquo;아, 귀가 쫑긋하고 털이 북슬한 동물이 강아지구나!&amp;rsquo; 하고 스스로 깨닫는 것과 비슷하죠.&lt;/p&gt;
&lt;p&gt;📚 내가 배운 학습 방법 두 가지
머신러닝에는 여러 종류가 있지만, 저는 가장 대표적인 두 가지 방법에 대해 배웠습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;정답을 알려주며 가르치기: 지도 학습 (Supervised Learning)
지도 학습은 말 그대로 &amp;lsquo;정답(Label)&amp;lsquo;이 있는 데이터로 컴퓨터를 학습시키는 방법입니다. &amp;lsquo;문제&amp;rsquo;와 &amp;lsquo;정답&amp;rsquo;을 한 세트로 묶어서 계속 보여주는 거죠.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;스팸 메일 필터가 대표적인 예입니다. &amp;lsquo;이건 스팸 메일이야(정답)&amp;rsquo;, &amp;lsquo;이건 중요한 메일이야(정답)&amp;lsquo;라고 표시된 수많은 이메일(문제)을 학습시키면, 나중에는 새로운 메일이 왔을 때 스스로 스팸인지 아닌지 구분하게 됩니다.&lt;/p&gt;
&lt;p&gt;주택 가격 예측도 마찬가지입니다. &amp;lsquo;A 지역의 30평 아파트는 5억이야(정답)&amp;rsquo; 같은 수많은 집값 데이터(문제)를 학습하면, 새로운 아파트 정보를 주었을 때 가격을 예측할 수 있게 됩니다.&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;정답 없이 스스로 배우게 하기: 비지도 학습 (Unsupervised Learning)
비지도 학습은 정답이 없는, 날것의 데이터를 던져주고 &amp;ldquo;이 안에서 뭔가 의미 있는 그룹이나 구조를 찾아봐!&amp;rdquo; 하고 시키는 것과 같습니다. 컴퓨터는 데이터의 특징을 분석해서 비슷한 것들끼리 스스로 묶어줍니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;고객 관리에 유용하게 쓰일 수 있습니다. 고객들의 구매 패턴 데이터를 주고 그룹으로 묶어보게 하면, &amp;lsquo;알뜰 구매 그룹&amp;rsquo;, &amp;lsquo;신제품 선호 그룹&amp;rsquo;처럼 숨겨진 고객 그룹을 찾아낼 수 있습니다.&lt;/p&gt;
&lt;p&gt;뉴스 기사 클러스터링도 좋은 예입니다. 수많은 뉴스 기사를 던져주면, 인공지능이 스스로 &amp;lsquo;정치&amp;rsquo;, &amp;lsquo;경제&amp;rsquo;, &amp;lsquo;스포츠&amp;rsquo; 등 비슷한 주제의 기사들끼리 묶어줍니다.&lt;/p&gt;
&lt;p&gt;✨ 마치며
직접 개념을 배우고 나니, 머신러닝이 막연한 기술이 아니라 문제를 해결하기 위한 아주 논리적인 도구라는 생각이 들었습니다. 물론 아직은 정말 기초적인 부분만 알고 있지만, 데이터 속에서 의미를 찾아내는 과정이 정말 매력적이라고 느꼈습니다. 앞으로 더 깊이 공부해 보고, 간단한 프로젝트도 직접 해보고 싶다는 목표가 생겼습니다.&lt;/p&gt;</description></item><item><title>팩맨</title><link>https://wjdwlsdud.github.io/projects/pacman/</link><pubDate>Sat, 01 Mar 2025 00:00:00 +0000</pubDate><guid>https://wjdwlsdud.github.io/projects/pacman/</guid><description>&lt;p&gt;이 프로젝트는 인공지능 수업의 일환으로 진행한 UC Berkeley Pacman AI 프로젝트입니다. 이 과제의 핵심 목표는 **그래프 탐색(Graph Search)**의 기본이 되는 여러 알고리즘을 직접 구현하고, 이를 팩맨 게임 환경에 적용하여 실제 문제를 해결하는 것이었습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;search.py&lt;/strong&gt; 파일에 범용 탐색 알고리즘들을 구현하고, &lt;strong&gt;searchAgents.py&lt;/strong&gt; 파일에 팩맨의 특정 문제(Problem)들을 정의하고 해결하는 방식으로 진행했습니다.&lt;/p&gt;
&lt;h2 id="1-핵심-탐색-알고리즘-구현-searchpy"&gt;1. 핵심 탐색 알고리즘 구현 (search.py)&lt;/h2&gt;
&lt;p&gt;먼저, 어떤 문제에도 적용할 수 있는 4가지 핵심 탐색 알고리즘을 구현했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DFS (깊이 우선 탐색): &lt;strong&gt;Stack(스택)&lt;/strong&gt; 자료구조를 사용하여 가능한 한 깊은 노드를 먼저 탐색하는 알고리즘입니다.
방문한 노드를 기록(explored)하여 무한 루프를 방지하는 그래프 탐색 방식으로 구현했습니다.&lt;/li&gt;
&lt;li&gt;BFS (너비 우선 탐색): &lt;strong&gt;Queue(큐)&lt;/strong&gt; 자료구조를 사용하여 현재 노드에서 가장 가까운(얕은) 노드들을 먼저 탐색합니다.
이 방식은 경로의 비용이 모두 같을 때 최단 경로를 보장합니다.&lt;/li&gt;
&lt;li&gt;UCS (균일 비용 탐색): &lt;strong&gt;PriorityQueue(우선순위 큐)&lt;/strong&gt;를 사용합니다. 각 경로의 &amp;lsquo;누적 비용(cost)&amp;lsquo;을 우선순위로 하여, 항상 비용이 가장 적게 든 경로를 먼저 탐색합니다. 이를 통해 최단 비용의 경로를 보장합니다.&lt;/li&gt;
&lt;li&gt;A* (A-star) 탐색: UCS와 마찬가지로 &lt;strong&gt;PriorityQueue&lt;/strong&gt;를 사용하지만, 우선순위를 &amp;lsquo;현재까지의 누적 비용($g(n)$)&amp;lsquo;과 &amp;lsquo;목표까지의 추정 비용(휴리스틱, $h(n)$)&amp;lsquo;의 합 ($f(n) = g(n) + h(n)$)으로 설정합니다. 정보에 기반한(informed) 탐색으로, UCS보다 훨씬 효율적으로 최적의 해를 찾아냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-팩맨-문제-정의-및-해결-searchagentspy"&gt;2. 팩맨 문제 정의 및 해결 (searchAgents.py)&lt;/h2&gt;
&lt;p&gt;단순히 알고리즘을 구현하는 것을 넘어, 팩맨이 직면한 복잡한 문제들을 &amp;lsquo;탐색 문제&amp;rsquo;로 모델링하고 해결했습니다.&lt;/p&gt;
&lt;p&gt;📍 4개의 코너 방문 문제 (CornersProblem)팩맨이 맵의 네 귀퉁이에 있는 모든 점을 방문하는 경로를 찾는 문제입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;상태(State) 정의: 이 문제를 풀기 위해 상태 공간을 단순한 (x, y) 좌표가 아닌, (현재 위치, (방문한 코너 튜플))로 정의했습니다. 예를 들어, ((5, 5), (True, False, False, True))와 같이 현재 위치와 4개 코너의 방문 여부를 함께 기록했습니다.&lt;/li&gt;
&lt;li&gt;목표(Goal) 정의: state[1]에 해당하는 튜플의 모든 값이 True가 되는 순간을 목표 상태로 설정했습니다.
후계자(Successor) 함수: 팩맨이 이동할 때마다, 새로 도착한 위치가 4개의 코너 중 하나인지 확인하고, 만약 코너라면 튜플의 해당 값을 &lt;strong&gt;True&lt;/strong&gt;로 갱신한 새로운 상태를 생성하도록 구현했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;💡 코너 문제 휴리스틱 (cornersHeuristic)&lt;/p&gt;
&lt;p&gt;위의 코너 문제를 A* 탐색으로 풀기 위한 휴리스틱 함수를 직접 설계했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;설계: 휴리스틱은 항상 실제 비용보다 낮거나 같아야 합니다(Admissible).&lt;/li&gt;
&lt;li&gt;로직: &amp;lsquo;현재 위치&amp;rsquo;에서 &amp;lsquo;아직 방문하지 않은 모든 코너&amp;rsquo;까지의 맨해튼 거리(Manhattan Distance)를 각각 계산한 뒤, 그중 가장 큰(max) 값을 반환하도록 했습니다.&lt;/li&gt;
&lt;li&gt;이유: 팩맨은 적어도 남아있는 코너 중 가장 먼 곳까지는 가야 모든 코너를 방문할 수 있으므로, 이 값은 항상 실제 남은 비용의 하한선이 되어 A*의 허용 가능한(admissible) 휴리스틱 조건을 만족합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🍔 모든 음식 찾기 휴리스틱 (foodHeuristic)&lt;/p&gt;
&lt;p&gt;맵에 흩어져 있는 모든 음식을 먹는 경로를 찾는 &lt;strong&gt;FoodSearchProblem&lt;/strong&gt;을 위한 휴리스틱입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;로직: 코너 휴리스틱과 유사하게, &amp;lsquo;현재 위치&amp;rsquo;에서 &amp;lsquo;아직 먹지 않은 모든 음식&amp;rsquo;까지의 실제 미로 거리(&lt;strong&gt;mazeDistance&lt;/strong&gt;)를 계산하고, 그중 가장 큰(max) 값을 반환했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mazeDistance&lt;/strong&gt; 활용: 맨해튼 거리와 달리, &lt;strong&gt;mazeDistance&lt;/strong&gt;는 BFS를 기반으로 벽을 모두 고려한 실제 최단 거리를 반환해 주어 더 정확한 추정치를 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🎯 가장 가까운 음식 찾기 (ClosestDotSearchAgent)&lt;/p&gt;
&lt;p&gt;모든 음식을 한 번에 찾는 것은 매우 복잡(NP-hard)하므로, &amp;lsquo;가장 가까운 음식을 찾아 먹는&amp;rsquo; 과정을 반복하는 탐욕(Greedy) 알고리즘을 구현했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;findPathToClosestDot&lt;/strong&gt; 구현: &lt;strong&gt;AnyFoodSearchProblem&lt;/strong&gt;(어떤 음식이든 하나만 먹으면 성공)이라는 하위 문제를 정의했습니다.&lt;/li&gt;
&lt;li&gt;UCS 활용: 이 문제에 &lt;strong&gt;UCS&lt;/strong&gt;를 적용하여, 현재 위치에서 가장 비용(거리)이 적게 드는 음식의 위치와 경로를 찾아 반환하도록 했습니다. (비용이 1로 동일하므로 &lt;strong&gt;BFS&lt;/strong&gt;도 동일한 결과를 보장합니다.)&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>