<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>도라에몽주머니</title>
    <link>https://geniemon0104.tistory.com/</link>
    <description>혼자 천천히 공부해보며 정리하는 블로그입니다.
잘못된 내용이나 오류 지적은 언제나 환영입니다! ヾ(&amp;bull;&amp;omega;&amp;bull;`)o</description>
    <language>ko</language>
    <pubDate>Sat, 27 Jun 2026 17:13:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>에몽쓰</managingEditor>
    <image>
      <title>도라에몽주머니</title>
      <url>https://tistory1.daumcdn.net/tistory/4083367/attach/6bfd3505f081444c84bbab431b8d6193</url>
      <link>https://geniemon0104.tistory.com</link>
    </image>
    <item>
      <title>[ML/AI] ONNX 모델이란?</title>
      <link>https://geniemon0104.tistory.com/131</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새로 들어가게 된 안건에서 ONNX 모델을 사용하게 되어서 정리하는 글.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwiiHW/dJMcadgc26s/Y3HFRJAdNsw3Hmy99mAwI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwiiHW/dJMcadgc26s/Y3HFRJAdNsw3Hmy99mAwI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwiiHW/dJMcadgc26s/Y3HFRJAdNsw3Hmy99mAwI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwiiHW%2FdJMcadgc26s%2FY3HFRJAdNsw3Hmy99mAwI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;549&quot; height=&quot;141&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ONNX 란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ONNX(Open Neural Network Exchange) 란 서로 다른 딥러닝 환경에서 개발된 모델을 서로 호환 가능하도록 하는 표준 모델 포맷이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예를 들어, Tensorflow에서 만든 모델을 ONNX 그래프로 export 하면 PyTorch 와 같은 다른 프레임워크에서도 해당 모델을 import 해서 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;1149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pZBN5/dJMcad1z0h9/iUecMcukaZUV5DPbKCKJtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pZBN5/dJMcad1z0h9/iUecMcukaZUV5DPbKCKJtk/img.png&quot; data-alt=&quot;출처: https://aurigait.com/blog/onnx-onnx-runtime-and-tensortrt/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pZBN5/dJMcad1z0h9/iUecMcukaZUV5DPbKCKJtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpZBN5%2FdJMcad1z0h9%2FiUecMcukaZUV5DPbKCKJtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;1149&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;1149&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://aurigait.com/blog/onnx-onnx-runtime-and-tensortrt/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장점&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ONNX는 아래와 같은 장점이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Framework interoperability: 프레임워크 상호 운용성&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ONNX를 이용하면, 하나의 프레임워크(ex. PyTorch) 에서 모델을 학습시키고 다른 프레임워크(ex. TensorFlow) 로 내보내서 추론에 사용할 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재는 PyTorch, Caffe2, Microsoft Cognitive Toolkit, Apache MXNet, Chainer 등의 프레임워크를 지원하며, Core ML, TensorFlow, Qualcomm SNPE, Nvidia의 TensorRT, Intel의 nGraph도 추가로 지원될 예정이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;2&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Hardware optimizations: 하드웨어 최적화&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성능을 최대화하기 위해 ONNX 호환 런타임 및 라이브러리를 제공하므로, 하드웨어 최적화가 가능하다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재는 Qualcomm SNPE, AMD, ARM, Intel 및 기타 하드웨어 파트너를 지원한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ONNX Runtime&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ONNX가 지원하는 프레임워크이다. 다양한 프레임워크, 운영 체제와 하드웨어 플랫폼을 지원하며, 머신러닝 속도를 향상시키도록 설계되어 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;613&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WzW79/dJMcahCXjWB/kiF9Q64OVcjLAZgzHpdhA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WzW79/dJMcahCXjWB/kiF9Q64OVcjLAZgzHpdhA0/img.png&quot; data-alt=&quot;출처: https://aurigait.com/blog/onnx-onnx-runtime-and-tensortrt/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WzW79/dJMcahCXjWB/kiF9Q64OVcjLAZgzHpdhA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWzW79%2FdJMcahCXjWB%2FkiF9Q64OVcjLAZgzHpdhA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1302&quot; height=&quot;613&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;613&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://aurigait.com/blog/onnx-onnx-runtime-and-tensortrt/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;동작 흐름&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PyTorch, TensorFlow, Keras 등의 모델을 ONNX로 변환해서 ONNX 모델을 생성한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용하고자 하는 환경에서 생성한 모델(ex. &lt;code&gt;example.onnx&lt;/code&gt;) 을 로드하고 실행한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하드웨어 가속기 등을 이용해서 성능을 조정한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입력값을 전달하고 결과값을 반환받는다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실행&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Installation&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1765778848004&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;!pip install onnxruntime&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Session&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1765780996695&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import onnxruntime as ort

# 추론 세션 생성
session_tf = ort.InferenceSession(&quot;model_path.onnx&quot;)

# 추론 세션 실행
input_images = session_tf.get_inputs()[0].name
output_name = session_tf.get_outputs()[0].name
results_ort = session_tf.run([output_name], {input_name: X.astype(np.float32)})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Netron 이란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Netron은 아래 이미지와 같이 딥러닝 모델 아키텍쳐를 시각화해주는 툴이다. ONNX, TorchScript, TensorFlow Lite, TensorFlow, Keras, Core ML, Darknet 과 같은 모델들을 지원한다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;819&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DLqE9/dJMcaa4T8Rv/uc2DesnKoBmopkhtZNYSD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DLqE9/dJMcaa4T8Rv/uc2DesnKoBmopkhtZNYSD1/img.png&quot; data-alt=&quot;출처: https://github.com/lutzroeder/netron&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DLqE9/dJMcaa4T8Rv/uc2DesnKoBmopkhtZNYSD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDLqE9%2FdJMcaa4T8Rv%2Fuc2DesnKoBmopkhtZNYSD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;819&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;819&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://github.com/lutzroeder/netron&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Netron은 다운로드해서 로컬에서 실행할 수도 있지만, 아래의 브라우저에 모델을 드래그 앤 드롭하면 아주 간단하게 모델 아키텍쳐를 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://netron.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://netron.app/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1765781266410&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Netron&quot; data-og-description=&quot;&quot; data-og-host=&quot;netron.app&quot; data-og-source-url=&quot;https://netron.app/&quot; data-og-url=&quot;https://netron.app/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://netron.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://netron.app/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Netron&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;netron.app&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;References&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://medium.com/@enerzai/onnx-%EB%84%88-%EB%88%84%EA%B5%AC%EC%95%BC-who-are-you-5c1435b997e2&quot;&gt;https://medium.com/@enerzai/onnx-%EB%84%88-%EB%88%84%EA%B5%AC%EC%95%BC-who-are-you-5c1435b997e2&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://ai.meta.com/tools/onnx/&quot;&gt;https://ai.meta.com/tools/onnx/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://aurigait.com/blog/onnx-onnx-runtime-and-tensortrt/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://aurigait.com/blog/onnx-onnx-runtime-and-tensortrt/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Study/ML</category>
      <category>netron</category>
      <category>onnx</category>
      <category>onnxruntime</category>
      <author>에몽쓰</author>
      <guid isPermaLink="true">https://geniemon0104.tistory.com/131</guid>
      <comments>https://geniemon0104.tistory.com/131#entry131comment</comments>
      <pubDate>Mon, 15 Dec 2025 18:49:55 +0900</pubDate>
    </item>
    <item>
      <title>2025 #2 E자격 취득 회고록</title>
      <link>https://geniemon0104.tistory.com/130</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입사 1년차에 일본 딥러닝 협회에서 주관하는 G검정에 응시해서 합격했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 다음 단계로 같은 협회에서 주최하는 E자격에 응시했고, 다행히도(?) 합격했기 때문에 이에 대한 회고록을 작성해보려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;304&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tu3kt/btsQ8qNTzBD/9ugpth8RpbqNGbF4bKw010/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tu3kt/btsQ8qNTzBD/9ugpth8RpbqNGbF4bKw010/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tu3kt/btsQ8qNTzBD/9ugpth8RpbqNGbF4bKw010/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftu3kt%2FbtsQ8qNTzBD%2F9ugpth8RpbqNGbF4bKw010%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;304&quot; height=&quot;185&quot; data-origin-width=&quot;304&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개요&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://www.jdla.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.jdla.org/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1760518178050&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;一般社団法人日本ディープラーニング協会【公式】&quot; data-og-description=&quot;本協会（JDLA）は、ディープラーニングを中心とする技術による日本の産業競争力の向上を目指します。&quot; data-og-host=&quot;www.jdla.org&quot; data-og-source-url=&quot;https://www.jdla.org/&quot; data-og-url=&quot;https://www.jdla.org/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/swqLl/hyZLwRZgPT/4dIP7vmgfqxQ5HLJ69Ne4K/img.png?width=2801&amp;amp;height=1706&amp;amp;face=0_0_2801_1706&quot;&gt;&lt;a href=&quot;https://www.jdla.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.jdla.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/swqLl/hyZLwRZgPT/4dIP7vmgfqxQ5HLJ69Ne4K/img.png?width=2801&amp;amp;height=1706&amp;amp;face=0_0_2801_1706');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;一般社団法人日本ディープラーニング協会【公式】&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;本協会（JDLA）は、ディープラーニングを中心とする技術による日本の産業競争力の向上を目指します。&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.jdla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;E자격을 한국어로 검색했을 때 검색 결과가 잘 나오지 않았기 때문에, 간단히 개요를 작성해 보려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;E자격은 일반 사단 법인인 일본 딥러닝 협회에서 주관하는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; 딥러닝 자격증이다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일반적인 다른 자격증들과는 다르게 JDLA에서 지정한 업체의 인증 프로그램을 수강해야지만 E자격에 응시할 수 있는 자격이 주어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 인증 프로그램과 응시료가 조금 비싼 편이어서 일본 내에서도 사내 보조금이 나오지 않는 이상 잘 응시하지 않는 듯 하다...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 시험이 연 2회밖에 개최되지 않아서, 한번 떨어지면 내년에 봐야한다,, ㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내용&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;출제 범위(실라버스) 는 매 시험마다 갱신되지만, 대략적인 분야는 크게 바뀌지 않는다. 보통 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;응용 수학, 기계 학습(머신러닝), 심층 학습(딥러닝), 개발 환경&lt;/b&gt; 의 4가지 분야의 내용이 출제된다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자연어 처리, 이미지 처리, 강화 학습 등 폭넓은 범위에서 출제되며, 직접 코딩을 할 필요는 없지만 파이썬으로 작성된 코드를 이해할 줄 알아야 풀 수 있는 문제들도 있기에 해당 언어에 익숙한 사람들이 많이 응시하는 듯 하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;머신러닝이나 딥러닝에 관한 기본 내용 위주로 출제되었던 G검정과는 다르게, E자격에서는 실제 모델의 동작 원리나 수학적인 부분까지도 공부가 필요했다. 강의를 들으면서 공부할 때, &quot;이정도면 그냥 논문을 읽는게 낫겠는데?&quot; 라는 생각이 들 정도로 G검정에 비해서는 깊이있는 내용을 다룬다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;s&gt;생각보다 시간이 없어서 논문을 읽지는 못했지만...&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;1268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SRYHO/btsRb8ZFT6m/1ZefPKJ1Qw1PekTjj7pwck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SRYHO/btsRb8ZFT6m/1ZefPKJ1Qw1PekTjj7pwck/img.png&quot; data-alt=&quot;2025 #2 실라버스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SRYHO/btsRb8ZFT6m/1ZefPKJ1Qw1PekTjj7pwck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSRYHO%2FbtsRb8ZFT6m%2F1ZefPKJ1Qw1PekTjj7pwck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;557&quot; height=&quot;581&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;1268&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2025 #2 실라버스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인증 프로그램&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://www.jdla.org/certificate/engineer/programs/bizlist/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.jdla.org/certificate/engineer/programs/bizlist/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1760425182649&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;E資格認定プログラム事業者一覧&quot; data-og-description=&quot;JDLAでは、ディープラーニングの理論を理解し、適切な手法を選択して実装する能力を持つ人材を育成する講座を、JDLA認定プログラムとして認定推奨しています。いずれかの認定プログラム&quot; data-og-host=&quot;www.jdla.org&quot; data-og-source-url=&quot;https://www.jdla.org/certificate/engineer/programs/bizlist/&quot; data-og-url=&quot;https://www.jdla.org/certificate/engineer/programs/bizlist/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.jdla.org/certificate/engineer/programs/bizlist/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.jdla.org/certificate/engineer/programs/bizlist/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;E資格認定プログラム事業者一覧&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JDLAでは、ディープラーニングの理論を理解し、適切な手法を選択して実装する能力を持つ人材を育成する講座を、JDLA認定プログラムとして認定推奨しています。いずれかの認定プログラム&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.jdla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인증 프로그램 종류가 진짜 너무 많아서 고르기 어려웠는데, 일본어로 이것저것 검색해보니&amp;nbsp;&lt;b&gt;AVILEN &lt;/b&gt;의 강좌가 가격 대비 합리적인 듯 해서 AVILEN사의 강좌를 수강했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내가 강좌를 고른 기준은 &lt;u&gt;1. 별도 공부를 하지 않더라도 강좌를 통해 E자격 시험 대비가 가능할 것&lt;/u&gt; , &lt;u&gt;2. 강좌 내용이 충실할 것&lt;/u&gt; , &lt;u&gt;3. 조금 어려워도 좋으니 E자격정도 혹은 그 이상의 난이도로 인증 시험을 제공할 것&lt;/u&gt; 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리뷰는 그리 많지 않았지만 AVILEN 수강자들은 대부분 합격했고, 대부분 E자격과 비슷하거나 좀 더 어려운 수준으로 예문이 제공되었다고 해서 여기로 선택했다. &lt;s&gt;(그리고 광고글이 거의 없었다는,,ㅎㅎ)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공부 기간&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;강좌 수강 기간을 포함해서 공부 기간은 &lt;b&gt;약 8개월&lt;/b&gt; 이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대략 반년 정도의 시간인데 이 기간 전부 열심히 했냐고 한다면 그건 아니었다..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2025년 1월 ~ 2025년 8월 까지 공부했는데, 5월쯤에는 골든위크여서 한국에 돌아가기도 했고, 주말에 쉬고싶어서 공부를 안하기도 했으니 본격적인&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(?)&lt;/span&gt; 공부를 한건 약 2개월 정도라고 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;근데도 합격할 수 있었던 건, 대학시절 배웠던 기본 지식이 조금 있었고 업무 시간을 일부 활용해서 공부할 수 있었기 때문이지 않을까.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시험 후기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;G검정의 경우, 자택에서 본인 PC로 응시할 수 있어서 참 편했는데 E자격은 CBT센터에 직접 방문해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;피어슨에서 주관하는거라 다른 시험을 응시하는 사람들이랑 같이 봤는데, 정말... 불편한게 많았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선, 예약한 시험 시간보다 일찍 도착하면 일찍 도착하는대로 시험이 시작된다. 이럴거면 왜 예약을 받는지 모르겠지만 도착하는 시간대로 짐을 맡기고 시험장에 입실한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고, 다른 사람이 시험중이어도 도중에 문을 열고 시험장에 들여보낸다. 소음은 어쩌지 하고 입실할 때 엄청 눈치를 봤는데 불행 중 다행인건지, 차음이 되는 헤드셋을 준다 &lt;s&gt;(와아... ㅎㅎㅎ)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주변 확인하고 시험 시작을 누르면 시험이 시작되는데 시험 내용도 참 할말이 많다...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일단 범위에서 빠진 부분을 묻는 문제가 나왔다. 실라버스에는 적혀있지만 회색으로 표시되어있고 비고란에 &quot;대상 외&quot; 라고 적혀있었는데 왜 출제된지 모르겠다. 그리고 대상 외의 문제가 중복 문제로 2개 나왔다. 정말 모 아니면 도라는 심정으로 걍 찍었다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;수학 문제도 출제되어서 문제를 풀 수 있는 코팅지(aka. 이면지) 를 줬는데 펜이 네임펜이다. 코팅지 하나 다쓰면 사람 불러서 교체해야되고 네임펜도 다 말라있었다;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;수학 문제의 비율이 적어서 망정이지 아니었으면 정말 화가 났을 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과 발표도 참 답답했는데, CBT 시험임에도 불구하고 결과 발표까지 3주나 걸린다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;상식적으로 CBT로 제출된 답안을 다시 출력해서 사람이 하나하나 확인하는게 아니고서 3주씩이나 걸리는게 말이 되나 싶었지만,, G검정 결과도 마찬가지로 3주정도 걸렸기 때문에 이건 주관사의 특징(?) 인 것 같다...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞으로&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;E자격은 일본에서만 인정이 되는 자격이기 때문에, 국제 기준에 통용되는 자격을 취득해두고 싶다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;업무에서 AWS를 쓸 일이 있었는데 꽤 재미를 느껴서, 부서에서 메인으로 사용하는 Azure 관련 자격을 취득해 볼까 생각중이다!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;1075&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eizaz6/btsRcd7HY5g/u44y5YuDwXQXffCMy20561/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eizaz6/btsRcd7HY5g/u44y5YuDwXQXffCMy20561/img.png&quot; data-alt=&quot;합격증서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eizaz6/btsRcd7HY5g/u44y5YuDwXQXffCMy20561/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feizaz6%2FbtsRcd7HY5g%2Fu44y5YuDwXQXffCMy20561%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;326&quot; height=&quot;429&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;1075&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;합격증서&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Certificate/E資格</category>
      <category>E자격</category>
      <category>JDLA</category>
      <author>에몽쓰</author>
      <guid isPermaLink="true">https://geniemon0104.tistory.com/130</guid>
      <comments>https://geniemon0104.tistory.com/130#entry130comment</comments>
      <pubDate>Wed, 15 Oct 2025 18:30:12 +0900</pubDate>
    </item>
    <item>
      <title>[Python] logging 모듈을 사용해 실행 로그 파일 남기기</title>
      <link>https://geniemon0104.tistory.com/129</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;안건에서 로그 내역을 남겨 에러 메세지를 관리할 필요가 있어, logging 모듈의 사용법이나 작성 방법 등을 정리해보려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://docs.python.org/ko/3.13/howto/logging.html&quot;&gt;https://docs.python.org/ko/3.13/howto/logging.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739176656770&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Logging HOWTO&quot; data-og-description=&quot;Author, Vinay Sajip &amp;lt;vinay_sajip at red-dove dot com&amp;gt;,. This page contains tutorial information. For links to reference information and a logging cookbook, please see Other resources. Basic Logging...&quot; data-og-host=&quot;docs.python.org&quot; data-og-source-url=&quot;https://docs.python.org/ko/3.13/howto/logging.html&quot; data-og-url=&quot;https://docs.python.org/3/howto/logging.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bXxwep/hyYf2KKogr/Za8WjzTbbHu2jyrjYUbmY0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://docs.python.org/ko/3.13/howto/logging.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.python.org/ko/3.13/howto/logging.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bXxwep/hyYf2KKogr/Za8WjzTbbHu2jyrjYUbmY0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Logging HOWTO&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Author, Vinay Sajip &amp;lt;vinay_sajip at red-dove dot com&amp;gt;,. This page contains tutorial information. For links to reference information and a logging cookbook, please see Other resources. Basic Logging...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.python.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로그(Log)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;로그&lt;/b&gt;(Log) 란 &lt;b&gt;컴퓨터 시스템, 애플리케이션, 네트워크 등에서 발생하는 모든 일에 대한 기록&lt;/b&gt;을 말한다. 로그는 보통 시스템에서 문제가 발생했을 때나 사고가 생겼을 때, 어디에서 언제 문제가 발생했는지 파악할 수 있도록 하기 위해 작성된다. 뿐만 아니라, 로직이 의도한 대로 흐르고 있는지 등을 확인할 때에도 로그가 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로깅(Logging)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로깅은 쉽게 말하면 로그를 작성하는 것이다. 단순히 오류 메세지나 값을 확인하기 위해 &lt;code&gt;print()&lt;/code&gt;를 사용해 콘솔에서 내용을 확인해 볼 수도 있지만, 해당 내용이 warning인지, 에러인지, 확인을 위한 값을 출력한 것인지를 알기는 어렵기 때문에 logging 모듈을 사용해서 알기 쉽게 정리할 필요가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;getLogger&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;getLogger는 로거에 접근할 때 사용하는 메소드이다. 여러 개의 로거를 만들고 싶은 경우에 주로 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아래의 코드와 같이 각각의 로거를 정의할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import logging

logger1 = logging.getLogger('logger1')
logger2 = logging.getLogger('logger2')&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Log Level&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Log level은 로그의 심각한 정도를 나타낸다. 기본적으로 파이썬에서 제공하는 로그의 기준 레벨은 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;수준 (Level)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;설명&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DEBUG&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(문제 해결에 필요한) 상세한 정보&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;INFO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예상대로 동작하는지에 대한 확인&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;WARNING&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예상치 못한 일이 발생했거나 앞으로 발생할 가능성이 있는 문제에 대한 표시 (소프트웨어는 제대로 동작하지만 경고 표시)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ERROR&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;WARNING보다 심각한 문제로 인해 소프트웨어가 일부 기능을 동작하지 못하고 중지&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CRITICAL&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;심각한 에러로 인해 프로그램이 작동하지 못하고 중지&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본값은 &lt;code&gt;WARNING&lt;/code&gt;으로 설정되어 있어서 로그 수준을 명시하지 않으면 WARNING, ERROR, CRITICAL에 해당하는 내용들이 로그로 기재된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;basicConfig&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로그의 기본 설정을 하는 함수이다. 이 함수를 통해 로그를 기록할 파일을 설정하거나, 최소 레벨을 설정하거나, 출력 형식을 정의하는 등 기본 설정을 정의할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739177289910&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;logging.basicConfig(
    filename=&quot;log_file.log&quot; # 로그를 기록할 파일 경로
    encoding='utf-8' # 인코딩 설정
    level=logging.ERROR # 로그 레벨을 설정(여기에서는 ERROR)
    format=&quot;[ %(asctime)s | %(levelname)s ] %(message)s&quot;, # 로그에 날짜, 레벨, 메시지를 포함
    datefmt=&quot;%Y-%m-%d %H:%M:%S&quot; # 날짜 형식을 'YYYY-MM-DD HH:MM:SS'로 설정
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로그 파일 예제&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 로그 파일을 작성하는 코드를 써보자. 예시 코드는 함수 형태로 작성해볼 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 로깅을 설정하는 함수인 setup_logger부터 작성해보자.&amp;nbsp;이번에는&lt;b&gt; [ 2025-03-11 00:00:00&amp;nbsp; | DEBUG] 에러 메세지&lt;/b&gt; 의 형태로 로그를 기록한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739177983275&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import logging

def setup_logger(log_file: str, log_level=logging.DEBUG):
    &quot;&quot;&quot;
    로깅을 설정하는 함수
    
    Args:
    	log_file: 로그 파일 경로
        log_level: 로깅 레벨 (기본값 : DEBUG)
    &quot;&quot;&quot;
    logging.basicConfig(
        filename=log_file,            # 로그를 기록할 파일 경로
        level=log_level,              # 로그 레벨
        format=&quot;[ %(asctime)s | %(levelname)s ] %(message)s&quot;,  # 로그 포맷
        datefmt=&quot;%Y-%m-%d %H:%M:%S&quot;   # 날짜 표기 포맷
        filemode='a'                  # 로그 파일에 추가 모드로 기록 (기본값: 'a' 추가 모드)
    )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 로깅 함수를 설정했으니 실제로 사용해보자.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741682400552&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;def main():
    # 'example.log'라는 파일에 DEBUG 레벨로 로그 기록
    setup_logger('example.log', logging.DEBUG)
    
    # 다양한 레벨의 로그 메시지 기록
    logging.debug(&quot;디버그 메시지&quot;)           # [ 2025-03-11 00:00:00 | DEBUG ] 디버그 메시지 
    logging.info(&quot;정보 메시지&quot;)              # [ 2025-03-11 00:00:00 | INFO ] 정보 메시지
    logging.warning(&quot;경고 메시지&quot;)           # [ 2025-03-11 00:00:00 | WARNING ] 경고 메시지
    logging.error(&quot;오류 메시지&quot;)             # [ 2025-03-11 00:00:00 | ERROR ] 오류 메시지
    logging.critical(&quot;치명적 오류 메시지&quot;)   # [ 2025-03-11 00:00:00 | CRITICAL ] 치명적 오류 메시지
    
    # 추가적인 로깅 예시
    logging.info(&quot;로그 작성이 완료되었습니다.&quot;)  # [ 2025-03-11 14:30:04 | INFO ] 로그 작성이 완료되었습니다.

if __name__ == &quot;__main__&quot;:
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 방식으로 오류를 지속적으로 기록하고 추적해야 하는 프로젝트에 로깅을 활용할 수 있다. 다음 안건이나 프로젝트에서도 다시 활용해 볼 수 있었으면 좋겠다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Study/Python</category>
      <category>logging</category>
      <category>로깅</category>
      <category>파이썬</category>
      <author>에몽쓰</author>
      <guid isPermaLink="true">https://geniemon0104.tistory.com/129</guid>
      <comments>https://geniemon0104.tistory.com/129#entry129comment</comments>
      <pubDate>Tue, 11 Mar 2025 17:54:06 +0900</pubDate>
    </item>
    <item>
      <title>[환경구축] 윈도우 환경에서 pyenv와 poetry로 파이썬 환경 구축하기</title>
      <link>https://geniemon0104.tistory.com/128</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번에 노트북을 새로 구입해서 파이썬 환경을 새로 구축했다.&amp;nbsp;회사에서 pyenv + poetry 조합으로 파이썬 환경을 사용하고 있어서 개인 PC에도 동일하게 설정했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;pyenv&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;pyenv 란?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;pyenv는 다양한 버전의 파이썬을 관리하는 도구이다. 회사에서는 안건마다 파이썬 버전을 다르게 사용하기 때문에 pyenv로 파이썬 버전을 관리하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwcqKR/btsLFDwWRjH/E22jC2K6UQMkYew40e1FqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwcqKR/btsLFDwWRjH/E22jC2K6UQMkYew40e1FqK/img.png&quot; data-alt=&quot;https://github.com/pyenv/pyenv&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwcqKR/btsLFDwWRjH/E22jC2K6UQMkYew40e1FqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwcqKR%2FbtsLFDwWRjH%2FE22jC2K6UQMkYew40e1FqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;600&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://github.com/pyenv/pyenv&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;pyenv 환경 구축&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;pyenv 환경을 구축하기 위해서는 우선 로컬에 시스템 파이썬을 설치해야한다. 아래 공식 웹사이트에서 설치하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://www.python.org/downloads/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.python.org/downloads/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736079683705&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download Python&quot; data-og-description=&quot;The official home of the Python Programming Language&quot; data-og-host=&quot;www.python.org&quot; data-og-source-url=&quot;https://www.python.org/downloads/&quot; data-og-url=&quot;https://www.python.org/downloads/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cevjNb/hyXWuIFqxf/ZKVRCdNBcLrKiqsxIAZSTK/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://www.python.org/downloads/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.python.org/downloads/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cevjNb/hyXWuIFqxf/ZKVRCdNBcLrKiqsxIAZSTK/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download Python&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The official home of the Python Programming Language&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.python.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아래는 pyenv 도큐먼트인데 공식적으로는 윈도우를 지원하지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://github.com/pyenv/pyenv&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/pyenv/pyenv&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736079946686&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - pyenv/pyenv: Simple Python version management&quot; data-og-description=&quot;Simple Python version management. Contribute to pyenv/pyenv development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/pyenv/pyenv&quot; data-og-url=&quot;https://github.com/pyenv/pyenv&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/exdR0O/hyXWyElNJ4/hnSV8kwY0qNepmlnySy3Z0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bI1nlp/hyXWyYFRxZ/w50nuY5H4PQ4XCprgbcuH0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/pyenv/pyenv&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/pyenv/pyenv&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/exdR0O/hyXWyElNJ4/hnSV8kwY0qNepmlnySy3Z0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bI1nlp/hyXWyYFRxZ/w50nuY5H4PQ4XCprgbcuH0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - pyenv/pyenv: Simple Python version management&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Simple Python version management. Contribute to pyenv/pyenv development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 그래서 wsl 등을 사용해 리눅스 상에 구축하기도 하는데, 윈도우 환경에서 사용하고 싶다면 아래 링크를 통해 설치하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://github.com/pyenv-win/pyenv-win&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/pyenv-win/pyenv-win&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736080370197&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - pyenv-win/pyenv-win: pyenv for Windows. pyenv is a simple python version management tool. It lets you easily switch bet&quot; data-og-description=&quot;pyenv for Windows. pyenv is a simple python version management tool. It lets you easily switch between multiple versions of Python. It's simple, unobtrusive, and follows the UNIX tradition of s...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/pyenv-win/pyenv-win&quot; data-og-url=&quot;https://github.com/pyenv-win/pyenv-win&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bktdOC/hyXWsxmCwU/xu3qkKrGZIEZldx7MSpsh0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/XSfjU/hyXWB184Wv/v1liqQfHDxzqeVKWu4nJW1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/pyenv-win/pyenv-win&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/pyenv-win/pyenv-win&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bktdOC/hyXWsxmCwU/xu3qkKrGZIEZldx7MSpsh0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/XSfjU/hyXWB184Wv/v1liqQfHDxzqeVKWu4nJW1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - pyenv-win/pyenv-win: pyenv for Windows. pyenv is a simple python version management tool. It lets you easily switch bet&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;pyenv for Windows. pyenv is a simple python version management tool. It lets you easily switch between multiple versions of Python. It's simple, unobtrusive, and follows the UNIX tradition of s...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;윈도우에 pyenv를 설치하기 위해, PowerShell을 열고 아래 명령어를 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736080475513&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install pyenv-win --target $HOME\.pyenv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;환경변수 추가를 위해 아래 4개의 명령어를 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736080527864&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[System.Environment]::SetEnvironmentVariable('PYENV',$env:USERPROFILE + &quot;\.pyenv\pyenv-win\&quot;,&quot;User&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736080542990&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[System.Environment]::SetEnvironmentVariable('PYENV_ROOT',$env:USERPROFILE + &quot;\.pyenv\pyenv-win\&quot;,&quot;User&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736080556513&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[System.Environment]::SetEnvironmentVariable('PYENV_HOME',$env:USERPROFILE + &quot;\.pyenv\pyenv-win\&quot;,&quot;User&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736080582862&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[System.Environment]::SetEnvironmentVariable('path', $env:USERPROFILE + &quot;\.pyenv\pyenv-win\bin;&quot; + $env:USERPROFILE + &quot;\.pyenv\pyenv-win\shims;&quot; + [System.Environment]::GetEnvironmentVariable('path', &quot;User&quot;),&quot;User&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 명령을 모두 작성한 후, cmd에서 잘 설치되었는지 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736080646845&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pyenv --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0H8Li/btsLDfktM5i/BVug6isjqfoFM8npaIvpD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0H8Li/btsLDfktM5i/BVug6isjqfoFM8npaIvpD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0H8Li/btsLDfktM5i/BVug6isjqfoFM8npaIvpD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0H8Li%2FbtsLDfktM5i%2FBVug6isjqfoFM8npaIvpD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;66&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나는 pyenv 설치 가능한 버전을 확인하고 3.11.0b4 버전으로 설치했다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736080940169&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pyenv install --list  # 사용 가능한 파이썬 버전 확인
pyenv install 3.11.0b4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;poetry&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;poetry는 파이썬 패키지의 의존성을 관리하는 툴이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;poetry 환경 구축&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://python-poetry.org/docs/#installing-with-the-official-installer&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://python-poetry.org/docs/#installing-with-the-official-installer&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736081155008&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Introduction | Documentation | Poetry - Python dependency management and packaging made easy&quot; data-og-description=&quot;If you installed using the deprecated get-poetry.py script, you should remove the path it uses manually, e.g. rm -rf &amp;quot;${POETRY_HOME:-~/.poetry}&amp;quot; Also remove ~/.poetry/bin from your $PATH in your shell configuration, if it is present.&quot; data-og-host=&quot;python-poetry.org&quot; data-og-source-url=&quot;https://python-poetry.org/docs/#installing-with-the-official-installer&quot; data-og-url=&quot;https://python-poetry.org/docs/#installing-with-the-official-installer&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://python-poetry.org/docs/#installing-with-the-official-installer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://python-poetry.org/docs/#installing-with-the-official-installer&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Introduction | Documentation | Poetry - Python dependency management and packaging made easy&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;If you installed using the deprecated get-poetry.py script, you should remove the path it uses manually, e.g. rm -rf &quot;${POETRY_HOME:-~/.poetry}&quot; Also remove ~/.poetry/bin from your $PATH in your shell configuration, if it is present.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;python-poetry.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 poetry 설치 메뉴얼 페이지에서 명령어를 확인 후 PowerShell에 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736081170245&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;설치가 완료되었다면 PC의 환경변수에 들어가서 사용자 환경 변수에 아래 경로를 추가한다. (시스템 속성 &amp;gt; 고급 &amp;gt; 환경 변수)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 환경변수의 Path를 더블클릭해서 추가해주면 된다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736081249783&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;%appdata%\Python\Scripts&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcSde4/btsLCqzT5mr/0RMc6l9aM0fsAa9SPpnZo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcSde4/btsLCqzT5mr/0RMc6l9aM0fsAa9SPpnZo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcSde4/btsLCqzT5mr/0RMc6l9aM0fsAa9SPpnZo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcSde4%2FbtsLCqzT5mr%2F0RMc6l9aM0fsAa9SPpnZo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;756&quot; height=&quot;834&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;쉘을 재기동하고 아래 명령을 입력했을 때, 이하와 같이 poetry에서 사용할 수 있는 명령어들이 나오면 잘 설치된 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;poetry&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1471&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btVatN/btsLDGID4ab/MORRUEv6gcX0oKRvWU0u60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btVatN/btsLDGID4ab/MORRUEv6gcX0oKRvWU0u60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btVatN/btsLDGID4ab/MORRUEv6gcX0oKRvWU0u60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtVatN%2FbtsLDGID4ab%2FMORRUEv6gcX0oKRvWU0u60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1471&quot; height=&quot;538&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1471&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Study/Python</category>
      <category>Poetry</category>
      <category>pyenv</category>
      <category>Python</category>
      <category>윈도우11</category>
      <category>환경 구축</category>
      <author>에몽쓰</author>
      <guid isPermaLink="true">https://geniemon0104.tistory.com/128</guid>
      <comments>https://geniemon0104.tistory.com/128#entry128comment</comments>
      <pubDate>Sun, 5 Jan 2025 21:55:38 +0900</pubDate>
    </item>
    <item>
      <title>[ML] 하이퍼파라미터 최적화(Random Search, Grid Search)</title>
      <link>https://geniemon0104.tistory.com/127</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번에는 하이퍼파라미터(Hyperparameter) 를 최적화하는 방법에 대해 정리하려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하이퍼파라미터(Hyperparameter) 란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;하이퍼파라미터(Hyperparameter)&lt;/b&gt; 란 머신러닝 모델을 모델링할 때, &lt;b&gt;사용자가 직접 세팅해야하는 값&lt;/b&gt;을 말한다. 하이퍼파라미터는 정해진 최적의 값이 없기에 경험에 기반하여 설정하는 경우가 많다. 그렇기 때문에 하이퍼파라미터를 조정하여 최적의 값을 경험적으로 찾아야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;  파라미터(Parameter) 와 하이퍼파라미터(Hyperparameter) 의 차이 (click!)&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;파라미터(Parameter) 와 하이퍼파라미터(Hyperparameter) 의 차이&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;머신러닝에서 파라미터(Parameter) 란 모델의 데이터로부터 학습하는 값이다. 즉, 모델 내부에서 결정되는 매개변수로서 이는 결국 데이터에 의해 결정된다.&lt;br /&gt;예를 들어, 정규분포를 그리는 것을 생각해보자. 이때, 정규분포를 그리면 평균(&amp;mu;) 과 표준편차(&amp;sigma;) 값이 구해지는데, 이 두 값이 파라미터이다.&lt;br /&gt;&lt;br /&gt;반면, 하이퍼파라미터의 경우에는 사용자가 직접 값을 세팅하는 변수이다.&lt;br /&gt;예를 들어, KNN으로 모델을 작성한다면 K 값, 랜덤포레스트로 모델을 작성한다면 n_estimators 등이 하이퍼파라미터에 해당한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 40px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.4645%; text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.648%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;b&gt;파라미터(Parameter)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.8875%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;b&gt;하이퍼파라미터(Hyperparameter)&lt;/b&gt; &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.4645%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;차이점&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.648%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자 설정 필요 X&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.8875%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자가 직접 설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하이퍼파라미터 최적화&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하이퍼파라미터 최적화란 머신러닝에서 모델에 가장 적합한 하이퍼파라미터 세트를 찾는 것이다. 하이퍼파라미터를 자동으로 최적화하는 방법으로는 Random Search, Grid Serach, Bayesian Optimization 등 여러 종류가 있지만, 이번 글에서는 그중에서도 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;Random Search&lt;/b&gt;와&lt;b&gt; Grid Serach&lt;/b&gt;를 중심으로 이야기하려고 한다.&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DolcQ/btsLkL4sMdY/TkCRv8nuJ1nl8OJkryYqx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DolcQ/btsLkL4sMdY/TkCRv8nuJ1nl8OJkryYqx1/img.png&quot; data-alt=&quot;Bergstra, J., Bengio, Y.: Random search for hyper-parameter optimization. Journal of Machine Learning Research 13, 281&amp;amp;ndash;305 (2012)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DolcQ/btsLkL4sMdY/TkCRv8nuJ1nl8OJkryYqx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDolcQ%2FbtsLkL4sMdY%2FTkCRv8nuJ1nl8OJkryYqx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1004&quot; height=&quot;509&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Bergstra, J., Bengio, Y.: Random search for hyper-parameter optimization. Journal of Machine Learning Research 13, 281&amp;ndash;305 (2012)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리드 서치(Grid Search)&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;그리드 서치(Grid Search)&lt;/b&gt; 는 하이퍼파라미터를 최적화하는 방법 중 하나로, 사용자가 지정한 하이퍼파라미터의 &lt;b&gt;조합을 모두 시도&lt;/b&gt;하여 가장 좋은 성능을 보이는 조합을 찾는 방법이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734408930813&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;GridSearchCV&quot; data-og-description=&quot;Gallery examples: Release Highlights for scikit-learn 1.4 Release Highlights for scikit-learn 0.24 Feature agglomeration vs. univariate selection Shrinkage covariance estimation: LedoitWolf vs OAS ...&quot; data-og-host=&quot;scikit-learn.org&quot; data-og-source-url=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV&quot; data-og-url=&quot;https://scikit-learn/stable/modules/generated/sklearn.model_selection.GridSearchCV.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bIKRhe/hyXOhhKLlf/MiOFbthtA73pdv0fHaBT90/img.png?width=400&amp;amp;height=280&amp;amp;face=0_0_400_280,https://scrap.kakaocdn.net/dn/59BCN/hyXKxNmhxB/8hIP3p9WgzKj4zV05a0fB0/img.png?width=400&amp;amp;height=280&amp;amp;face=0_0_400_280&quot;&gt;&lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bIKRhe/hyXOhhKLlf/MiOFbthtA73pdv0fHaBT90/img.png?width=400&amp;amp;height=280&amp;amp;face=0_0_400_280,https://scrap.kakaocdn.net/dn/59BCN/hyXKxNmhxB/8hIP3p9WgzKj4zV05a0fB0/img.png?width=400&amp;amp;height=280&amp;amp;face=0_0_400_280');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GridSearchCV&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Gallery examples: Release Highlights for scikit-learn 1.4 Release Highlights for scikit-learn 0.24 Feature agglomeration vs. univariate selection Shrinkage covariance estimation: LedoitWolf vs OAS ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;scikit-learn.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 하이퍼파라미터의 조합을 지정할 때 뭐부터 해야할지 모르겠다면 sklearn에서 사용되는 디폴트 값을 기준으로 정해보자.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장・단점&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;최적화&lt;/b&gt;: 모델의 성능을 높이기 위한 최적의 하이퍼파라미터를 찾을 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;자동화&lt;/b&gt;: 비효율적이고 시간이 많이 걸리는 수동 방식과 달리 자동으로 하이퍼파라미터를 조정할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;객관성&lt;/b&gt;: 모든 가능한 조합을 시도하므로, 선택의 주관성 없이 객관적인 결과를 얻을 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;실행 시간&lt;/b&gt;: 모든 조합을 탐색하므로, 실행에 시간이 많이 든다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;계산 비용&lt;/b&gt;: 모든 조합을 탐색하므로, 계산 비용이 많이 든다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예제&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;sklearn의 iris 데이터를 사용해서 그리드 서치를 사용해보자. 이번에는 정확한 모델을 만드는게 목적이 아니고 그리드 서치를 동작시켜 보는 것이 목적이기 때문에 따로 train과 test 데이터셋을 분할하진 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 필요한 라이브러리를 import 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734410454261&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터를 불러온 후, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;estimator를&lt;/span&gt; 100, 200, ... , 900 으로 그리드 서치를 적용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734410827808&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 데이터 불러오기
iris = load_iris()
X, Y = iris.data, iris.target

# 하이퍼파라미터 설정하기
n_estimators=range(100, 1000, 100)
h_param={'n_estimators':n_estimators}

# 그리드 서치를 이용해 하이퍼파라미터들을 순차적으로 학습 및 평가하기
gd=GridSearchCV(estimator=RandomForestClassifier(random_state=42), param_grid=h_param, verbose=1)
gd.fit(X,Y)

# 그리드 서치 결과를 추출하여 데이터프레임으로 출력하기
scores_df = pd.DataFrame(gd.cv_results_)
scores_df[['params', 'mean_test_score', 'rank_test_score', 'split0_test_score', 'split1_test_score', 'split2_test_score']]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GridSearchCV의 verbose를 1로 설정했기 때문에 &lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;iteration 시 간단한 메세지가 출력된다. 그리고 출력된 데이터프레임은 아래와 같다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BYNPp/btsLlc8OpPj/rhfkEKIqpAHWkakAbfGTT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BYNPp/btsLlc8OpPj/rhfkEKIqpAHWkakAbfGTT0/img.png&quot; data-alt=&quot;참고로 실행하는데 27.6초 걸렸다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BYNPp/btsLlc8OpPj/rhfkEKIqpAHWkakAbfGTT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBYNPp%2FbtsLlc8OpPj%2FrhfkEKIqpAHWkakAbfGTT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1041&quot; height=&quot;437&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;참고로 실행하는데 27.6초 걸렸다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아래의 코드를 통해 최적의 파라미터와 최고 정확도를 출력해 볼 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734411456188&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print('Best Parameter:', gd.best_params_) # Best Parameter: {'n_estimators': 100}
print('Max Accuracy: {0:.4f}'.format(gd.best_score_)) # Max Accuracy: 0.9667&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;랜덤 서치(Random Search)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;랜덤 서치(Random Search)&lt;/b&gt; 는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;하이퍼파라미터를 최적화하는 방법 중 하나로, 가능한 하이퍼파라미터 값들 중에서 &lt;b&gt;무작위로 값을 선택&lt;/b&gt;하여 모델을 평가하는 방법이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734411935019&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;RandomizedSearchCV&quot; data-og-description=&quot;Gallery examples: Release Highlights for scikit-learn 0.24 Faces recognition example using eigenfaces and SVMs Comparison of kernel ridge and Gaussian process regression Comparing randomized search...&quot; data-og-host=&quot;scikit-learn.org&quot; data-og-source-url=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html&quot; data-og-url=&quot;https://scikit-learn/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cG7TEN/hyXOdfleA5/jBZLpUorCgLV5i46NTA8wk/img.png?width=400&amp;amp;height=280&amp;amp;face=0_0_400_280,https://scrap.kakaocdn.net/dn/cB5KLs/hyXOmJ5VkY/c9pQAHikAPBtKwADoMivo1/img.png?width=400&amp;amp;height=280&amp;amp;face=0_0_400_280&quot;&gt;&lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cG7TEN/hyXOdfleA5/jBZLpUorCgLV5i46NTA8wk/img.png?width=400&amp;amp;height=280&amp;amp;face=0_0_400_280,https://scrap.kakaocdn.net/dn/cB5KLs/hyXOmJ5VkY/c9pQAHikAPBtKwADoMivo1/img.png?width=400&amp;amp;height=280&amp;amp;face=0_0_400_280');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;RandomizedSearchCV&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Gallery examples: Release Highlights for scikit-learn 0.24 Faces recognition example using eigenfaces and SVMs Comparison of kernel ridge and Gaussian process regression Comparing randomized search...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;scikit-learn.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장・단점&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;속도&lt;/b&gt;: 무작위로 값을 선택하므로 모든 조합을 비교하는 그리드 서치에 비해 실행 속도가 훨씬 빠르다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;효율성&lt;/b&gt;: 랜덤으로 값을 선택하기 때문에 불필요한 탐색 횟수를 줄일 수 있어 효율적이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;효율성&lt;/b&gt;: 중요한 부분은 지나치거나 불필요하게 많이 반복하는 경우가 생길 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;랜덤 서치는 어떻게 보면 효율적이기도 하고 어떻게 보면 비효율적이기도 하다. 개인적으로는 무작위로 선택하는 방식의 한계점이지 않을까 라는 생각이 든다...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아래 논문에서는 랜덤 서치가 그리드 서치보다 더 성능이 좋은 것을 입증하고 있다. &lt;s&gt;(나중에 읽어볼 예정...)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예제&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리드 서치와 마찬가지로 iris 데이터를 사용해 연습할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734413198119&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV # GridSearchCV 대신 RandomizedSearchCV 사용

iris = load_iris()
X, Y = iris.data, iris.target

n_estimators=range(100, 1000, 100)
h_param={'n_estimators':n_estimators}

rd=RandomizedSearchCV(estimator=RandomForestClassifier(random_state=42), param_distributions=h_param, verbose=1)
rd.fit(X,Y)

scores_df = pd.DataFrame(rd.cv_results_)
scores_df[['params', 'mean_test_score', 'rank_test_score', 'split0_test_score', 'split1_test_score', 'split2_test_score']]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터프레임 출력 결과는 아래와 같다. 이번에는 실행시간이 13초였는데, 그리드서치의 약 절반 정도 걸렸다. 아마 데이터 양이 더 많고 복잡해지면 더욱 눈에띄는 차이가 있지 않을까?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqoiib/btsLkWZEbaz/4M9NpsuA2WZigax6CH5o00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqoiib/btsLkWZEbaz/4M9NpsuA2WZigax6CH5o00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqoiib/btsLkWZEbaz/4M9NpsuA2WZigax6CH5o00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqoiib%2FbtsLkWZEbaz%2F4M9NpsuA2WZigax6CH5o00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1032&quot; height=&quot;388&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최적 파라미터와 최고 정확도를 확인해보자.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734413410418&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print('Best Parameter:', rd.best_params_) # Best Parameter: {'n_estimators': 100}
print('Max Accuracy: {0:.4f}'.format(rd.best_score_)) # Max Accuracy: 0.9667&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마무리&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오늘은 그리드 서치와 랜덤 서치의 차이점을 정리해보고 직접 코드도 작성해보았다. 이번 코드에서는 하이퍼파라미터를 하나만 지정하기도 했고 data split도 제대로 되지 않아 각각의 결괏값의 차이가 미미했지만, 다양한 하이퍼파라미터를 지정해 보면 결과가 달라질 것 같다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음에 머신러닝 모델을 작성할 때 꼭 활용해 볼 수 있었으면 좋겠다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Study/ML</category>
      <category>그리드서치</category>
      <category>랜덤서치</category>
      <category>파라미터</category>
      <category>하이퍼파라미터</category>
      <author>에몽쓰</author>
      <guid isPermaLink="true">https://geniemon0104.tistory.com/127</guid>
      <comments>https://geniemon0104.tistory.com/127#entry127comment</comments>
      <pubDate>Sun, 22 Dec 2024 15:41:28 +0900</pubDate>
    </item>
    <item>
      <title>[Python] append와 리스트 컴프리헨션</title>
      <link>https://geniemon0104.tistory.com/126</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 안건에서 리스트에 값을 추가할 때, for문을 활용해 append 하는 방식으로 구현했었는데 리스트 컴프리헨션을 이용하면 실행시간이 더욱 단축되므로 리스트 컴프리헨션을 사용해달라는 피드백을 받았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 리스트 컴프리헨션이란 무엇이고 append와 어떤 차이가 있는지를 이번 글을 통해 정리해보려 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리스트 컴프리헨션(List Comprehension)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;: 반복문으로 리스트를 작성할 때, 반복문을 별도로 작성하는 대신 &lt;b&gt;리스트 내부에 작성&lt;/b&gt;하여 반복하는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/APUrM/btsJRrL1jxF/XbfyBnvtA72EPIbCsf0Mc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/APUrM/btsJRrL1jxF/XbfyBnvtA72EPIbCsf0Mc1/img.png&quot; data-alt=&quot;출처: https://wikidocs.net/22805&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/APUrM/btsJRrL1jxF/XbfyBnvtA72EPIbCsf0Mc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAPUrM%2FbtsJRrL1jxF%2FXbfyBnvtA72EPIbCsf0Mc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;463&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://wikidocs.net/22805&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위의 사진이 리스트 컴프리헨션을 가장 잘 보여주는 사진이라고 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약 1부터 10까지의 정수를 순서대로 가지고 있는 리스트를 만들고자 한다면, 왼쪽의 사진처럼 numbers라는 빈 리스트를 만들고 for문을 사용하여 하나씩 append 하는 방식으로 구현할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 리스트 컴프리헨션 방식으로 변경한 것이 위 사진의 오른쪽에 해당한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EGRa6/btsJQbcvRYF/PXhCm1axlzxpEbQMri5DY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EGRa6/btsJQbcvRYF/PXhCm1axlzxpEbQMri5DY0/img.png&quot; data-alt=&quot;출처: https://wikidocs.net/22805&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EGRa6/btsJQbcvRYF/PXhCm1axlzxpEbQMri5DY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEGRa6%2FbtsJQbcvRYF%2FPXhCm1axlzxpEbQMri5DY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;316&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://wikidocs.net/22805&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빈 배열인 numbers 대신 리스트 컴프리헨션에 대괄호를 씌워주고, for문을 내부에 작성해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tcf3T/btsJQErHbad/neigTruLKcNlXjYjkL2vDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tcf3T/btsJQErHbad/neigTruLKcNlXjYjkL2vDK/img.png&quot; data-alt=&quot;출처: https://wikidocs.net/22805&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tcf3T/btsJQErHbad/neigTruLKcNlXjYjkL2vDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTcf3T%2FbtsJQErHbad%2FneigTruLKcNlXjYjkL2vDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;317&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://wikidocs.net/22805&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;for문에서의 n에 해당하는 부분이 리스트 컴프리헨션에서는 x에 해당한다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문법&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본적인 문법은 위에서 사진으로도 설명했듯이 대괄호 안에 for문을 써주는 방식이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727600072078&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[num for num in range(10)]  # [0, 1, 2, ... , 9]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;함수를 작성해 활용하거나 수식이나 조건을 추가하는 것도 가능하다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727600297895&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 수식 적용
[num*10 for num in range(10)]  # [0, 10, 20, ... , 90]

# 함수 적용
def test(x):
	x = str(x) + 'ab'
    return x
[test(num) for num in range(10)]  # ['0ab', '1ab', '2ab', ... , '9ab']

# 조건문 활용 (if문만 사용)
[num for num in range(10) if num%2==0]  # [0, 2, 4, ... , 8]
[num for num in range(10) if num%2==0 if num%4==0]  # [0, 4, 8] : 두개의 if문을 사용하는 경우에는 and 조건으로 묶여 실행됨

# 조건문 활용 (if-else문 사용)
[num if num%2==0 else 'odd' for num in range(10)]  # [0, 'odd', 2, 'odd', 4, 'odd', 6, 'odd', 8, 'odd']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리스트 컴프리헨션을 사용하는 이유&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;for문과 append를 사용해서도 충분히 원하는 코드를 구현할 수 있는데 왜 리스트 컴프리헨션을 사용하는걸까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리스트 컴프리헨션을 사용하는 이유는 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 코드의 간결성&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리스트 컴프리헨션을 사용하면 일반적으로 for문과 append로 구현할 때보다 코드 수가 줄어든다. 이를 통해, 코드를 간략화하고 가독성을 높일 수 있기에 리스트 컴프리헨션을 사용한다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 코드의 실행 속도 단축&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리스트 컴프리헨션을 사용하면 일반적으로 for문과 append의 조합으로 사용할 때보다 코드의 실행 속도가 단축된다. 리스트 컴프리헨션에서는 append 메소드를 명시적으로 call 하지 않기 때문에 이 부분에 대한 시간이 단축되기 때문이다. 이에 관한 자세한 설명은 아래 글을 읽어보면 좋을듯 하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://whatisand.github.io/why-fast-list-comprehension-python/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://whatisand.github.io/why-fast-list-comprehension-python/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1727599920827&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;파이썬에서 List Comprehension이 더 빠른 이유&quot; data-og-description=&quot;들어가며 보통 언어를 공부하면 쉽게 사용할 수 있도록 만들어진 문법일수록 실행시간에서 손해보는 경우가 많았습니다. 리스트 컴프리헨션도 일종의 언어 수준의 편의기능으로 생각했기에 당&quot; data-og-host=&quot;whatisand.github.io&quot; data-og-source-url=&quot;https://whatisand.github.io/why-fast-list-comprehension-python/&quot; data-og-url=&quot;https://whatisand.github.io/why-fast-list-comprehension-python/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://whatisand.github.io/why-fast-list-comprehension-python/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://whatisand.github.io/why-fast-list-comprehension-python/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;파이썬에서 List Comprehension이 더 빠른 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;들어가며 보통 언어를 공부하면 쉽게 사용할 수 있도록 만들어진 문법일수록 실행시간에서 손해보는 경우가 많았습니다. 리스트 컴프리헨션도 일종의 언어 수준의 편의기능으로 생각했기에 당&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;whatisand.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Study/Python</category>
      <category>list append</category>
      <category>List Comprehension</category>
      <category>리스트 컴프리헨션</category>
      <category>파이썬</category>
      <author>에몽쓰</author>
      <guid isPermaLink="true">https://geniemon0104.tistory.com/126</guid>
      <comments>https://geniemon0104.tistory.com/126#entry126comment</comments>
      <pubDate>Sun, 29 Sep 2024 18:11:50 +0900</pubDate>
    </item>
    <item>
      <title>[ML] numpy 모듈으로 푸리에 변환 구현</title>
      <link>https://geniemon0104.tistory.com/125</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지난번 작성한 푸리에 변환에 관해 이번에는 코드를 작성해보며 이해하려 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;안봤으면 보고오시소・・・&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://geniemon0104.tistory.com/124&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://geniemon0104.tistory.com/124&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726562024802&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[ML] 푸리에 변환(Fourier Transform) 이란?&quot; data-og-description=&quot;이번 안건에서 푸리에 변환과 관련한 내용을 접하게 되어, 다음에 또 푸리에 변환을 활용하게 될 때 참고로 사용하기 위해 정리해두고자 한다. 수학적인 증명방법이나 풀이보다는 왜 푸리에 변&quot; data-og-host=&quot;geniemon0104.tistory.com&quot; data-og-source-url=&quot;https://geniemon0104.tistory.com/124&quot; data-og-url=&quot;https://geniemon0104.tistory.com/124&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lSY1S/hyW6xkL6DG/r4Zfkg4DdR42GMI3zcTra1/img.png?width=800&amp;amp;height=475&amp;amp;face=0_0_800_475,https://scrap.kakaocdn.net/dn/b9nQkA/hyW2Wfr0xI/dxWc3O4xNByVbNRJbJjek0/img.png?width=800&amp;amp;height=475&amp;amp;face=0_0_800_475,https://scrap.kakaocdn.net/dn/drSkwo/hyW6FXpX8a/eS34VIp9YTK1C3iSZmPSE1/img.png?width=820&amp;amp;height=1008&amp;amp;face=0_0_820_1008&quot;&gt;&lt;a href=&quot;https://geniemon0104.tistory.com/124&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geniemon0104.tistory.com/124&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lSY1S/hyW6xkL6DG/r4Zfkg4DdR42GMI3zcTra1/img.png?width=800&amp;amp;height=475&amp;amp;face=0_0_800_475,https://scrap.kakaocdn.net/dn/b9nQkA/hyW2Wfr0xI/dxWc3O4xNByVbNRJbJjek0/img.png?width=800&amp;amp;height=475&amp;amp;face=0_0_800_475,https://scrap.kakaocdn.net/dn/drSkwo/hyW6FXpX8a/eS34VIp9YTK1C3iSZmPSE1/img.png?width=820&amp;amp;height=1008&amp;amp;face=0_0_820_1008');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[ML] 푸리에 변환(Fourier Transform) 이란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이번 안건에서 푸리에 변환과 관련한 내용을 접하게 되어, 다음에 또 푸리에 변환을 활용하게 될 때 참고로 사용하기 위해 정리해두고자 한다. 수학적인 증명방법이나 풀이보다는 왜 푸리에 변&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geniemon0104.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;numpy 공식 문서&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;아래는 numpy 공식 문서이다. 학부때는 그냥 잘 모르겠으면 누가 적어놓은거 복붙하거나 따라 작성할 때도 많았던 것 같은데, 확실히 직장에 오니까 공식 문서의 중요성을 실감중이다... 일본이라 더 공식 문서를 읽는걸 강조하는걸지도...&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://numpy.org/doc/stable/reference/routines.fft.html#&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://numpy.org/doc/stable/reference/routines.fft.html#&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726562159994&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Discrete Fourier Transform (numpy.fft) &amp;mdash; NumPy v2.1 Manual&quot; data-og-description=&quot;Discrete Fourier Transform (numpy.fft) The SciPy module scipy.fft is a more comprehensive superset of numpy.fft, which includes only a basic set of routines. Standard FFTs Real FFTs Hermitian FFTs Helper routines Background information Fourier analysis is &quot; data-og-host=&quot;numpy.org&quot; data-og-source-url=&quot;https://numpy.org/doc/stable/reference/routines.fft.html#&quot; data-og-url=&quot;https://numpy.org/doc/stable/reference/routines.fft.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://numpy.org/doc/stable/reference/routines.fft.html#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://numpy.org/doc/stable/reference/routines.fft.html#&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Discrete Fourier Transform (numpy.fft) &amp;mdash; NumPy v2.1 Manual&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Discrete Fourier Transform (numpy.fft) The SciPy module scipy.fft is a more comprehensive superset of numpy.fft, which includes only a basic set of routines. Standard FFTs Real FFTs Hermitian FFTs Helper routines Background information Fourier analysis is&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;numpy.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드 작성&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대충 코드 작성 흐름에 맞춰 순서를 적어뒀으니 따라서 실행하면 된다! 참고로 나는 주피터노트북 환경으로 셀을 하나하나 출력해보며 했지만 그냥 파이썬 스크립트 파일로 작성해도 되긴한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예제 코드는 아래 블로그를 참고했다. 정말 어디 교수님이신지,, 설명이 너무 좋아서 꽤나 감탄함...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/choi_s_h/222128863344&quot;&gt;https://m.blog.naver.com/choi_s_h/222128863344&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726562400441&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[P059] 파이썬의 고속푸리에 변환-3, FFT (Fast Fourier Transform of Python, FFT-3)&quot; data-og-description=&quot;&amp;nbsp; &amp;nbsp;파이썬의 numpy 팩키지에서 제공하는 fft.fft( ) 함수와 fft.fftfreq( )의 두 함수를 사용하...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://m.blog.naver.com/choi_s_h/222128863344&quot; data-og-url=&quot;https://blog.naver.com/choi_s_h/222128863344&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b1ZzvP/hyW20a5QVL/Utm4jEAAJTEdQXPCf6K6mk/img.png?width=550&amp;amp;height=231&amp;amp;face=0_0_550_231&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/choi_s_h/222128863344&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://m.blog.naver.com/choi_s_h/222128863344&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b1ZzvP/hyW20a5QVL/Utm4jEAAJTEdQXPCf6K6mk/img.png?width=550&amp;amp;height=231&amp;amp;face=0_0_550_231');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[P059] 파이썬의 고속푸리에 변환-3, FFT (Fast Fourier Transform of Python, FFT-3)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;파이썬의 numpy 팩키지에서 제공하는 fft.fft( ) 함수와 fft.fftfreq( )의 두 함수를 사용하...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 필요한 모듈을 불러오기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번에는 푸리에 변환에 사용할 numpy 모듈이랑 그래프 작성용 pyplot만 불러와도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1726562466030&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import matplotlib.pyplot as plt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 신호 생성하기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번에 작성할 주파수 데이터는 샘플링 시간이 0.001초이고, 각 신호 주파수가 10, 20, 30, 40Hz, 진폭은 2.0, 1.0, 0.5, 1.5 로 설정했다. 왜 아래와 같은 코드가 되는지는 위 링크에 들어가보면 정말 자세하게 설명해주신다..ㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; np.linspace&lt;/b&gt; : 수평축의 너비를 만들거나 1차원 배열을 만드는 등의 작업에 사용되는 함수&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1726562779040&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;time = np.linspace(0, 1, 1000) # 샘플링 시간 간격을 0.001초로 설정

s1 = 2*np.sin(20 * np.pi * time) # 10Hz、2.0의 진폭
s2 = np.sin(40 * np.pi * time) # 20Hz、1.0의 진폭
s3 = 0.5*np.sin(60 * np.pi * time) # 30Hz、0.5의 진폭
s4 = 1.5*np.sin(80 * np.pi * time) # 40Hz、1.5의 진폭

s = s1 + s2 + s3 + s4 # 신호 합성&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 푸리에 변환과 그래프 작성&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://blog.naver.com/choi_s_h/222128246691&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/choi_s_h/222128246691&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726563144842&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[P058] 파이썬의 고속푸리에 변환-2, FFT (Fast Fourier Transform of Python, FFT-2)&quot; data-og-description=&quot;&amp;nbsp; &amp;nbsp;앞의 포스트에서 고속푸리에 변환(FFT)을 위해 파이썬의 fft.fft( ) 함수를 이용하여 계산...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/choi_s_h/222128246691&quot; data-og-url=&quot;https://blog.naver.com/choi_s_h/222128246691&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/SuzFt/hyW2SREs63/VrvpJEdRisI2W8gMDK7PF0/img.png?width=348&amp;amp;height=342&amp;amp;face=0_0_348_342&quot;&gt;&lt;a href=&quot;https://blog.naver.com/choi_s_h/222128246691&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/choi_s_h/222128246691&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/SuzFt/hyW2SREs63/VrvpJEdRisI2W8gMDK7PF0/img.png?width=348&amp;amp;height=342&amp;amp;face=0_0_348_342');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[P058] 파이썬의 고속푸리에 변환-2, FFT (Fast Fourier Transform of Python, FFT-2)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;앞의 포스트에서 고속푸리에 변환(FFT)을 위해 파이썬의 fft.fft( ) 함수를 이용하여 계산...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 파트는 위 글을 참고해서 작성했다,, &lt;s&gt;정말 아름다운 글이야,,,&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;numpy 모듈을 사용해 푸리에 변환을 한 값은 &lt;b&gt;복소수&lt;/b&gt;가 된다. np.fft.fft()의 결과값으로 복소수 값을 구할 수 있는데, 이 결과값은 주파수 영역에서 어떤 주파수의 상대적인 크기가 큰지를 알려주는 정보이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;즉, np.fft.fft() 로 얻은 복소수 값의 크기를 알아야 된다는 말인데, numpy 모듈의 abs를 사용해 복소수의 크기를 계산한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1726563759841&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;strength = np.fft.fft(s)
strength = np.abs(strength) # 복소수의 크기 계산
freq = np.fft.fftfreq(1000, 0.001) # 그래프 작성에서 필요한 주파수 축 계산

plt.plot(freq, strength)
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 코드블럭을 실행하면 아래의 그래프를 얻을 수 있다. 왜 대칭인 모양의 그래프가 나왔는지 궁금할텐데, 그냥 우리가 사용하는 fft 모듈의 특성상 좌우대칭으로 출력해준다...ㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;좌우 대칭이어서 양수부분만 봐도 상관 없으니 양수부분에서 의미있는 부분인 0~50까지를 잘라서 확인해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bevMDi/btsJPySyLKI/lMfdCEKHtExie1o0a1rWCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bevMDi/btsJPySyLKI/lMfdCEKHtExie1o0a1rWCk/img.png&quot; data-alt=&quot;x축은 주파수, y축은 진폭을 의미&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bevMDi/btsJPySyLKI/lMfdCEKHtExie1o0a1rWCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbevMDi%2FbtsJPySyLKI%2FlMfdCEKHtExie1o0a1rWCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;563&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;x축은 주파수, y축은 진폭을 의미&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727422219429&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plt.xlim(0, 50, 10) # x축을 0~50까지 10 간격으로 출력
plt.ylim(0, 1200, 200) # y축을 0~1200까지 200 간격으로 출력
plt.grid()
plt.plot(freq, strength)
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위의 코드블럭을 실행하면 아래와 같은 그래프를 얻을 수 있다. 참고로, 지금은 푸리에 변환 그래프를 꺾은선그래프로 표현하고 있지만 바 그래프로도 표현할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bODCiB/btsJPaxLcIF/kCsZ0M1pTaIHEMBgfyvup0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bODCiB/btsJPaxLcIF/kCsZ0M1pTaIHEMBgfyvup0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bODCiB/btsJPaxLcIF/kCsZ0M1pTaIHEMBgfyvup0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbODCiB%2FbtsJPaxLcIF%2FkCsZ0M1pTaIHEMBgfyvup0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;890&quot; height=&quot;579&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래프를 보면 초기에 설정한대로 &lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;각 신호 주파수(10, 20, 30, 40Hz) 와 진폭(2.0, 1.0, 0.5, 1.5) 이 잘 나타나는 것을 확인할 수 있다. 즉, 푸리에 변환이 잘 계산되었다는 것이다 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt; 현실에서 분석하게 될 주파수 데이터는 이것보다 훨씬 복잡하고 다양한 성분이 섞여있겠지만 이러한 단순한 푸리에 변환 예제를 풀어보면서 푸리에 변환의 개념에 대해 이해할 수 있었다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Study/ML</category>
      <category>FFT</category>
      <category>파이썬</category>
      <category>푸리에 변환</category>
      <author>에몽쓰</author>
      <guid isPermaLink="true">https://geniemon0104.tistory.com/125</guid>
      <comments>https://geniemon0104.tistory.com/125#entry125comment</comments>
      <pubDate>Fri, 27 Sep 2024 16:39:30 +0900</pubDate>
    </item>
    <item>
      <title>[ML] 푸리에 변환(Fourier Transform) 이란?</title>
      <link>https://geniemon0104.tistory.com/124</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 안건에서 푸리에 변환과 관련한 내용을 접하게 되어, 다음에 또 푸리에 변환을 활용하게 될 때 참고로 사용하기 위해 정리해두고자 한다. 수학적인 증명방법이나 풀이보다는 왜 푸리에 변환이라는 것을 사용하고, 파이썬으로는 어떻게 활용 가능한가를 중점적으로 글을 작성할 예정이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;푸리에 변환(Fourier Transform)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;: 푸리에 변환이란 데이터 해석 기법 중 하나로, 일반적인 시간 범위의 데이터를 주파수 범위의 데이터로 변환하는 알고리즘이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqwfSf/btsJFrZK7lZ/bQ3FKVQkU4FKL1XiWZswJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqwfSf/btsJFrZK7lZ/bQ3FKVQkU4FKL1XiWZswJ1/img.png&quot; data-alt=&quot;(좌) Time Domain / (우) Frequency Domain&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqwfSf/btsJFrZK7lZ/bQ3FKVQkU4FKL1XiWZswJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqwfSf%2FbtsJFrZK7lZ%2FbQ3FKVQkU4FKL1XiWZswJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;475&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(좌) Time Domain / (우) Frequency Domain&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;목적&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;푸리에 변환의 목적은 시계열 데이터를 주파수 데이터로 변경하는 것이다. 이렇게 얘기해도 그래서 왜 시계열에서 주파수로 바꾸는건데? 라고 생각할 것이다. &lt;s&gt;(나도 그랬으니까...)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;푸리에 변환의 가장 큰 목적은 데이터 압축에 있다고 생각한다. 시계열데이터를 생각해보면 시간이 흐름에 따라 점점 데이터가 쌓여갈 것이다. 데이터 양이 늘어나면 처리속도도 비례해서 느려지기 때문에, 이러한 푸리에 변환을 사용해 데이터를 압축하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터를 압축하게 되면 해당 데이터에 대한 특징을 이해할 수 있고, 해당 데이터가 어떻게 구성되어 있는지를 이해할 수 있을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;✔️ 데이터 압축의 이해 (click!)&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아래와 같이 공부 계획에 대한 데이터가 있다고 가정해보자. 이 데이터는 7일간의 공부 계획에 관한 데이터이고, 국어, 수학, 영어, 과학 4가지의 과목을 공부해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E5uGc/btsJFsqPrhu/mVrQsLNFGW0e3jZKIjt441/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E5uGc/btsJFsqPrhu/mVrQsLNFGW0e3jZKIjt441/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E5uGc/btsJFsqPrhu/mVrQsLNFGW0e3jZKIjt441/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE5uGc%2FbtsJFsqPrhu%2FmVrQsLNFGW0e3jZKIjt441%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;264&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터를 잘 보면 패턴을 가진 것을 알 수 있다. 수학은 매일 공부하고 영어는 격일로, 국어는 3일에 한번, 과학은 4일에 1번 공부한다. 이에 따라 새로 데이터를 정리해보면 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IifPR/btsJEPNzc9b/r3APDwf2Wn8vLeNJ1ec5UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IifPR/btsJEPNzc9b/r3APDwf2Wn8vLeNJ1ec5UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IifPR/btsJEPNzc9b/r3APDwf2Wn8vLeNJ1ec5UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIifPR%2FbtsJEPNzc9b%2Fr3APDwf2Wn8vLeNJ1ec5UK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;246&quot; height=&quot;159&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음 작성한 데이터와 새로 작성한 데이터가 의미하는 바는 같다. 결국 1일차에는 전부 공부하고, 2일차에는 수학만 공부하고... 와 같은 의미의 데이터이다. 그러면 왜 굳이 위의 표처럼 데이터를 변환했을까?&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지금은 7일차까지의 공부계획밖에 없지만 만약 100일간의 공부계획, 1년간의 공부계획, 100년간의 공부계획을 세운다고 생각해보자. 처음 작성한 방식으로 데이터를 작성해나간다면 1년간의 공부계획만 하더라도 꽤나 많은 양의 데이터가 되버릴 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만, 새로 작성한 데이터의 경우에는 100일이든, 1년이든, 100년이든, 1000년이든 상관없이 4개의 데이터만으로 표현이 가능하다. (= 공부 주기에 대한 데이터를 새로 작성할 필요가 없다.) 이를 통해, 정보량이 상당히 줄어든 것을 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주기는&amp;nbsp;주파수의&amp;nbsp;역수이므로,&amp;nbsp;결국&amp;nbsp;데이터를&amp;nbsp;주파수에&amp;nbsp;대해&amp;nbsp;작성함으로써&amp;nbsp;상당한&amp;nbsp;양의&amp;nbsp;정보를&amp;nbsp;압축하여&amp;nbsp;표시할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;된&amp;nbsp;것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;출처: &lt;a href=&quot;https://renelemon.tistory.com/75&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://renelemon.tistory.com/75&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;푸리에 급수(Fourier Series)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;: 복잡한 주기함수나 주기 신호를 단순한 사인파(sin) 나 코사인파(cos) 의 합으로 나타내는 것&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단순한 파동의 합으로 나타내기 때문에 함수 내부의 특징을 추출할 수 있음&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;복잡한 주기함수를 단순한 삼각함수들의 합으로 나타낼 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;삼각함수는 지수함수의 한 종류이므로 지수함수의 합으로도 나타낼 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;1008&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAIs4c/btsJD8mAcG2/fMSmPAjJq9ZaX9qNwKDYR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAIs4c/btsJD8mAcG2/fMSmPAjJq9ZaX9qNwKDYR1/img.png&quot; data-alt=&quot;https://news.samsungdisplay.com/19688&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAIs4c/btsJD8mAcG2/fMSmPAjJq9ZaX9qNwKDYR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAIs4c%2FbtsJD8mAcG2%2FfMSmPAjJq9ZaX9qNwKDYR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;820&quot; height=&quot;1008&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;1008&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://news.samsungdisplay.com/19688&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;푸리에 변환(Fourier Transform) 과 푸리에 급수(Fourier Series) 의 차이&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;푸리에 급수(Fourier Series)&lt;/b&gt; : 주기함수(주기신호) 에서만 활용 가능. 비주기함수에서는 활용할 수 없다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;푸리에 변환 (Fourier Transform)&lt;/b&gt; : 비주기함수(비주기신호) 를 주기가 무한대인 주기함수라고 가정해 푸리에 급수를 활용할 수 있도록 하는 방법&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이산 푸리에 변환(DFT, Discrete Fourier Transform)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;: 연속적인 시간 범위로 푸리에 변환을 하는 것과는 다르게, N개의 유한한(이산적인) 푸리에 변환을 수행하는 것. 시간 범위에서 특정 너비만큼의 값들을 샘플링해서 푸리에 변환을 수행함.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXWPRD/btsJEqgcUIF/ZcF68xDa40adNgYKsaQYNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXWPRD/btsJEqgcUIF/ZcF68xDa40adNgYKsaQYNk/img.png&quot; data-alt=&quot;https://infograph.tistory.com/323&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXWPRD/btsJEqgcUIF/ZcF68xDa40adNgYKsaQYNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXWPRD%2FbtsJEqgcUIF%2FZcF68xDa40adNgYKsaQYNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;672&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://infograph.tistory.com/323&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;샘플링(Sampling)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;: 연속신호에서 이산신호로 변환하는 프로세스&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처리량과 시간복잡도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;O(N&amp;sup2;) 의 시간복잡도를 가지기 때문에, 처리에 꽤나 시간이 걸린다. 지금은 컴퓨터 성능이 많이 좋아져서 이산 푸리에 변환으로 푸리에 변환을 해도 시간이 그렇게까지는 안걸린다고 한다,,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSbjv3/btsJDZJY1Pz/lysXaTF8jlWzKn2RjuuSxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSbjv3/btsJDZJY1Pz/lysXaTF8jlWzKn2RjuuSxK/img.png&quot; data-alt=&quot;시간복잡도 그래프&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSbjv3/btsJDZJY1Pz/lysXaTF8jlWzKn2RjuuSxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSbjv3%2FbtsJDZJY1Pz%2FlysXaTF8jlWzKn2RjuuSxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;811&quot; height=&quot;589&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시간복잡도 그래프&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;고속 푸리에 변환(FFT, Fast Fourier Transform)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;: 이산 푸리에 변환의 한 종류로서, 시간복잡도 문제를 해결하기 위해 고안해낸 방법이다. 샘플링 중, 필요한 신호만을 뽑아 연산하는 방법이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EM5Vv/btsJDrf9Abj/a9E3JbIWmNk9mXKi4NzGCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EM5Vv/btsJDrf9Abj/a9E3JbIWmNk9mXKi4NzGCk/img.png&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;417&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.2853%; margin-right: 10px;&quot; data-widthpercent=&quot;48.85&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EM5Vv/btsJDrf9Abj/a9E3JbIWmNk9mXKi4NzGCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEM5Vv%2FbtsJDrf9Abj%2Fa9E3JbIWmNk9mXKi4NzGCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dr5j8F/btsJD8z5Wxf/HK58K7K1fureYfe8Cktmgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dr5j8F/btsJD8z5Wxf/HK58K7K1fureYfe8Cktmgk/img.png&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;418&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.5519%;&quot; data-widthpercent=&quot;51.15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dr5j8F/btsJD8z5Wxf/HK58K7K1fureYfe8Cktmgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdr5j8F%2FbtsJD8z5Wxf%2FHK58K7K1fureYfe8Cktmgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;왼쪽과 같은 그래프를 오른쪽처럼 변환하는 것&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처리량과 시간복잡도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;O(NlogN) 의 시간복잡도를 가지고 있어, 이산 푸리에 변환과 비교해보면 상당히 속도가 빨라졌다는 것을 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cz2Vjx/btsJDT4e1C5/U35fn16QLtdNuQbdckdpQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cz2Vjx/btsJDT4e1C5/U35fn16QLtdNuQbdckdpQk/img.jpg&quot; data-alt=&quot;https://brunch.co.kr/@eungseok/17&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cz2Vjx/btsJDT4e1C5/U35fn16QLtdNuQbdckdpQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcz2Vjx%2FbtsJDT4e1C5%2FU35fn16QLtdNuQbdckdpQk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;643&quot; height=&quot;208&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://brunch.co.kr/@eungseok/17&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번에는 푸리에 변환의 정의, 목적, 종류 등에 관해 간단하게 적어보았다. 다음 글에서는 간단한 파이썬 예제로 어떻게 푸리에 변환을 구하는지 작성해보려 한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Study/ML</category>
      <category>DFT</category>
      <category>FFT</category>
      <category>고속 푸리에 변환</category>
      <category>이산 푸리에 변환</category>
      <category>푸리에 급수</category>
      <category>푸리에 변환</category>
      <author>에몽쓰</author>
      <guid isPermaLink="true">https://geniemon0104.tistory.com/124</guid>
      <comments>https://geniemon0104.tistory.com/124#entry124comment</comments>
      <pubDate>Tue, 17 Sep 2024 17:25:53 +0900</pubDate>
    </item>
    <item>
      <title>소프트웨어 아키텍처 ; 어니언 아키텍처</title>
      <link>https://geniemon0104.tistory.com/123</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사내에서 진행하는 테스트 코드 작성 그랑프리에 참여했다. 결과적으로 시간 내에 구현하지 못해 입상하진 못했지만 팀 멤버들과 코드 회고를 하며 이번 그랑프리에 사용된 백엔드 아키텍처가 &lt;b&gt;어니언 아키텍처(Onion Architecture)&lt;/b&gt; 라는 것을 알 게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그냥 구현과 재사용성을 위해 코드를 나누어두었다고만 생각했는데 이러한 소프트웨어 아키텍처를 따라 작성되었다니,,,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;잊기 전에 내 블로그에 정리해보려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소프트웨어 아키텍처&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선, 소프트웨어 아키텍처란 무엇일까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a title=&quot;위키피디아&quot; href=&quot;https://ko.wikipedia.org/wiki/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4_%EA%B5%AC%EC%A1%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;위키피디아&lt;/a&gt;에 따르면 &lt;b&gt;소프트웨어 아키텍처&lt;/b&gt;란 &lt;b&gt;소프트웨어의 구성요소들 사이에서 유기적 관계를 표현하고 소프트웨어의 설계와 업그레이드를 통제하는 지침과 원칙&lt;/b&gt; 이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본 원리&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;모듈화&lt;/b&gt; : 소프트웨어의 성능을 향상하거나 시스템의 수정 및 재사용, 유지관리 등이 용이하도록 시스템의 기능들을 모듈 단위로 나누는 것&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;추상화&lt;/b&gt; : 문제의 전체적이고 포괄적인 개념을 설계한 후, 차례로 세분화해 구체화 하는 것&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;단계적 분해&lt;/b&gt; : 문제를 상위의 중요 개념으로부터 하위의 개념으로 구체화시키는 분할 기법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;정보 은닉&lt;/b&gt; : 한 모듈 내부에 포함된 절차와 자료들의 정보가 감추어져 다른 모듈이 접근하거나 변경하지 못하도록 하는 기법&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중요성&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그렇다면 소프트웨어 아키텍처는 개발에 있어서 왜 중요한 것일까?&amp;nbsp;어찌되든 코드를 작성해 하나의 서비스나 시스템이 완성되면 끝 아닌가?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소프트웨어가 커지고 성장하게 되면 아래 두 가지 문제가 발생할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;shared understanding&lt;/b&gt; : 지식의 공유. 즉, 프로젝트 팀원 간 프로젝트에 대한 이해도를 잘 공유하는 것이 어려움.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;hard to change&lt;/b&gt; : 한번 결정된 것은 변경하기 어려움.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그렇기 때문에, 우선적으로 아키텍처 디자인을 결정한다면&amp;nbsp;&lt;b&gt;지식의 공유가 용이&lt;/b&gt;해지고 기존의 소스코드를 플랫폼화 하는 등의 과정을 통해&amp;nbsp;&lt;b&gt;바꾸기 어려운 것들을 바꾸기 쉽게&amp;nbsp;&lt;/b&gt;할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZoOwN/btsIIiYYAn1/AELxZKgVi5kiES0eLT4j91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZoOwN/btsIIiYYAn1/AELxZKgVi5kiES0eLT4j91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZoOwN/btsIIiYYAn1/AELxZKgVi5kiES0eLT4j91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZoOwN%2FbtsIIiYYAn1%2FAELxZKgVi5kiES0eLT4j91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;687&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;종류&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일반적으로 많이 사용되는 10가지 소프트웨어 아키텍처 패턴은 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Layered-pattern&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Client-server pattern&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Master-slave pattern&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Pipe-filter pattern&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Broker pattern&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Peer-to-peer pattern&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Event-bus pattern&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Model-view-controller pattern&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Blackboard pattern&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Interpreter pattern&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;s&gt;정보처리기사 시험에서도 한번 본것같은 패턴들이,,,&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;어니언 아키텍처&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그렇다면 어니언 아키텍처란 무엇일까? &lt;b&gt;어니언 아키텍처(Onion Architecture)&lt;/b&gt; 란 &lt;b&gt;애플리케이션의 기능과 목적에 따라 애플리케이션의 코드를 계층화하는 접근 방식&lt;/b&gt;을 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Onion, 즉 양파는 중심을 여러개의 껍질이 감싸고 있듯이 어니언 아키텍처도 중앙 코어를 여러 겹의 레이어로 겹치고 있는 형태를 띈다. 가장 바깥쪽 레이어를 통과해야만 코어(중심) 에 접근할 수 있으며 외부에서 내부로 결합 흐름을 가지는 아키텍처이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dX7nRZ/btsIKaL1is9/1kGFA0RDKVHufwYWfAlKWK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dX7nRZ/btsIKaL1is9/1kGFA0RDKVHufwYWfAlKWK/img.jpg&quot; data-alt=&quot;https://dev.to/barrymcauley/onion-architecture-3fgl&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dX7nRZ/btsIKaL1is9/1kGFA0RDKVHufwYWfAlKWK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdX7nRZ%2FbtsIKaL1is9%2F1kGFA0RDKVHufwYWfAlKWK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;880&quot; height=&quot;712&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://dev.to/barrymcauley/onion-architecture-3fgl&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;계층 구성&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;도메인 모델, 도메인 서비스, 애플리케이션 서비스, 인프라 &lt;b&gt;총 4개의 레이어&lt;/b&gt;로 구성된다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;도메인 모델(Domain Model Layer)&lt;/b&gt; : 데이터 구조에 중점을 둠. 이 시스템에서 어떠한 데이터가 필요한지 등을 간략하게 정의.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;도메인 서비스(Domain Service Layer)&lt;/b&gt; : 이 시스템에서 반드시 구현해야되는 기능을 추상화 함. 이 계층에서 구현할 필요는 없으며, 애플리케이션 서비스 계층이나 인프라 계층에서 구현해야 하는 기능들을 추상화 함.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;애플리케이션 서비스(Application Service Layer)&lt;/b&gt; : 이 시스템(애플리케이션) 의 비즈니스 로직을 실행하는 애플리케이션 로직을 구성함. 예를 들면, try-catch 문을 사용해 에러 처리를 한다던지 등의 구현이 이 계층에서 이루어짐.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;인프라(Infrastructure Layer)&lt;/b&gt; : 실질적인 기능을 작성하는 곳이라고도 볼 수 있음. 데이터베이스, API, 외부 서비스 등 외부 엔티티와 통신하는 부분이 이 계층에서 작성됨.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장점&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;확장성&lt;/b&gt; : 모듈식 레이아웃을 사용하기에 애플리케이션 확장에 용이함. 기존에는 특정 코드를 수정하면 그 코드에 영항을 받는 다른 부분까지 수정이 필요했지만 어니언 아키텍처는 독립적 구성요소를 가지므로 이러한 문제가 발생할 가능성이 적음.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;테스트 가능성&lt;/b&gt; : 각 계층을 독립적으로 분리하므로 각 구성 요소의 기능을 검증하는 단위 테스트가 가능해짐. 또한, 더 간단히 오류를 찾고 수정할 수 있음.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;유지 보수성&lt;/b&gt; : 각 계층이 고유한 기능을 갖고, 인터페이스를 통해 다른 계층과 통신하기 때문에 다른 계층에 영향을 주지 않고 유지 보수가 가능함.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;유연성&lt;/b&gt; : 계층이 분리되어 있어, 다른 시스템 구성요소를 변경하지 않고도 구성 요소를 교체하거나 업데이트 할 수 있음.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Study</category>
      <category>onion architecture</category>
      <category>소프트웨어 아키텍처</category>
      <category>어니언 아키텍처</category>
      <author>에몽쓰</author>
      <guid isPermaLink="true">https://geniemon0104.tistory.com/123</guid>
      <comments>https://geniemon0104.tistory.com/123#entry123comment</comments>
      <pubDate>Tue, 23 Jul 2024 16:23:23 +0900</pubDate>
    </item>
    <item>
      <title>[Google Colaboratory] 구글 코랩으로 시크릿(Secrets) 관리하기</title>
      <link>https://geniemon0104.tistory.com/122</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아래 트윗에서 알 수 있듯이 작년 Colab에 시크릿 관리 기능이 추가되어 Secrets 를 보다 간단하게 코랩 안에서 사용할 수 있게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p dir=&quot;ltr&quot; lang=&quot;en&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;You can now safely store your private keys, such as your &lt;a href=&quot;https://twitter.com/huggingface?ref_src=twsrc%5Etfw&quot;&gt;@huggingface&lt;/a&gt; or &lt;a href=&quot;https://twitter.com/kaggle?ref_src=twsrc%5Etfw&quot;&gt;@kaggle&lt;/a&gt; API tokens, in Colab! Values stored in Secrets are private, visible only to you and the notebooks you select. &lt;a href=&quot;https://t.co/dz9noetUAL&quot;&gt;pic.twitter.com/dz9noetUAL&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;mdash; Colaboratory (@GoogleColab) &lt;a href=&quot;https://twitter.com/GoogleColab/status/1719798406195867814?ref_src=twsrc%5Etfw&quot;&gt;November 1, 2023&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://platform.twitter.com/widgets.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용법&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 &lt;a title=&quot;Colab&quot; href=&quot;https://colab.research.google.com/drive/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colab&lt;/a&gt;을 열고, 왼쪽 사이드바의 키 마크를 클릭한 후 [새로운 시크릿을 추가] 를 통해 시크릿 정보를 입력한다. 그 후에 가장 왼쪽에 있는 [노트북에서 액세스] 를 허용해주면 시크릿 사용이 노트북에서 가능하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0l3EO/btsIF1Vpk8u/agVGTFYuBPWhPf8C6CjiB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0l3EO/btsIF1Vpk8u/agVGTFYuBPWhPf8C6CjiB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0l3EO/btsIF1Vpk8u/agVGTFYuBPWhPf8C6CjiB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0l3EO%2FbtsIF1Vpk8u%2FagVGTFYuBPWhPf8C6CjiB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;638&quot; height=&quot;112&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제로 접근은 아래의 코드를 이용해 접근할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721352828838&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import openai
from google.colab import userdata
openai.api_key = userdata.get('OPENAI_API_KEY')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;조금 찾아보니 Secrets는 Google 계정에 연결되어 동작하는 것 같아서 Notebook마다 Key를 관리하고 싶은 경우에는 관리가 힘들지도 모르겠다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Study</category>
      <category>COLAB</category>
      <category>Secrets</category>
      <author>에몽쓰</author>
      <guid isPermaLink="true">https://geniemon0104.tistory.com/122</guid>
      <comments>https://geniemon0104.tistory.com/122#entry122comment</comments>
      <pubDate>Fri, 19 Jul 2024 10:25:29 +0900</pubDate>
    </item>
  </channel>
</rss>