<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>2ast_Gun</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 17 Aug 2022 07:32:13 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>2ast_Gun</title>
            <url>https://images.velog.io/images/eastgun_/profile/c58133ac-d265-4d72-9eb3-102ddcc99578/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 2ast_Gun. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/eastgun_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Spring Standard - Spring MVC (1)]]></title>
            <link>https://velog.io/@eastgun_/Spring-Standard-Spring-MVC-1</link>
            <guid>https://velog.io/@eastgun_/Spring-Standard-Spring-MVC-1</guid>
            <pubDate>Wed, 17 Aug 2022 07:32:13 GMT</pubDate>
            <description><![CDATA[<h1 id="spring-mvc">Spring MVC</h1>
<h2 id="원격-프로그램-실행">원격 프로그램 실행</h2>
<h3 id="1-로컬-프로그램-실행">1. 로컬 프로그램 실행</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/3c419b9c-47a3-48ba-97be-fe59fe5312df/image.png" alt=""></p>
<blockquote>
<p>자바 인터프리터가 main() 호출
호출할 수 있는 이유 : static라서 , static는 객체생성 필요 X</p>
</blockquote>
<h3 id="2-원격-프로그램-실행">2. 원격 프로그램 실행</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/b9e9af4d-d8dc-42d7-b21d-b3f472922f5f/image.png" alt=""></p>
<blockquote>
<p>원격 프로그램은 Tomcat 같은 WAS가 필요.
외부에서 브라우저로 서버에 있는 프로그램을 실행할려면 2가지 작업 필요</p>
<ol>
<li>프로그램 등록 2. URL과 프로그램을 연결</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c58f603d-9077-4bd2-9510-2299b03caa86/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/b5d645bf-12a2-49f7-8eaa-a870c7906737/image.png" alt=""></p>
<blockquote>
<p>URL로 원격프로그램을 호출하면 톰캣이 객체 생성을 해주고 메서드 호출을 해줌</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/75c9f165-66d9-43b7-a244-6529dcde78e6/image.png" alt=""></p>
<h2 id="http-요청과-응답---실습">HTTP 요청과 응답 - 실습</h2>
<h3 id="1-httpservletrequest">1. HttpServletRequest</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/39e6f5a4-3190-446c-bcb2-57e78d313f4a/image.png" alt=""></p>
<blockquote>
<p>main(String[] args) -&gt; main(HttpServletRequest request)</p>
</blockquote>
<h3 id="2-httpservletrequest의-메서드">2. HttpServletRequest의 메서드</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/5b4a6c4f-2d3c-49ba-8cfd-efa630afac6e/image.png" alt=""></p>
<h2 id="http-요청과-응답---이론">HTTP 요청과 응답 - 이론</h2>
<h3 id="1-프로토콜protocol이란">1. 프로토콜(protocol)이란?</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/59c6cf5f-7fd0-4474-acf0-ab088cd904ef/image.png" alt=""></p>
<ul>
<li>서로 간의 통신을 위한 약속, 규칙</li>
<li>주고 받을 데이터에 대한 형식을 정의한 것</li>
</ul>
<h3 id="2-httphyper-text-transfer-protocol란">2. HTTP(Hyper Text Transfer Protocol)란?</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/e3e85005-cf36-4a30-bfb9-ed5c3a70241d/image.png" alt=""></p>
<ul>
<li>단순하고 읽기 쉽다. - 텍스트 기반의 프로토콜</li>
<li>상태를 유지하지 않는다.(stateless) - 클라이언트 정보를 저장 X
<img src="https://velog.velcdn.com/images/eastgun_/post/c0c574bc-cb1b-4f39-a6e6-d5e518e37493/image.png" alt=""></li>
</ul>
<ul>
<li>확장 가능하다. - 커스텀 헤더(header)추가 가능</li>
</ul>
<h3 id="3-http-메시지">3. HTTP 메시지</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/546bf624-6128-4c0e-9acb-57229d2f2b8e/image.png" alt=""></p>
<blockquote>
<p>헤더와 바디로 구성되어 있다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c1811fc6-a349-4e6f-b118-a682500f4b66/image.png" alt=""></p>
<h3 id="4-http-메시지---응답-메시지">4. HTTP 메시지 - 응답 메시지</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/01c285ff-2b1e-4ab6-a6f6-342500f1a33e/image.png" alt=""></p>
<blockquote>
<p>상태코드에 따라 의미가 다름, 주로 4XX(Client Error), 5XX(Server Error) 많이 봄</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/7a540a98-d6f6-41b6-a1f8-2bc5d380a7ba/image.png" alt=""></p>
<h3 id="5-http-메시지---요청-메시지">5. HTTP 메시지 - 요청 메시지</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/556639be-e62e-4848-99cd-c21f574c4ae6/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022. 08. 17(수) Python 공부 13일차]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-17%EC%88%98-Python-%EA%B3%B5%EB%B6%80-13%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-17%EC%88%98-Python-%EA%B3%B5%EB%B6%80-13%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 17 Aug 2022 01:19:08 GMT</pubDate>
            <description><![CDATA[<h2 id="클래스-연산자-재정의-이해-및-사용">클래스 연산자 재정의 이해 및 사용</h2>
<pre><code class="language-python"># Point
# 2차원 좌표평면 각 점(x, y)
# 연산
# 두점의 덧셈, 뺄셈 (1, 2) + (3, 4) = (4, 6)
# 한점과 숫자의 곱셈 (1, 2) * 3 = (3, 6)
# 그 점의 길이 (0, 0) 부터의 거리
# x, y 값 가져오기
# 출력하기

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    # 두점의 덧셈, 뺄셈 (1, 2) + (3, 4) = (4, 6)
    def __add__(self, pt):
        new_x = self.x + pt.x
        new_y = self.y + pt.y

        return Point(new_x, new_y)

    # 두점의 덧셈, 뺄셈 (1, 2) + (3, 4) = (4, 6)
    def __sub__(self, pt):
        new_x = self.x - pt.x
        new_y = self.y - pt.y

        return Point(new_x, new_y)

    # 한점과 숫자의 곱셈 (1, 2) * 3 = (3, 6)
    def __mul__(self, factor):
        return Point(self.x * factor, self.y * factor)

    # 그 점의 길이 (0, 0) 부터의 거리
    def __len__(self):
        return self.x ** 2 + self.y ** 2

    # x, y 값 가져오기
    def __getitem__(self, index):
        if index == 0:
            return self.x
        elif index == 1:
            return self.y
        else:
            return -1

    # 출력하기
    def __str__(self):
        return &#39;({}, {})&#39;.format(self.x, self.y)


p1 = Point(3, 4)
p2 = Point(2, 7)
p3 = p1 + p2
p4 = p1 - p2
p5 = p1 * 3


print(p1)
print(p2)
print(p3)
print(p4)
print(p5)
print(len(p1))
print(p1[0])
print(p1[1])

# (3, 4)
# (2, 7)
# (5, 11)
# (1, -3)
# (9, 12)
# 25
# 3
# 4</code></pre>
<h2 id="클래스-연습문제-풀이">클래스 연습문제 풀이</h2>
<h3 id="연습문제">연습문제)</h3>
<ul>
<li>복소수 클래스를 정의 해봅시다.</li>
<li>덧셈, 뺄셈, 곱셈 연산자 지원</li>
<li>길이 (복소수의 크기) 지원</li>
<li>복소수 출력 &#39;1 + 4j&#39;와 같이 표현</li>
<li>비교 연산 ==, != 지원</li>
<li>=, &lt;=, &lt;, &gt; 연산 지원</li>
<li>절대값 지원</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Machine Learning 기초]]></title>
            <link>https://velog.io/@eastgun_/Machine-Learning-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@eastgun_/Machine-Learning-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Tue, 16 Aug 2022 05:26:17 GMT</pubDate>
            <description><![CDATA[<h1 id="part1--machine-learning의-개념과-종류">Part1 : Machine Learning의 개념과 종류</h1>
<h2 id="machine-learning의-개념">Machine Learning의 개념</h2>
<h3 id="무엇x으로-무엇y을-예측하고-싶다">&quot;무엇(X)으로 무엇(Y)을 예측하고 싶다&quot;</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/530f67a2-91be-4aaf-b1f1-38fd188c0219/image.png" alt=""></p>
<blockquote>
<p>데이터는 행과 열로 이루어져 있어야 한다.
예측하고 싶은 대상을 Y로 두었고 Y에 쓰이는 대상을 X로 주었다.
X를 가지고 Y를 예측하고 싶을때 이럴경우 머신러닝을 사용한다</p>
</blockquote>
<h3 id="기계-학습-또는-머신-러닝영어--machine-learning은-인공-지능의-한-분야로-컴퓨터가-학습할-수-있도록-하는-알고리즘과-기술을-개발하는-분야를-말한다-위키피디아">기계 학습 또는 머신 러닝(영어 : machine learning)은 인공 지능의 한 분야로, 컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야를 말한다 (위키피디아)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/2d731d34-6070-41dd-ac85-ab697cc3a476/image.png" alt=""></p>
<ul>
<li><strong>주어진 데이터를 통해서 입력변수와 출력변수간의 관계를 만드는 함수 f를 만드는 것</strong></li>
<li><strong>주어진 데이터 속에서 데이터의 특징을 찾아내는 함수 f를 만드는 것</strong></li>
</ul>
<blockquote>
<p>즉 함수 f가 머신러닝이다. 그런데 하나 더 x를 가지고 y를 예측하는 것 뿐만 아니라 x에 대해서 x끼리의 숨겨진 패턴을 찾아낸다거나 이 데이터안에서 새로운 특징을 찾아내는거 또한 머신러닝이다.</p>
</blockquote>
<h3 id="machine-learning으로-할-수-있는-것들">Machine Learning으로 할 수 있는 것들</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/dff25b21-f02f-4c9a-8241-2c4edc54bd08/image.png" alt=""></p>
<blockquote>
<p>예측 탐지 모델, 이상 탐지 모델, 이미지 분류 모델 등등
X들로만 가지고 할 수 있는 것들 : Segmentation, 로그기록을 이용해서 맞춤 상품 추천 시스템, 소셜 및 사회 이슈 파악 등등</p>
</blockquote>
<h3 id="f란-무엇인가-회귀-분석인-경우">f란 무엇인가 (회귀 분석인 경우)</h3>
<ul>
<li><strong>f를 구하기 위해서 입력 변수와 출력 변수가 필요함</strong></li>
<li><strong>p개의 입력 변수 X1, X2, ... Xp가 있고, 출력 변수 Y가 있을 때, X = (X1, X2, ..., Xp)라 하면 입력 변수와 출력 변수의 관계를 나타내는 식은 다음과 같음</strong>
<img src="https://velog.velcdn.com/images/eastgun_/post/a6236d29-6c61-4553-ae9c-c951cf6d864a/image.png" alt=""></li>
</ul>
<blockquote>
<p>앱실론 : 오차항 
예측치와 실제 값의 차이를 오차항(앱실론)이라 부른다.
실제 Y값을 예측 할려면 f(X) + 앱실론 을 해야 한다.
함수 f : 정해졌지만 알 수 없는 함수</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/05154d28-74a8-426d-a03e-99c039024ba7/image.png" alt=""></p>
<blockquote>
<p>Population(모집단)을 알고 있다면 함수 f는 완벽하게 알 수 있다. 허나 모집단을 완벽하게 알 수 없으니 예측을 하는것</p>
</blockquote>
<blockquote>
<p>Population을 모를 때 샘플을 뽑아서 데이터를 학습하고 그 데이터를 가지고 함수 f를 추정한다. (추정을 하기 때문에 모자를 씌운다) 즉 Y햇</p>
</blockquote>
<h2 id="지도학습과-비지도학습">지도학습과 비지도학습</h2>
<h3 id="지도-학습supervised-learning">지도 학습(supervised learning)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/13c57e42-60e3-4530-9170-f98eb7b745a5/image.png" alt=""></p>
<blockquote>
<p>Y가 연속형 변수일 때 우리는 이 문제를 회귀(regression) 문제 라고 이야기 하고, 그때의 모형을 회귀 모형(regression model)이라 한다. Y가 연속형이다 라는 뜻은 Y가 어떠한 실수값을 가질때를 얘기한다. 키, 몸무게, BMI 지수 이런것들을 다 모두 연속형 변수라고 한다.</p>
</blockquote>
<blockquote>
<p>Y가 이산형 변수를 가질 때 즉 어떠한 클래스를 가질 때 우리는 이 문제를 분류(Classification) 문제 라고 이야기 하고 이 때의 모형을 분류 모형(Classification model)이라 한다. 이산형 변수라는 것은 성별, 흡연여부, 질병여부, 주가 오른다 내린다, 불량이다 정상이다, 비만여부 등 이런것들을 이산형 변수라고 한다.</p>
</blockquote>
<h3 id="비지도-학습unsupervised-learning">비지도 학습(unsupervised learning)</h3>
<ul>
<li>출력 변수(Y)가 존재하지 않고, 입력 변수(X)간의 관계에 대해 모델리 ㅇ하는 것</li>
<li>군집 분석 - 유사한 데이터끼리 그룹화</li>
<li>PCA - 독립변수들의 차원을 축소화
<img src="https://velog.velcdn.com/images/eastgun_/post/2aaa885b-41ee-48ff-a760-59600062c36e/image.png" alt=""></li>
</ul>
<blockquote>
<p>X들끼리 어떠한 패턴을 찾아내는것을 비지도학습이라 한다. 
가장 대표적인 예가 군집 분석이다. 
PCA는 새로운 축을 만들어서 아에 새로운 변수를 만드는것이 PCA 기법이다.</p>
</blockquote>
<h3 id="강화학습reinforcementlearning">강화학습(reinforcementlearning)</h3>
<ul>
<li>수 많은 시뮬레이션을 통해  현재의 선택이 먼 미래에 보상이 최대가 되도록 학습</li>
<li>Agent가 action을 취하고 환경에서 보상을 받고 이 보상이 최대가 되도록 최적의 action을 취하는 방법을 배움
<img src="https://velog.velcdn.com/images/eastgun_/post/80ecb891-a721-4ca1-a7c4-2b61d3ef3cc9/image.png" alt=""></li>
</ul>
<blockquote>
<p>최근에는 강화학습도 머신러닝의 일부라고 주장하는 사람들도 많다.
에이전트가 어떤 상태일때 어떤 액션을 취해야 먼 미래에 큰 보상을 받느냐가 기준이된다.
강화학습의 가장 유명한 예 : 알파고 -&gt; 에이전트 : 바둑기사, 액션 : 바둑의 모든 수 state : 바둑 판, reward : 대국이 끝났을 대 이겼느냐 졌느냐를 따지는것</p>
</blockquote>
<h3 id="정리">정리</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/32ba728d-da72-43bf-8ff3-3f510bacb81d/image.png" alt=""></p>
<blockquote>
<p>머신러닝은 지도학습과 비지도학습으로 나뉠수 있는데 지도학습은 회귀와 분류로 나누고
비지도학습은 PCA나 군집화 기타 등등 많은 알고리즘들이 있고 두개의 큰 차이점은 Labeled data의 존재유무 차이이다.
요즘에는 강화학습도 머신러닝의 일부라고 주장하는 사람들도 있다.</p>
</blockquote>
<h2 id="machine-learning의-종류">Machine Learning의 종류</h2>
<h3 id="선형-회귀분석liner-regression">선형 회귀분석(Liner Regression)</h3>
<ul>
<li>독립변수와 종속변수가 선형적인 관계가 있다라는 가정하에 분석</li>
<li>직선을 통해 종속변수를 예측하기 때문에 독립변수의 중요도와 영향력을 파악하기 쉬움
<img src="https://velog.velcdn.com/images/eastgun_/post/04eaa9e1-9857-45fd-b251-eb2b048d21df/image.png" alt=""></li>
</ul>
<blockquote>
<p>선형 회귀분석은 어떤 직선을 그어서 이 직선을 가지고 X를 가지고 Y를 예측하고 싶어 한다
선형적인 관계가 있다 : X가 증가/감소할때 Y도 증가/감소해야 선형적인 관계가 있다라고 한다
단점은 비선형관계에 관해서는 표현을 잘 못한다.</p>
</blockquote>
<h3 id="의사결정나무decision-tree">의사결정나무(Decision Tree)</h3>
<ul>
<li>독립 변수의 조건에 따라 종속변수를 분리 (비가 내린다 -&gt; 축구를 하지 않는다)</li>
<li>이해하기 쉬우나 overfitting이 잘 일어남</li>
</ul>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/b474d2eb-ee93-49f6-8e6a-d80bc136ca78/image.png" alt=""></p>
<blockquote>
<p>이 모델은 너무 직관적이다. 머신러닝을 잘 모르는 사람들도 이 그림을 보면 아 이런 모델이구나 라고 생각할 수 있을 정도로 직관적이다.
간단한 문제에는 잘 맞고 복잡한 문제에는 잘 맞지 않는 단점이 있다.</p>
</blockquote>
<h3 id="knnk-nearest-neighbor">KNN(K-Nearest Neighbor)</h3>
<ul>
<li>새로 들어온 데이터의 주변 k개의 데이터의 class로 분류하는 기법</li>
</ul>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/fdbff00e-b88c-41f2-87d5-4b6bcf590282/image.png" alt=""></p>
<blockquote>
<p>굉장히 간단한 모델이다.
이 데이터 내에서 3개의 클래스가 있다고 했을 때 물음표에 해당하는 데이터가 들어왔을때 이 주변 k개 데이터를 봐서 어느 클래스에 더 가까운지 묻고 그에 해당하는 대답에 대한 클래스로 분류하는것이 KNN이다. 여기서 k는 사람이 지정해주는 거라 k에 따라서 성능이 달라진다.
사람이 지정해 주어야 하는 파라미터를 하이퍼 파라미터라고 한다.</p>
</blockquote>
<h3 id="neural-network">Neural Network</h3>
<ul>
<li>입력, 은닉, 출력층으로 구성된 모형으로서 각 층을 연결하는 노드의 가중치를 업데이트하면서 학습</li>
</ul>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/ee4b58f1-f020-48cc-9104-0c24225d2e01/image.png" alt=""></p>
<blockquote>
<p>딥러닝 모델의 근간이 되는 네트워크 모델이다.
수 많은 직선을 이용을 해서 복잡한 모형을 만들 수 있게 되는게 뉴럴 네트워크이다.
출력값을 내 뱉고 실제값과 출력값의 차이를 보고 다시 weight를 업데이트 시켜 분류가 잘 되게끔 학습을 시키는게 뉴럴 네트워크의 기본 원리라고 생각하면 된다.
치명적인 단점은 오버피팅이 너무 잘된다. 그래서 잘 쓰이지 않게 되었다.</p>
</blockquote>
<h3 id="svmsupport-vector-machine">SVM(Support Vector Machine)</h3>
<ul>
<li>Class 간의 거리(margin)가 최대가 되도록 decision boundary를 만드는 방법</li>
</ul>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/861ecd84-df39-4771-92d9-3b56a5f17f7f/image.png" alt=""></p>
<blockquote>
<p>2000년대 초중반까지 잘 쓰인 모델
이 클래스간의 거리가 최대가 되게끔 직선을 긋기 때문에 좀 더 decision boundary를 좋게 그을 수 있다.
실제 데이터에는 잘 맞지않는 오버피팅이 잘 발생하였다.
SVM은 학습 과정 내에서 어느정도 오차는 허용한다.
학습하는 시간이 너무 오래걸리는 단점이 있다. 데이터가 커질 수록 더더욱 오래걸린다.
예를들어 일반적인 데스크탑인 경우 10000개의 데이터라고 가정할때, 칼럼이 4000개라면 SVM은 하루정도 걸릴수 있다.</p>
</blockquote>
<h3 id="ensemble-learning">Ensemble Learning</h3>
<ul>
<li>여러 개의 모델(classifier or base learner)을 결합하여 사용하는 모델
<img src="https://velog.velcdn.com/images/eastgun_/post/7f67e600-0c7a-4b04-9313-212b01a15447/image.png" alt=""></li>
</ul>
<blockquote>
<p>요즘 가장 많이 쓰이고 있는 앙상블 러닝
앙상블이라는 뜻 자체가 화합을 이루다 조화를 이루다라는 뜻
앙상블 러닝의 기본 모델은 classifier, base learner 이다.
디시전 트리를 많이 사용 한다. 디시전 트리를 기반으로 앙상블 러닝을 많이 사용하고 크게 3가지 정의가 있는데 다음시간에 배움.</p>
</blockquote>
<blockquote>
<p>여러개의 모델을 만든 다음에 데이터가 들어 왔을 때 예측을 하고 각각의 모델들이 아웃풋을 내뱉을건데 그때의 아웃풋을 평균을 내거나 투표를 한다.</p>
</blockquote>
<blockquote>
<p>앙상블 러닝 같은 경우에는 이 베이스 언어를 어떻게하면 다양하게 만들 수 있을까 좀 더 다양한 모델을 만들어서 하나의 새로운 성능이 좋은 분류기를 만들 수 있을까가 핵심이다.</p>
</blockquote>
<blockquote>
<p>앙상블 러닝에 크게 3가지 정의가 있을뿐이지 그 3개가 전부가 아니다.</p>
</blockquote>
<h3 id="k-means-clustering">K-means clustering</h3>
<ul>
<li>Label 없이 데이터의 군집으로 k개로 생성
<img src="https://velog.velcdn.com/images/eastgun_/post/c65adb21-7269-452f-b4ed-519165e5a558/image.png" alt=""></li>
</ul>
<blockquote>
<p>언슈퍼바이저드 러닝의 가장 대표적인 예인 군집분석이고 가장 유명한 K-means clustering</p>
</blockquote>
<blockquote>
<p>데이터가 (a)처럼 되어있따고 가정 하면은 랜덤하게 포인트 2개를 찍고(b) 그 다음에 이 주변에 가까운 각각의 데이터들을 할당을 시킨다(c) 그 다음에 이 데이터의 중심점을 다시 찍는다(d) 다시 그 주변의 데이터들을 할당한다(e) 또 다시 데이터의 중심점을 찍는다(f)</p>
</blockquote>
<blockquote>
<p>k개를 어떻게 설정에 하느냐에 따라서 성능이 달라지는 단점이 있다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022. 08. 16(화) Spark & Hadoop 초격차 12일차]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-16%ED%99%94-Spark-Hadoop-%EC%B4%88%EA%B2%A9%EC%B0%A8-12%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-16%ED%99%94-Spark-Hadoop-%EC%B4%88%EA%B2%A9%EC%B0%A8-12%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 16 Aug 2022 02:04:14 GMT</pubDate>
            <description><![CDATA[<h1 id="apache-spark-기초">Apache Spark 기초</h1>
<h2 id="spark-개요-spark-software-components">Spark 개요 (Spark Software Components)</h2>
<h3 id="spark-software-components-12">Spark Software Components (1/2)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/28971a00-2c9c-4d19-b2ab-020165cc7946/image.png" alt=""></p>
<blockquote>
<p>Driver는 클라이언트 사이드의 어플리케이션으로서 Spark 프로그램의 시작점인 Spark Context를 내부에 생성하고 유지합니다. Spark의 동작은 Spark Context로부터 시작됩니다. Driver는 Spark Context를 통해 Spark Standalone, Hadoop YARN과 같은 Cluster manager와 통신하여 실제 분산 병렬 연산을 수행하는 Executor 생성을 요청하게 됩니다.</p>
</blockquote>
<h3 id="spark-software-components-22">Spark Software Components (2/2)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/5c0fbfe3-27fd-47fc-bad7-397040d79d5e/image.png" alt=""></p>
<blockquote>
<p>로컬 환경은 여러 머신이 아닌 단일머신에서 로컬 cpu 코어를 통해 병렬 쓰레드로 여러 task들을 수행합니다. 반면 분산 환경은 복수개의 머신에서 각 서버의 cpu 코어를 통해 다수개의 task들을 분산 병렬로 수행하게 됩니다. 결국 우리가 작성하여 실행하는 spark 어플리케이션은 하나의 드라이브 프로그램과 복수개의 Executor들로 구성되어 실행됩니다. 각각의 Executor들은 드라이브가 할당한 task들을 병렬로 실행하고 그 결과를 드라이브에게 전달합니다. spark 어플리케이션을 로컬환경에서 실행하면 익스큐트 프로그램은 별도로 실행되지 않고 드라이버 프로그램의 프로세스 내에서 로컬 스레드로 실행됩니다. 스팍 어플리케이션을 분산환경에서 실행하면 익스큐트 프로그램은 클러스터 매니저가 할당해준 서버들 위에서 각각 별도의 프로세스로 실행된다.</p>
</blockquote>
<h3 id="submitting-applications-on-cluster">Submitting Applications on Cluster</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/7e5e8545-5637-4eac-8044-84bc355c77e9/image.png" alt=""></p>
<blockquote>
<ol>
<li>프로그램을 제출하면 Spark Context가 클러스터 관리자에 연결됩니다.</li>
<li>연결되면 스파크는 클러스터의 노드에서 실행자와 함께 할당됩니다.</li>
<li>애플리케이션 코드(JAR에 의해 정의되거나 SparkContext에 전달된 Python 파일에 의해 정의됨)를 실행자에게 보냅니다. 그런 다음 SparkContext는 실행자가 실행하고 결과를 반환할 수 있도록 작업을 전송합니다.</li>
</ol>
</blockquote>
<h2 id="spark-개요-spark-programming-model">Spark 개요 (Spark Programming Model)</h2>
<h3 id="spark-programming-model---sparkcontext">Spark Programming Model - SparkContext</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/d058e8e9-c36a-4ece-aa80-836e9e3dd354/image.png" alt=""></p>
<blockquote>
<p>SparkContext는 클러스터 매니저에게 Executor 생성을 요청합니다. 실제 데이터를 읽고 처리하고 저장하는 것은 Executor의 타스크를 통해 이루어집니다. 데이터 캐시도 Executor의 메모리를 사용합니다.</p>
</blockquote>
<h3 id="spark-programming-model---rdd-12">Spark Programming Model - RDD (1/2)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c1d2eab4-ddbb-49bf-8f12-1121e9a8b36a/image.png" alt=""></p>
<blockquote>
<ul>
<li>로컬 컬렉션과 마찬가지로 분산 컬렉션 작업</li>
</ul>
</blockquote>
<ul>
<li>불변의 데이터 구조</li>
<li>인메모리(명시적으로)</li>
<li>내결함성</li>
<li>병렬 데이터 구조</li>
<li>데이터 배치를 최적화하기 위한 제어된 파티셔닝</li>
<li>풍부한 연산자 집합을 사용하여 조작할 수 있음</li>
</ul>
<h3 id="spark-programming-model---rdd-22">Spark Programming Model - RDD (2/2)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/375f470e-b39e-4775-99e7-61671d448d92/image.png" alt=""></p>
<blockquote>
<p>RDD가 제공하는 API는 크게 3가지가 있다. RDD에 담겨진 데이터의 변경을 위한 Transformations API, RDD에 담겨진 데이터를 드라이브에 가져오거나 외부 저장소에 저장하는 Actions API, 반복적으로 자주 사용될 것 같은 RDD를 성능 향상을 위헤 메모리나 디스크에 캐시하기 위한 Persistence API가 그 3가지 입니다.</p>
</blockquote>
<blockquote>
<p>Transformations : </p>
</blockquote>
<ul>
<li>기존 데이터 집합에서 새 데이터 집합을 만듭니다.</li>
<li>천성이 게으르다. 일부 작업이 수행될 때만 실행됩니다.</li>
</ul>
<blockquote>
<p>Actions :</p>
</blockquote>
<ul>
<li>계산을 수행한 후 dirver 프로그램으로 값을 반환하거나 데이터를 스토리지 시스템으로 내보냅니다.</li>
</ul>
<blockquote>
<p>Persistence : </p>
</blockquote>
<ul>
<li>향후 작업을 위해 데이터셋을 메모리에 캐슁하는 데 사용됩니다.</li>
<li>Disk 또는 RAM에 저장하거나 혼합(스토리지 수준)하는 옵션</li>
</ul>
<h2 id="spark-개요-rdd---lazy-evaluation--no-cachecache">Spark 개요 (RDD - Lazy Evaluation + No Cache/Cache)</h2>
<h3 id="rdd---lazy-evaluation--no-cache">RDD - Lazy Evaluation + No cache</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/95fdf614-54e1-493d-a812-3e392f6d6d2c/image.png" alt=""></p>
<blockquote>
<p>분석 클러스터는 마스터 서버 1대와 워크서버 3대로 구성되어 있습니다.</p>
</blockquote>
<h3 id="rdd---lazy-evaluation--cache">RDD - Lazy Evaluation + Cache</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/f7725e1b-2759-4143-bb47-36b9ad4d78b1/image.png" alt=""></p>
<blockquote>
<p>동일 작업에 대해 메모리 캐시를 이용하면 1TB의 데이터에 대해서도 5~7초 사이에 결과를 확인할 수 있다고 한다. 반복적으로 사용되는 RDD에 대한 Cache는 성능 향상을 가져옵니다.</p>
</blockquote>
<h3 id="rdd---behavior-with-less-ram">RDD - Behavior with Less RAM</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/886cd0fb-a574-4bc2-9ae6-bcebf304a722/image.png" alt=""></p>
<blockquote>
<p>캐시는 RDD에 파티션 단위로 처리됩니다. 하나의 파티션을 메모리에 모두 캐시하기에 충분한 메모리가 없다면 메모리에 일부 여유가 있더라도 파티션의 일부만 캐시하지 않습니다. 하나의 파티션 전체가 캐시되거나 캐시되지않거나 입니다. 캐시되지 않는 파티션의 데이터는 디스크의 저장된 원본파일로부터 다시 읽어서 연산을 수행합니다 .메모리에 여유가 생겨 해당 파티션을 캐시하기 전까지는 Action 수행시마다 캐시되지 않은 파티션의 데이터는 디스크로부터 반복적으로 다시 읽어와야 합니다. 당연히 캐시된 파티션이 많을수록 실행속도는 빨라질것입니다.</p>
</blockquote>
<h2 id="spark-개요-rdd---fault-tolerance">Spark 개요 (RDD - Fault Tolerance)</h2>
<h3 id="rdd---fault-tolerance">RDD - Fault Tolerance</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/f57729bf-c9ad-4861-998c-08adccc8bf60/image.png" alt=""></p>
<blockquote>
<p>Apache Spark은 특정 RDD가 만들어지기까지 수행된 일련의 트랜스포메이션 작업들을 추척하고 있습니다. 이를 Lineage라 부릅니다. RDD의 혈통을 기록한것이라고 생각하면 됩니다. 이는 손실된 데이터를 다시 계산하여 결함이 발생한 RDD를 복구하는데에 사용됩니다. 예를 들어 메시지 RDD의 Lineage는 HDFS에 있는 특정 경로에 데이터를 읽어와 에러 메세지만 필터링 하고 구분자로 사용된 탭으로 스플릿하여 인덱스 인 위치의 값을 추출한다는 일련의 변환작업이 기록되어 있습니다.</p>
</blockquote>
<h3 id="rdd---fault-recovery-test">RDD - Fault Recovery Test</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/7e0514bb-7ca1-4ee9-ab85-6c1084f86a46/image.png" alt=""></p>
<blockquote>
<p>첫번째 액션에서 실제 메모리에 캐시하는 작업이 이루어지기 때문에 실행시간이 조금 많이 걸립니다. 두번째 액션부터는 캐시된 데이터로 부터 연산이 시작되기 때문에 상대적으로 짧은 시간에 실행이 이루어집니다. 다섯번째 액션을 정상 실행한 후 장애가 발생합니다. 캐시된 데이터중 일부가 손실됩니다. 여섯번째 액션에서 손실되지 않은 캐시데이터는 정상적으로 사용됩니다. 손실된 일부 캐시데이터는 Lineage를 통해 처음부터 다시 재연산 됩니다. 이를 통해 캐시는 다시 100% 정상으로 복구됩니다. 이 과정에서 손실된 일부 데이터를 디스크에서 다시 읽어와 재연산하기에 시간이 다소 더 걸립니다. 하지만 대부분 정상적인 캐시를 사용하므로 첫번째 액션 수행보다는 짧은 시간안에 실행이 이루어집니다. 일곱번째 액션부터는 실행속도가 기존처럼 다시 빨라집니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022. 08. 16(화) Python 공부 12일차]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-16%ED%99%94-Python-%EA%B3%B5%EB%B6%80-12%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-16%ED%99%94-Python-%EA%B3%B5%EB%B6%80-12%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 16 Aug 2022 01:21:03 GMT</pubDate>
            <description><![CDATA[<h2 id="클래스-정의-및-사용하기">클래스 정의 및 사용하기</h2>
<h3 id="class란">class란?</h3>
<ul>
<li>실세계의 것을 모델링하여 속성(attribute)와 동작(method)를 갖는 데이터 타입</li>
<li>python에서의 string, int, list, dict... 모두가 다 클래스로 존재</li>
<li>예를들어 학생이라는 클래스를 만든다면, 학생을 나타내는 속성과 학생이 행하는 행동을 함께 정의 할 수 있음</li>
<li>따라서, 다루고자 하는 데이터(변수)와 데이터를 다루는 연산(함수)를 하나로 캡슐화(encapsulation)하여 클래스로 표현</li>
<li>모델링에서 중요시 하는 속성에 따라 클래스의 속성과 행동이 각각 달라짐<pre><code class="language-python">### class란?
</code></pre>
</li>
</ul>
<p>a = [1, 2, 3, 4]
a.append(5)
print(a)</p>
<pre><code>### object란?
- 클래스로 생성되어 구체화된 객체(인스턴스)
- 파이썬의 모든 것(int, str, list... etc)은 객체(인스턴스)
- 실제로 class가 인스턴스화 되어 메모리에 상주하는 상태를 의미
- class가 빵틀이라면, object는 실제로 빵틀로 찍어낸 빵이라고 비유 가능

### class 선언하기
- 객체를 생성하기 위해선 객체의 모체가 되는 class를 미리 선언해야 함
```python
### class 선언하기
class Person:
    pass


bob = Person()
cathy = Person()

a = list()
b = list()

print(type(bob), type(cathy))
print(type(a), type(b))
</code></pre><h2 id="생성자init의-이해-및-사용하기">생성자(<strong>init</strong>)의 이해 및 사용하기</h2>
<h3 id="_init_self">_<em>init_</em>(self)</h3>
<ul>
<li>생성자, 클래스 인스턴스가 생성될 떄 호출됨</li>
<li>self인자는 항상 첫번째에 오며 자기 자신을 가리킴</li>
<li>이름이 꼭 self일 필요는 없지만, 관례적으로 self로 사용</li>
<li>생성자에서는 해당 클래스가 다루는 데이터를 정의<ul>
<li>이 데이터를 멤버 변수(member variable) 또는 속성(attribute)라고 함<pre><code class="language-python">### __init__
</code></pre>
</li>
</ul>
</li>
</ul>
<p>class Person:
    def <strong>init</strong>(self):
        print(self, &#39;is generated&#39;)</p>
<p>p1 = Person()
p2 = Person()</p>
<h1 id="mainperson-object-at-0x000001c69924cfd0-is-generated">&lt;<strong>main</strong>.Person object at 0x000001C69924CFD0&gt; is generated</h1>
<h1 id="mainperson-object-at-0x000001c69924cf10-is-generated">&lt;<strong>main</strong>.Person object at 0x000001C69924CF10&gt; is generated</h1>
<p>class Person:
    def <strong>init</strong>(self, name, age=10):
        # print(self, &#39;is generated&#39;)
        self.name = name
        self.age = age</p>
<p>p1 = Person(&#39;Bob&#39;, 30)
p2 = Person(&#39;Kate&#39;, 20)
p3 = Person(&#39;Aaron&#39;)</p>
<p>print(p1.name, p1.age)
print(p2.name, p2.age)
print(p3.name, p3.age)</p>
<h1 id="bob-30">Bob 30</h1>
<h1 id="kate-20">Kate 20</h1>
<h1 id="aaron-10">Aaron 10</h1>
<pre><code>## self 키워드의 이해 및 사용하기

### self
- 파이썬의 method는 항상 첫번째 인자로 self를 전달
- self는 현재 해당 메소드가 호출되는 객체 자신을 가리킴
- C++ / C#, Java의 this에 해당
- 역시, 이름이 self일 필요는 없으나, 위치는 항상 맨 처음의 parameter이며 관례적으로 self로 사용
```python
### self

class Person:
    def __init__(self, name, age=10):
        print(&#39;self: &#39;, self)
        self.name = name
        self.age = age

    def sleep(self):
        print(&#39;self: &#39;, self)
        print(self.name, &#39;은 잠을 잡니다.&#39;)


a = Person(&#39;Bob&#39;, 30)
b = Person(&#39;Kate&#39;, 20)

print(a)
print(b)

a.sleep()
b.sleep()

# self:  &lt;__main__.Person object at 0x0000020AE3C3CEB0&gt;
# self:  &lt;__main__.Person object at 0x0000020AE3C3CDC0&gt;
# &lt;__main__.Person object at 0x0000020AE3C3CEB0&gt;
# &lt;__main__.Person object at 0x0000020AE3C3CDC0&gt;
# self:  &lt;__main__.Person object at 0x0000020AE3C3CEB0&gt;
# Bob 은 잠을 잡니다.
# self:  &lt;__main__.Person object at 0x0000020AE3C3CDC0&gt;
# Kate 은 잠을 잡니다.</code></pre><h2 id="method-static-method-정의-및-사용하기">method, static method 정의 및 사용하기</h2>
<h3 id="method-정의">method 정의</h3>
<ul>
<li>멤버함수라고도 하며, 해당 클래스의 obejct에서만 호출 가능</li>
<li>메소드는 객체 레벨에서 호출되며, 해당 객체의 속성에 대한 연산을 행함</li>
<li>{obj}.{method}() 형태로 호출됨<pre><code class="language-python">### method 정의
</code></pre>
</li>
</ul>
<h1 id="1-숫자를-하나-증가">1. 숫자를 하나 증가</h1>
<h1 id="2-숫자를-0으로-초기화">2. 숫자를 0으로 초기화</h1>
<p>class Counter:
    def <strong>init</strong>(self):
        self.num = 0</p>
<pre><code>def increment(self):
    self.num += 1

def reset(self):
    self.num = 0

def print_current_value(self):
    print(&#39;현재값은: &#39;, self.num)</code></pre><p>c1 = Counter()
c1.print_current_value()
c1.increment()
c1.increment()
c1.increment()
c1.print_current_value()</p>
<p>c1.reset()
c1.print_current_value()</p>
<h1 id="현재값은--0">현재값은:  0</h1>
<h1 id="현재값은--3">현재값은:  3</h1>
<h1 id="현재값은--0-1">현재값은:  0</h1>
<pre><code>
### method type
- instance method - 객체로 호출
  - 메소드는 객체 레벨로 호출 되기 때문에, 해당 메소드를 호출한 객체에만 영향을 미침
- class method(static method) - class로 호출
  - 클래스 메소드의 경우, 클래스 레벨로 호출되기 때문에, 클래스 멤버 변수만 변경 가능
```python
### method type
class Math:
    @staticmethod
    def add(a, b):
        return a + b

    @staticmethod
    def multiply(a, b):
        return a * b


print(Math.add(10, 20))
print(Math.multiply(10, 20))

# 30
# 200</code></pre><h2 id="클래스-상속의-이해-코드를-재사용하기2">클래스 상속의 이해 (코드를 재사용하기2)</h2>
<h3 id="class-inheritance상속">Class Inheritance(상속)</h3>
<ul>
<li>기존에 정의해둔 클래스의 기능을 그대로 물려받을 수 있다.</li>
<li>기존 클래스에 기능 일부를 추가하거나, 변경하여 새로운 클래스를 정의한다.</li>
<li>코드를 재사용할 수 있게된다.</li>
<li>상속 받고자 하는 대상인 기존 클래스는 (Parent, Super, Base class라고 부른다.)</li>
<li>상속 받는 새로운 클래스는(Child, Sub, Derived class 라고 부른다)</li>
<li>의미적으로 is - a 관계를 갖는다.<pre><code class="language-python">### Class Inheritance(상속)
</code></pre>
</li>
</ul>
<p>class Person:
    def <strong>init</strong>(self, name, age):
        self.name = name
        self.age = age</p>
<pre><code>def eat(self, food):
    print(&#39;{}은 {}를 먹습니다&#39;.format(self.name, food))

def sleep(self, minute):
    print(&#39;{}은 {}분동안 잡니다&#39;.format(self.name, minute))

def work(self, minute):
    print(&#39;{}은 {}분동안 일합니다&#39;.format(self.name, minute))</code></pre><p>class Student(Person):
    def <strong>init</strong>(self, name, age):
        self.name = name
        self.age = age</p>
<h1 id="employee부모클래스">Employee(부모클래스)</h1>
<p>class Employee(Person):
    def <strong>init</strong>(self, name, age):
        self.name = name
        self.age = age</p>
<p>bob = Student(&#39;Bob&#39;, 25)
bob.eat(&#39;BBQ&#39;)
bob.sleep(30)
bob.work(60)</p>
<h1 id="bob은-bbq를-먹습니다">Bob은 BBQ를 먹습니다</h1>
<h1 id="bob은-30분동안-잡니다">Bob은 30분동안 잡니다</h1>
<h1 id="bob은-60분동안-일합니다">Bob은 60분동안 일합니다</h1>
<pre><code>
### method override
- 부모 클래스의 method를 재정의(override)
- 하위 클래스(자식 클래스)의 인스턴스로 호출시, 재정의된 메소드가 호출됨
```python
### method override

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self, food):
        print(&#39;{}은 {}를 먹습니다&#39;.format(self.name, food))

    def sleep(self, minute):
        print(&#39;{}은 {}분동안 잡니다&#39;.format(self.name, minute))

    def work(self, minute):
        print(&#39;{}은 {}분동안 일합니다&#39;.format(self.name, minute))


class Student(Person):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def work(self, minute):
        print(&#39;{}은 {}분동안 공부합니다&#39;.format(self.name, minute))

# Employee(부모클래스)
class Employee(Person):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def work(self, minute):
        print(&#39;{}은 {}분동안 업무를 합니다&#39;.format(self.name, minute))


bob = Student(&#39;Bob&#39;, 25)
bob.eat(&#39;BBQ&#39;)
bob.sleep(30)
bob.work(60)

bob = Employee(&#39;Bob&#39;, 25)
bob.eat(&#39;BBQ&#39;)
bob.sleep(30)
bob.work(60)

# Bob은 BBQ를 먹습니다
# Bob은 30분동안 잡니다
# Bob은 60분동안 공부합니다

# Bob은 BBQ를 먹습니다
# Bob은 30분동안 잡니다
# Bob은 60분동안 업무를 합니다</code></pre><h3 id="super">super</h3>
<ul>
<li>하위클래스(자식 클래스)에서 부모클래스의 method를 호출할 때 사용<pre><code class="language-python">### super
</code></pre>
</li>
</ul>
<p>class Person:
    def <strong>init</strong>(self, name, age):
        self.name = name
        self.age = age</p>
<pre><code>def eat(self, food):
    print(&#39;{}은 {}를 먹습니다&#39;.format(self.name, food))

def sleep(self, minute):
    print(&#39;{}은 {}분동안 잡니다&#39;.format(self.name, minute))

def work(self, minute):
    print(&#39;{}은 {}분동안 준비를 합니다.&#39;.format(self.name, minute))</code></pre><p>class Student(Person):
    def <strong>init</strong>(self, name, age):
        self.name = name
        self.age = age</p>
<pre><code>def work(self, minute):
    super().work(minute)
    print(&#39;{}은 {}분동안 공부합니다&#39;.format(self.name, minute))</code></pre><h1 id="employee부모클래스-1">Employee(부모클래스)</h1>
<p>class Employee(Person):
    def <strong>init</strong>(self, name, age):
        self.name = name
        self.age = age</p>
<pre><code>def work(self, minute):
    super().work(minute)
    print(&#39;{}은 {}분동안 업무를 합니다&#39;.format(self.name, minute))</code></pre><p>bob = Employee(&#39;Bob&#39;, 25)
bob.eat(&#39;BBQ&#39;)
bob.sleep(30)
bob.work(60)</p>
<h1 id="bob은-bbq를-먹습니다-1">Bob은 BBQ를 먹습니다</h1>
<h1 id="bob은-30분동안-잡니다-1">Bob은 30분동안 잡니다</h1>
<h1 id="bob은-60분동안-준비를-합니다">Bob은 60분동안 준비를 합니다.</h1>
<h1 id="bob은-60분동안-업무를-합니다">Bob은 60분동안 업무를 합니다</h1>
<p>```</p>
<h2 id="다음시간에">다음시간에</h2>
<h3 id="special-method">special method</h3>
<ul>
<li>__로 시작 __로 끝나는 특수 함수</li>
<li>해당 메소드들을 구현하면, 커스텀 객체에 여러가지 파이썬 내장 함수나 연산자를 적용 가능</li>
<li>오버라이딩 가능한 함수 목록은 아래 링크에서 참조</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[모두를 위한 딥러닝 - ML Lec 12]]></title>
            <link>https://velog.io/@eastgun_/%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D-ML-Lec-12</link>
            <guid>https://velog.io/@eastgun_/%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D-ML-Lec-12</guid>
            <pubDate>Mon, 08 Aug 2022 04:54:19 GMT</pubDate>
            <description><![CDATA[<h2 id="lec12-nn의-꽃-rnn-이야기">lec12: NN의 꽃 RNN 이야기</h2>
<h3 id="sequence-data">Sequence data</h3>
<ul>
<li>We don&#39;t understand one word only</li>
<li>We understand based on the previous words + this word. (time series)</li>
<li>NN/CNN cannot do this</li>
</ul>
<blockquote>
<p>우리가 사용하는 데이터중에서는 시퀀스 데이터들이 많이 있다. 음성인식이라던지 우리가 말하는 자연어를 보면 이게 하나의 데이터가 아니라 시퀀스로 되어있다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/7889c0a4-07ae-4b1c-a8cc-6233030097cc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/ba47cdf4-01b3-40a0-90a5-9eacc2e42cee/image.png" alt=""></p>
<blockquote>
<p>h는 y로 이해하길 바람.
이전에 계산한 State가 다음 계산에 영향을 미친다.</p>
</blockquote>
<h3 id="recurrent-nurial-network">Recurrent Nurial Network</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/34704e43-6132-4700-81fe-551298b603a0/image.png" alt=""></p>
<blockquote>
<p>RNN은 수행해서 Y값을 뽑아내게 되는데 어떻게 계산하는 걸까요?</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/926bec0f-2d28-4daa-9eef-ebd46a4264a2/image.png" alt=""></p>
<blockquote>
<p>new State를 계산하는데 중요한것은 이전의 state(old State)가 입력으로 사용이 된다. X라는 입력값과 old State을 가지고 어떤 함수를 이용해서 계산을 한다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/d103a33e-341f-4f1d-89a6-1970fb0a25d5/image.png" alt=""></p>
<blockquote>
<p>주어진 function이 모든 RNN에서 동일하다</p>
</blockquote>
<h3 id="vanilla-recurrent-neural-network">(Vanilla) Recurrent Neural Network</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/10910bf1-30b7-4e0a-b517-84fcd44d1a15/image.png" alt=""></p>
<blockquote>
<p>기초적인 RNN 연산 방법</p>
</blockquote>
<h3 id="character-level-language-model-example">Character-level language model example</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/67a678c7-7f4f-4caf-8db1-4bbb953b5710/image.png" alt=""></p>
<blockquote>
<p>다음에 오는 글자를 예측하는 시스템을 language model</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/2b8a475f-74e5-4146-8d66-916144f41438/image.png" alt=""></p>
<blockquote>
<p>벡터로 표현하는 방법은 여러가지가 있는데 그 중 쉬운 방법은 One-hot Encoding</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/94e057c3-7c48-4361-a947-05fd13d133c7/image.png" alt=""></p>
<blockquote>
<p>첫번째 hidden layer에는 이전 state 값이 없으니까 0으로 준다.
어떻게 보면 RNN이라는 것은 이전의 것들을 기억한다라는 의미가 있다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/22f24107-477e-42d4-8f67-f9184ff0ad72/image.png" alt=""></p>
<blockquote>
<p>Y를 구하는 식</p>
</blockquote>
<h3 id="rnn-applications">RNN applications</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/bced25f1-54ef-4180-9e38-6bbc7f137f3a/image.png" alt=""></p>
<blockquote>
<p>활용하는 방법이 굉장히 다양하다.
다음 단어를 예측하는 Language Modeling</p>
</blockquote>
<h3 id="recurrent-networks-offer-a-lot-of-flexibility">Recurrent Networks offer a lot of flexibility</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/6292241f-300d-4775-b41b-23fc215a9fd6/image.png" alt=""></p>
<blockquote>
<p>RNN을 가지고 여러가지 형태를 구성할 수 있따.
Image Captioning :  sequence of words
Sentiment Classification : many to one
Maching Translation : many to many
Video classification on frame level : many to many</p>
</blockquote>
<h3 id="multi-layer-rnn">Multi-Layer RNN</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/7c37cf27-fd51-4665-bee8-51060ea00719/image.png" alt=""></p>
<blockquote>
<p>layer도 하나만 줄 수 있지만 여러개도 줄 수 있어서 더 복잡한 학습이 가능하다.</p>
</blockquote>
<h3 id="training-rnns-is-challenging">Training RNNs is challenging</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/2be714cb-cf54-4aa5-a9cd-d4d75bf65907/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022. 08. 08(월) Spark & Hadoop 초격차 11일차]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-08%EC%9B%94-Spark-Hadoop-%EC%B4%88%EA%B2%A9%EC%B0%A8-11%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-08%EC%9B%94-Spark-Hadoop-%EC%B4%88%EA%B2%A9%EC%B0%A8-11%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 08 Aug 2022 01:55:18 GMT</pubDate>
            <description><![CDATA[<h1 id="apache-spark-기초">Apache Spark 기초</h1>
<h2 id="spark-개요-소개-특징-rdd">Spark 개요 (소개, 특징, RDD)</h2>
<h3 id="apache-spark">Apache Spark</h3>
<ul>
<li>Unified Engine : Support end-toend applications</li>
<li>High-level APIs : Easy to use, rich optimizations</li>
<li>Integrate Broadly : Storage systems, libraries, etc</li>
</ul>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/8bf391b1-2b4f-4750-9158-419c9b093071/image.png" alt=""></p>
<blockquote>
<p>아파치 Spark은 빅데이터에 대한 컴퓨터 연산을 다수의 서버로 구성된 클러스터에서 분산 병렬처리하기 위한 오픈소스 엔진이다.</p>
</blockquote>
<blockquote>
<p>일반적으로 데이터를 모아서 일괄처리하는 배치작업부터 구조화된 데이터에 대한 처리를 수행하는 SQL 작업, IOT 센서데이터와 같은 지속적으로 들어오는 실시간 데이터를 스토리지에 저장 없이 바로 처리하는 스트리밍 작업, 분산 환경에서의 대용량 학습 데이터를 통한 머신러닝 트레이닝 및 추론 작업, 그리고 버택스 엣지 구조?의 그래프 데이터에 대한 병렬 연산과 같이 다양한 작업을 개별 엔진이 아닌 하나의 엔진에서 처리할 수 있는 통합 데이터 처리 엔진이다.</p>
</blockquote>
<blockquote>
<p>Spark은 저장소가 아니다. 외부의 데이터를 읽어 분산 환경에서 원하는 형태로 데이터를 처리한 후 그 결과를 다시 외부에 저장하는 컴퓨팅 엔진이다.</p>
</blockquote>
<h3 id="apache-spark란-12">Apache Spark란? (1/2)</h3>
<ul>
<li>Apache Spark는 대용량 데이터 프로세싱을 위한 빠르고 범용적인 인메모리 기반 클러스터 컴퓨팅 엔진</li>
<li>분산 메모리 기반의 빠른 분산 병렬 처리</li>
<li>배치, 대화형 쿼리, 스트리밍, 머신러닝과 같은 다양한 작업 타입을 지원하는 범용 엔진으로 Apache Hadoop과 호환</li>
<li>Scala, Java, Python, R 기반 High-level APIs 제공</li>
</ul>
<h3 id="apache-spark란-22">Apache Spark란? (2/2)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c7200b6e-0699-45f6-afae-1db9a5095ade/image.png" alt=""></p>
<blockquote>
<p>Spark은 클러스터 환경에서 분산 병렬 연산이 가능하도록 설계되어 있다.
클러스터 매니저가 별도로 존재한다. ex) Hadoop YARN, apache Mesos, Kubernetes
Spark Core는 분산 병렬 연산을 위한 작업 스케쥴 및 오류 발생시에도 문제없이 연산을 지속할 수 있는 폴트 토로론스?와 같은 다양한 핵심 기능 제공</p>
</blockquote>
<blockquote>
<p>이와 더불어 Spark의 기본데이터 모델인 RDD를 기반으로 데이터 연산을 분산 병렬로 처리합니다. Spark Core에서 다양한 확장 라이브러리가 동작한다. Spark SQL, Spart Streaming , MLlib, GraphX</p>
</blockquote>
<blockquote>
<p>기존 R과 Python 환경에서 Spark를 사용하기 위한 추가 패키지형태의 SparkR, Pyspark도 같이 제공</p>
</blockquote>
<blockquote>
<p>오픈소스 spark 커뮤니티는 글로벌하게 활동하고 있다. spark 공식 배포판에 없는 기능들은 별도의 공개된 비공식 패키지로 확장 가능하다.</p>
</blockquote>
<h3 id="apache-spark-특징-12">Apache Spark 특징 (1/2)</h3>
<ul>
<li>In-Memory 컴퓨팅 (물론 Disk 기반도 가능)</li>
<li>RDD (Resilient Distributed Dataset) 데이터 모델</li>
<li>다양한 개발 언어 지원 (Scala, Java, Python, R, SQL)</li>
<li>Rich APIs 제공 (80여개 이상, 2 ~ 10x Less Code)</li>
<li>General execution graphs =&gt; DAG (Directed Acyclic Graph) =&gt; Multiple stages of map &amp; reduce</li>
<li>Hadoop과의 유연한 연계 (HDFS, HBase, YARN and Others)</li>
</ul>
<blockquote>
<p>여러 단계의 Map&amp;Reduce 작업을 워크플로우 형태로 연달아 이어서 처리 할 수 있다. 이러한 연속된 작업은 DAG 형태로 관리되며 Spark 내부에서 최적화되어 수행된다.</p>
</blockquote>
<h3 id="apache-spark-특징-22">Apache Spark 특징 (2/2)</h3>
<ul>
<li>빠른 데이터 Processiong (In-Memory Cached RDD, Up to 100x Faster)</li>
<li>대화형 질의를 위한 Interactive Shell (Scala, Python, R Interpreter)</li>
<li>실시간(Real-time) Stream Processing (vs. MapReduce for stored Data)</li>
<li>하나의 애플리케이션에서 배치, SQL 쿼리, 스트리밍, 머신러닝과 같은 다양한 작업을 하나의 워크플로우로 결합 가능</li>
<li>Both fast to write and fast to run</li>
</ul>
<h3 id="rdd-resilient-distributed-dataset-12">RDD (resilient Distributed Dataset) (1/2)</h3>
<ul>
<li>Dataset<ul>
<li>메모리나 디스크에 분산 저장된 변경 불가능한 데이터 객체들의 모음</li>
</ul>
</li>
<li>Distributed<ul>
<li>RDD에 있는 데이터는 클러스터에 자동 분배 및 병렬 연산 수행</li>
</ul>
</li>
<li>Resilient<ul>
<li>클러스터의 한 노드가 실패하더라도 다른 노드가 작업 처리 (RDD Lineage, Automatically rebuilt on failure)</li>
</ul>
</li>
</ul>
<blockquote>
<p>RDD는 실패에 강한 즉, 데이터 처리 과정중 실패로부터 쉽게 회복 가능한 분산 데이터 셋 구조를 추상한 모델입니다.</p>
</blockquote>
<h3 id="rdd-resilient-distributed-dataset-22">RDD (resilient Distributed Dataset) (2/2)</h3>
<ul>
<li><strong>Immutable</strong><ul>
<li>RDD는 수정이 안됨. 변형을 통한 새로운 RDD 생성</li>
</ul>
</li>
<li><strong>Operation APIs</strong><ul>
<li><strong>Transformations</strong> (데이터 변형, e.g. map, filter, groupBy, join)</li>
<li><strong>Actions</strong> (결과연산 리턴 / 저장, e.g. count, collect, save)</li>
</ul>
</li>
<li><strong>Lazy Evaluation</strong> : All Transformations (Action 실행 때까지)</li>
<li><strong>Controllable Persistence</strong><ul>
<li>Cache in RAM / Disk 가능 (반복 연산에 유리)</li>
</ul>
</li>
</ul>
<blockquote>
<p>RDD가 제공하는 API는 크게 3가지로 나뉩니다. Cache 관련 API와 RDD 내의 데이터를 변형하는 API를 Transformations API, RDD 내의 데이터를 가져오거나 외부의 저장하는 등의 API를 Action API로 나뉩니다.</p>
</blockquote>
<h3 id="rdd-생성---rdd-변형---rdd-연산">RDD 생성 -&gt; RDD 변형 -&gt; RDD 연산</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/94ac0b87-0bec-4855-851b-834975ca3600/image.png" alt=""></p>
<blockquote>
<p>외부 데이터를 읽어 RDD에 담는다. 외부 데이터를 읽을 때 부터 분산 병렬로 읽게된다</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/acd93a51-1003-47d5-abf8-28951e21d82f/image.png" alt=""></p>
<blockquote>
<p>원하는 형태의 데이터가 될 때 까지 RDD Transformations을 반복 수행한다. 
Transformations은 기존 RDD 내용을 바꾸는 것이 아니라 바뀌어진 새로운 RDD를 생성한다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/d36bba35-f89e-48b1-8166-17b9cff57305/image.png" alt=""></p>
<blockquote>
<p>Transformations 작업을 계속 반복 수행 합니다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/947b2583-0928-4e9a-b623-e258397e7bd6/image.png" alt=""></p>
<blockquote>
<p>Transformations을 한번 더 수행하면 최종 원하는 모습의 데이터를 가지는 RDD를 얻게 됩니다</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/33e1b01f-fd3b-43dd-af16-d3158bd04469/image.png" alt=""></p>
<blockquote>
<p>최종 RDD에 원하는 Action을 수행합니다. 데이터가 몇건 있는지 살펴 볼까요</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/285e0413-1ef7-4521-95b6-e459fc2e123c/image.png" alt=""></p>
<blockquote>
<p>이번에는 원하는 데이터를 배열로 다 가져와 봅시다. 이 때 드라이브로 가져오는 데이터의 크기가 너무 크다면 메모리가 부족해서 Out of Memory 즉 OM 예외가 발생할 수도 있다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/69d5f273-5078-4f9a-9009-394e9c3b5e36/image.png" alt=""></p>
<blockquote>
<p>마지막으로 원하는 데이터를 향후 분석을 위해 외부 저장소에 저장합니다. 저장 작업도 RDD 내 파티션 단위로 병렬 처리되어 개별 파일로 저장이 됩니다.</p>
</blockquote>
<h2 id="spark-개요-지원-언어-interactive-shell">Spark 개요 (지원 언어, Interactive Shell)</h2>
<h3 id="spark-language-support">Spark Language Support</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/ce4cafcd-f1c1-4ce3-938b-677731b8bef6/image.png" alt=""></p>
<blockquote>
<p>원하는 언어의 API를 이용하여 Spark Application을 개발해 독립적으로 실행 할 수 있다.</p>
</blockquote>
<h3 id="interactive-shell">Interactive Shell</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/b56d9723-5b84-4d09-a9a1-28db017e9fd5/image.png" alt=""></p>
<blockquote>
<p>Spark이 제공하는 대화형 Shell을 통해서 Spark을 배우는 입문 초기에 Spark의 다양한 기능을 보다 쉽게 직접 테스트해보고 경험 해볼수 있습니다.
Spark의 Interactive Shell은 로컬 실행 뿐만 아니라 Spark이 지원하는 다양한 클러스터 매니저에 연결하여 클러스터 내의 분산수행도 가능합니다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/093ec684-fc39-4b8b-b939-9b10bd514c2c/image.png" alt=""></p>
<blockquote>
<p>Spark이 지원하는 여러 언어 중 Scala로 spark api를 사용할 수 있는 대화형 쉘인 Spark Shell 이다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/936cf0b0-690f-4359-b88d-8f8078aca510/image.png" alt=""></p>
<blockquote>
<p>Python으로 Spark API를 사용할 수 있는 대화형 쉘인 pyspark 이다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/8a3837a0-4d23-4b86-b5d4-3ccde298f9c3/image.png" alt=""></p>
<blockquote>
<p>R로 Spark API를 사용할 수 있는 대화형 쉘인 SparkR 이다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/029c97bf-f886-41c7-bab9-11ecf93e9770/image.png" alt=""></p>
<blockquote>
<p>SQL 쿼리를 위한 대화형 쉘인 Spark Sql 이다.</p>
</blockquote>
<h2 id="spark-개요-web-notebook-zeppelin--jupyter--rstudio">Spark 개요 (Web Notebook, Zeppelin / Jupyter / RStudio)</h2>
<h3 id="web-notebook">Web Notebook</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c115afd3-3003-465d-aed2-af1ec03dc99f/image.png" alt=""></p>
<blockquote>
<p>웹 기반 노트북은 대화형 분석이 가능하고 작성한 코드를 저장할 수 있으며 언어별 차트 라이브러리 및 노트북 자체 차트 기능을 통해 분석한 내용에 대해 시각화가 가능합니다</p>
</blockquote>
<h3 id="web-notebook-w-spark">Web Notebook (w/ Spark)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/e8519f23-71bb-4f05-a4bf-027b91a3cae3/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>Apache Zeppelin은 하나의 노트에서 여러 클러스터에 접근 가능합니다. 
Apache Zeppelin은 하나의 노트에서 여러 언어로 Spark Code를 작성할 수 있습니다. 
Apache Zeppelin은 하나의 노트에서 Spark 위의 다른 Shell도 실행 가능합니다.</p>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/56cc90ba-dcf2-445d-8d26-eaff827568dc/image.png" alt=""></p>
<blockquote>
<p>Jupyter Notebook은 주로 파이썬 기반 웹 노트북으로 많이 사용하고 있다
파이썬 언어로 spark 사용할 경우 익숙한 환경을 제공한다.
spark 연동 시 노트 하나가 하나의 Spark application이 됩니다</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/2507c50b-0a8c-4fd4-82d0-c58880c6f66e/image.png" alt=""></p>
<blockquote>
<p>RStudio는 설치형 R Studio환경을 웹 브라우저에서도 경험 할수 있게 해주는 웹 기반 노트 환경을 제공합니다.</p>
</blockquote>
<h2 id="spark-개요-web-ui-driver--cluster-manager">Spark 개요 (Web UI, Driver / Cluster Manager)</h2>
<h3 id="administrative-web-uis">Administrative Web UIs</h3>
<ul>
<li>Driver (Spark Application)</li>
<li>History Server</li>
<li>Cluster Manager (Cluster Resource Manager)</li>
</ul>
<h3 id="driver-spark-application-web-ui">Driver (Spark Application) Web UI</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/adedc434-f6be-4586-b165-d80aac30cf74/image.png" alt=""></p>
<blockquote>
<p>Spark Context가 제공하는 UI
Web UI의 Default port는 4040, 만약 사용중이라면 포트 번호를 1씩 증가시키면서 할당한다.</p>
</blockquote>
<h3 id="history-server-web-ui">History Server Web UI</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/74463e51-7681-4447-8cf5-6b6b8286b71e/image.png" alt=""></p>
<blockquote>
<p>이미 실행이 끝난 Spark Applicaiton의 실행내역을 볼 순 없을까요?
Spark Applicaiton 실행 시 수행한 이벤트를 어딘가에 기록 한다면 볼 수 있다.</p>
</blockquote>
<h3 id="spark-standalone-web-ui">Spark Standalone Web UI</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/96436994-1135-4bac-bcb4-607ad3b6e1eb/image.png" alt=""></p>
<blockquote>
<p>Spark 배포판 내부에 기본적으로 포함되어 있다.
빠르고 가벼운 Spark Application 전용 클러스터 매니저가 필요하다면 Spark Standalone 클러스터 매니저를 실행시키면 된다. </p>
</blockquote>
<h3 id="hadoop-yarn-web-ui">Hadoop YARN Web UI</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/76b6146c-0344-40a2-9134-6eff42264e81/image.png" alt=""></p>
<blockquote>
<p>hadoop mapReduce 뿐만 아니라 클러스터 환경에서 구동 가능한 다양한 Application 플랫폼을 지원합니다. Spark을 포함하여 Hive, HBase, Presto, Flink 등이 있다</p>
</blockquote>
<h2 id="spark-개요-spark-vs-mapreduce">Spark 개요 (Spark vs. MapReduce)</h2>
<h3 id="hadoop---on-disk--limitations">Hadoop - on Disk .... Limitations</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/46f73cb5-82d0-491e-993d-3f344ddc1def/image.png" alt=""></p>
<blockquote>
<p>맵리듀스는 기본적으로 HDFS에서 데이터를 읽어 연산 처리 후 그 결과를 다시 HDFS에 기록합니다. 데이터 연산은 Map 과 Reduce 라는 2개의 스테이지로 구분되어 처리됩니다. 필요한 데이터 처리를 위해 이러한 Map과 Reduce작업을 반복하게 됩니다. 데이터 처리 결과를 HDFS에 Write할때 데이터는 복제되고 직렬화 되며 기본적인 Disk IO가 발생하기에 다소 느린편이다.
머신러닝, 그래프, 네트워크 분석과 같은 반복적인 연산을 필요로 하는 알고리즘을 처리하는데 있어서는 HDFS에서 데이터를 읽고 쓰는 MapReduce 작업을 반복해야 하기에 다소 비효율적인 처리방식이라 볼 수 있다.
대화영 데이터 마이닝 작업에도 그리 효율적이지 않다.</p>
</blockquote>
<h3 id="spark---solutions--in-memory--dag-">Spark - Solutions ? In Memory + DAG ...</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/60e5aef9-a926-4290-9268-ca8e3d56fc0e/image.png" alt=""></p>
<blockquote>
<p>Spark은 반복적으로 사용하게 될 데이터를 메모리에 캐시 하여 디스크보다 빠르게 재사용할 수 있음. 디스크보다 10 ~ 100배정도 더 빠르다고 말함(참고용)
Spark은 데이터를 처리하는 방식도 Map과 Reduce라는 2개의 스테이지로 얽메이지 않음.
flatMap, filter, map, reduceByKey 다양한 상위레벨 API를 체인과 같이 연속적으로 사용하여 원하는 만큼 데이터에 대한 연산을 처리할 수 있다.</p>
</blockquote>
<h3 id="spark-vs-hadoop---speed-13">Spark vs Hadoop - Speed (1/3)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/610025c3-dd9a-4533-bfa1-d57d0ac16dc6/image.png" alt=""></p>
<h3 id="spark-vs-hadoop---speed-23">Spark vs Hadoop - Speed (2/3)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/4158c430-eaf2-4272-b2df-d9c017349684/image.png" alt=""></p>
<h3 id="spark-vs-hadoop---speed-33">Spark vs Hadoop - Speed (3/3)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c0dae1bd-348b-4574-9545-21206ca91012/image.png" alt=""></p>
<h3 id="spark-vs-hadoop---ease-of-use-12">Spark vs Hadoop - Ease of Use (1/2)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/e9b0a445-d0c7-41c6-bd67-b4b893506430/image.png" alt=""></p>
<blockquote>
<p>Hadoop MapReduce는 자바 언어를 이용하여 객체지향 방식의 코드로 작성해야한다. 
Spark은 Scala, Java, Python, R과 같은 언어 기반으로 Spark이 제공하는 다양한 API를 사용하여 함수형 방식으로 코드를 작성하기에 상당히 간결한 코드를 유지할 수 있다.</p>
</blockquote>
<h3 id="spark-vs-hadoop---ease-of-use-22">Spark vs Hadoop - Ease of Use (2/2)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/e1b01eb2-6617-49a2-8f6c-67a028284feb/image.png" alt=""></p>
<blockquote>
<p>Spark은 기본적인 MapRduce를 포함하여 filter, group, join, sort 등 80여기 이상 다양한 연산을 위한 상위레벨 API를 통해 상대적으로 더 적은 노력만으로 원하는 데이터처리 코드를 보다 쉽게 작성 할 수 있다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022. 08. 08(월) Python 공부 11일차]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-08%EC%9B%94-Python-%EA%B3%B5%EB%B6%80-11%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-08%EC%9B%94-Python-%EA%B3%B5%EB%B6%80-11%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 08 Aug 2022 01:20:24 GMT</pubDate>
            <description><![CDATA[<h2 id="함수의-이해-및-사용-lambda-함수의-이해">함수의 이해 및 사용 (Lambda 함수의 이해)</h2>
<h3 id="lambda-함수-이해-및-사용">Lambda 함수 이해 및 사용</h3>
<ul>
<li><strong>Lambda 함수</strong><ul>
<li>단일문으로 표현되는 익명 함수</li>
<li>익명함수란 이름이 없는 구현체만 존재하는 간단한 함수를 의미</li>
<li>코드 상에서 한번만 사용되는 기능이 있을 때, 굳이 함수로 만들지 않고 1회성으로 만들어서 쓸 때 사용<pre><code class="language-python">#### Lambda 함수
</code></pre>
</li>
</ul>
</li>
</ul>
<h1 id="이-함수를-한-줄로-쓰는게-lambda-함수이다-중요한건-return을-쓰면-안된다">이 함수를 한 줄로 쓰는게 Lambda 함수이다. 중요한건 return을 쓰면 안된다.</h1>
<p>def square2(x):
    return x ** 2</p>
<p>square = lambda x: x ** 2
print(square(5))  # 25</p>
<h1 id="파라미터가-2개-일-때">파라미터가 2개 일 때</h1>
<p>def add(x, y):
    return x + y</p>
<p>add2 = lambda x, y: x + y
print(add2(10, 20))  # 30</p>
<h1 id="문자열-길이에-따라-정렬하고-싶을-때">문자열 길이에 따라 정렬하고 싶을 때</h1>
<p>def str_len(s):
    return len(s)</p>
<p>strings = [&#39;bob&#39;, &#39;charles&#39;, &#39;alexander3&#39;, &#39;teddy&#39;]</p>
<h1 id="기본적인-sort는-알파벳순서로-정렬을-하는데-key-파라미터를-이용하면-원하는-형태로-정렬이-가능하다">기본적인 sort는 알파벳순서로 정렬을 하는데 key 파라미터를 이용하면 원하는 형태로 정렬이 가능하다.</h1>
<h1 id="stringssortkeystr_len">strings.sort(key=str_len)</h1>
<h1 id="함수를-생성해서-파라미터로-넣어도-되지만-람다함수를-이용하면-바로-간단하게-넣을-수-있다">함수를 생성해서 파라미터로 넣어도 되지만 람다함수를 이용하면 바로 간단하게 넣을 수 있다.</h1>
<p>strings.sort(key=lambda s: len(s))</p>
<p>print(strings)</p>
<pre><code>
#### filter, map, reduce
  - lambda가 유용하게 사용되는 3가지 대표적 함수
  - 함수형 프로그래밍의 기본 요소이기도 함
  - filter : 특정 조건을 만족하는 요소만 남기고 필터링
  - map : 각 원소를 주어진 수식에 따라 변형하여 새로운 리스트를 반환
  - reduce : 차례대로 앞 2개의 원소를 가지고 연산. 연산의 결과가 또 다음 연산의 입력으로 진행됨. 따라서 마지막까지 진행되면 최종 출력은 한개의 값만 남게 됨.
```python
#### filter, map, reduce
# filter(함수, 리스트)
def even(n):
    return n % 2 == 0


nums = [1, 2, 3, 6, 8, 9, 10, 11, 13, 15]

# print(list(filter(even, nums)))  # [2, 6, 8, 10] ## 람다 함수를 안썼을 때
print(list(filter(lambda n: n % 2 == 0, nums)))  # [2, 6, 8, 10]

# map(함수, 리스트)
# 주어진 리스트, 리스트의 제곱을 한 숫자로 새로운 리스트
nums = [1, 2, 3, 6, 8, 9, 10, 11, 13, 15]
print(list(map(lambda n: n ** 2, nums)))  # [1, 4, 9, 36, 64, 81, 100, 121, 169, 225]

# reduce

import functools

# functools.reduce(함수, 리스트)
a = [1, 3, 5, 8]

print(functools.reduce(lambda x, y: x + y, a))  # 리스트 내의 모든 수의 합 # 17
print(functools.reduce(lambda x, y: x * y, a))  # 리스트 내의 모든 수의 곱 # 120</code></pre><h3 id="함수-연습문제">함수 연습문제</h3>
<ul>
<li><ol>
<li>주어진 숫자 리스트의 평균을 구하는 함수를 출력하시오</li>
</ol>
</li>
<li><ol start="2">
<li>해당 숫자가 소수인지 아닌지 판별하시오.</li>
</ol>
</li>
<li><ol start="3">
<li>2부터 해당 숫자사이에 소수가 몇개인지 출력하는 함수를 구하시오</li>
</ol>
</li>
</ul>
<pre><code class="language-python">#### 함수 연습문제
# 1. 주어진 숫자 리스트의 평균을 구하는 함수를 출력하시오
# 입력: 숫자 리스트
# 출력: 숫자 리스트의 평균값

def mean(nums):
    _sum = 0
    for i in nums:
        _sum += i
    return _sum / len(nums)


def mean2(nums):
    # sum 내장 함수로 대체 가능
    # _sum = 0
    # for i in nums:
    #    _sum += i
    return sum(nums) / len(nums)


print(mean([1, 2, 3]))  # 2.0
print(mean2([1, 2, 3, 4, 5]))  # 3.0
print(mean([1, 2, 3.0, 3.9, 8.7]))  # 3.72


# 2. 해당 숫자가 소수인지 아닌지 판별하시오.
# 소수 판별 (1과 자기 자신으로만 나눠지는 수)
# 입력: 양의 정수 1개
# 출력: boolean (소수: True, 합성수: False)

# 관례 : 함수에서 True, False를 반환시킬땐 변수명 앞에 is_를 붙힌다.
def is_prime(num):
    for i in range(2, num):
        if num % i == 0:
            return False
    return True


print(is_prime(89))  # True 소수
print(is_prime(100))  # False 합성수


# 3. 2부터 해당 숫자사이에 소수가 몇개인지 출력하는 함수를 구하시오
# 2, 3, 4, 5, 6, 7 -&gt; 4
# 2, 3, 4, 5 -&gt; 3
# 입력: 양의 정수 1개
# 출력: 2 ~ 해당 숫자 사이의 소수의 개수

def num_prime(num):
    count = 0
    for i in range(2, num + 1):
        if is_prime(i):
            count += 1
    return count


print(num_prime(7))     # 4
print(num_prime(5))     # 3
print(num_prime(100))   # 25
</code></pre>
<h1 id="파이썬-모듈">파이썬 모듈</h1>
<h2 id="모듈의-이해-및-사용과-import-방법">모듈의 이해 및 사용과 import 방법</h2>
<h3 id="모듈-임포트">모듈 임포트</h3>
<ul>
<li>그동안 사용했던 함수들 처럼, 다양한 기능들이 미리 함수로 구현되어 모듈 형태로 제공</li>
<li>대표적으로 추후 과정에서 사용하게 될 아래의 모듈들이 존재</li>
<li>requests - HTTP 요청/응답 모듈</li>
<li>numpy - 수치해석 모듈</li>
<li>pandas - 데이터 분석 모듈</li>
</ul>
<h4 id="import">import</h4>
<ul>
<li>import를 사용하여 해당 모듈 전체를 import<pre><code class="language-python">#### import
# import를 사용하여 해당 모듈 전체를 import
import math
</code></pre>
</li>
</ul>
<p>print(math.pi)
print(math.cos(100))</p>
<pre><code>#### from import
- 해당 모듈에서 특정한 타입만 import
```python
#### from import
# 해당 모듈에서 특정한 타입만 import
from math import pi
from math import cos
print(pi)
print(cos(100))</code></pre><h4 id="-임포트">* 임포트</h4>
<ul>
<li>해당 모듈내에 정의된 모든 것을 import</li>
<li>일반적으로 사용이 권장되지 않음<pre><code class="language-python">#### * 임포트
# 해당 모듈내에 정의된 모든 것을 import
# 일반적으로 사용이 권장되지 않음
from math import *
print(sin(100))
print(e)</code></pre>
</li>
</ul>
<h4 id="as">as</h4>
<ul>
<li>모듈 import 시, alias(별명) 지정가능<pre><code class="language-python">#### as
# 모듈 import 시, alias(별명) 지정가능
import math as m
print(m.exp(3))
print(m.cos(100))
</code></pre>
</li>
</ul>
<p>```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[모두를 위한 딥러닝 - ML Lec 11]]></title>
            <link>https://velog.io/@eastgun_/%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D-ML-Lec-11</link>
            <guid>https://velog.io/@eastgun_/%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D-ML-Lec-11</guid>
            <pubDate>Sun, 07 Aug 2022 13:04:35 GMT</pubDate>
            <description><![CDATA[<h2 id="lec11-1-convnet의-conv-레이어-만들기">lec11-1 ConvNet의 Conv 레이어 만들기</h2>
<h3 id="the-only-limit-is-your-imagination">&#39;The only limit is your imagination&#39;</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/133530db-2e19-4091-9c54-2f729f004125/image.png" alt=""></p>
<blockquote>
<p>전체가 연결되어있다고 해서 FC 풀릿 커넥티드</p>
</blockquote>
<blockquote>
<p>입력을 여러개로 나눈다음 하나로 합치고 앞으로 내보내는걸 생각해볼 수 있는데
컴포셔널 뉴럴 네트워크 - CNN</p>
</blockquote>
<h3 id="preview">preview</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/9440851d-b08d-4bdc-9bd0-25a2e4776f1e/image.png" alt=""></p>
<blockquote>
<p>하나의 이미지가 있게 되면 이미지를 잘라서 넘기게되는데 이 창을 컴보셔널레이어 라고 한다.</p>
</blockquote>
<blockquote>
<p>중간에 RELU창을 넣고 중간에 POOL을 넣고 반복하면서 마지막에 풀릿 커넥티드를 한다</p>
</blockquote>
<h3 id="start-with-an-image-width--hight--depth">Start with an image (width * hight * depth)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/8edc8a03-7e14-4bab-916e-ba639cc77c73/image.png" alt=""></p>
<blockquote>
<p>32x32x3 의 이미지를 가지고 있다고 가정해보자</p>
</blockquote>
<h3 id="lets-focus-on-a-small-area-only">Let&#39;s focus on a small area only</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/89dc8674-3fc4-442e-aaf1-e41b046fffe5/image.png" alt=""></p>
<blockquote>
<p>고양이 실험에서 한 것 처럼 전체 이미지를 하나의 입력으로 받지않고 이미지 일부분만 처리하고 싶을때 여기서 처리한다는것을 필터라는 개념을 가지고 설명한다</p>
</blockquote>
<h3 id="lets-focus-on-a-small-area-only-5--5--3">Let&#39;s focus on a small area only (5 * 5 * 3)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/6b6800d3-4be7-4db4-80a2-b7b36477ba17/image.png" alt=""></p>
<blockquote>
<p>색깔은 항상 같이 처리해서 끝에 3은 같다 
필터는 항상 5 x 5 에 해당되는 값들 읽어들임</p>
</blockquote>
<h3 id="get-one-number-using-the-filter">Get one number using the filter</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/73468146-e5cb-4889-94f4-fdbd91e4af34/image.png" alt=""></p>
<blockquote>
<p>필터는 궁극적으로 한 값을 만들어 낸다. 5, 5를 x라 했을때 x를 입력받아서 어떤 처리를 한 다음에 한 점만 뽑아 낸다.</p>
</blockquote>
<h3 id="get-one-number-using-the-filter-1">Get one number using the filter</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/2efd1f45-300c-406d-8db1-a431c4a0345b/image.png" alt=""></p>
<blockquote>
<p>처음부터 많이 얘기했던 Wx + b 라는 폼을 사용한다. 무슨 이야기냐면 x값이 5개가 있다 가정했을 때 가설을 계산했던 식 처럼 계산하면 된다.</p>
</blockquote>
<h3 id="lets-look-at-other-areas-with-the-same-filter-w">Let&#39;s look at other areas with the same filter (w)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/7677f2bb-09e0-4f47-b3dd-b847ce81ce6d/image.gif" alt=""></p>
<blockquote>
<p>그러면 이것을 가지고 이 똑같은 필터 w의 값은 같을 때 다른부분의 이미지도 보아야 한다</p>
</blockquote>
<h3 id="a-closer-look-at-spatial-dimensions">A closer look at spatial dimensions</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/2fe6875e-8362-41a3-af35-b7c90c81c91f/image.gif" alt=""></p>
<blockquote>
<p>한 칸씩 옆으로 움직일 때 이 값을 Stride 라고 부른다 Stride:1일땐 한칸씩 2일땐 2칸씩 움직인다는 뜻으로 보면 된다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/bb94805e-d42f-4603-9a6b-1cc879254e9f/image.gif" alt=""></p>
<blockquote>
<p>Stride: 2일때 3x3의 output이 생김</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c9dcb7ef-18ce-46af-b9ff-d809e2909748/image.png" alt=""></p>
<blockquote>
<p>전반적으로 봤을 때 n x n 의 입력이 있다고 했을 때 필터 사이즈를 F 라 했을 때 총 몇개의 값이 뽑아 질 수 있을 것인가?</p>
</blockquote>
<h3 id="in-practice-common-to-zero-pad-the-border">In practice: Common to zero pad the border</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/a5361e61-7635-46af-8a18-39b53d0cb4fd/image.png" alt=""></p>
<blockquote>
<p>보통 실제적으로 사용할 때 Pad이란 개념을 사용한다. 테두리에다가 0으로 감싸는 하나의 입력을 가상적으로 있다고 만들어주는 것이다.
그림이 급격하게 작아지는것을 방지하기 위함이고, 다른 하나는 모서리다 라고 어떤형태로든 알려주고싶어서</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/5dda1e92-4bb7-4f57-a5f1-aec183c5e7d1/image.png" alt=""></p>
<blockquote>
<p>그래서 padding을 해서 입력의 이미지와 출력의 이미지가 같아지게 만들어주는 것을 일반적으로 사용하고 있다.</p>
</blockquote>
<h3 id="swiping-the-entire-image">Swiping the entire image</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/fa6bd0fb-9fe2-4923-b07a-b8da5dfbc95c/image.png" alt=""></p>
<h3 id="convolution-layers">Convolution layers</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/d17491b3-d09b-4228-8d18-0382b73ea3ac/image.png" alt=""></p>
<h2 id="lec11-2-convnet-max-pooling-과-full-network">lec11-2: ConvNet Max pooling 과 Full Network</h2>
<h3 id="pooling-layer-sampling">Pooling layer (sampling)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/cf89a8a9-6444-417c-a565-9adf5db7cdb9/image.png" alt="">
<img src="https://velog.velcdn.com/images/eastgun_/post/20e6daf7-547f-4765-b6cc-3e8b5b583980/image.png" alt=""></p>
<blockquote>
<p>pooling이라는건 간단하게 볼때 샘플링이라고 하면 된다
깊이는 몇개의 필터를 쓰느냐에 따라서 달라진다.
사이즈를 작게 만드는것을 풀링이라 한다</p>
</blockquote>
<h3 id="max-pooling">MAX POOLING</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/4add8e9a-b30b-4509-9107-0d478f6db9f9/image.png" alt=""></p>
<blockquote>
<p>4 x 4 라는 이미지가 있을때 MAX POOL 하면 2 x 2 가되는데 그 4 x 4 이미지의 값들 중에서 제일 큰값만 따로 빼서 2 x 2 샘플링을 하면 된다.</p>
</blockquote>
<h3 id="fully-connected-layer-fc-layer">Fully Connected layer (FC layer)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/6a196c0b-fa37-4713-81c4-cca83aba670f/image.png" alt=""></p>
<h2 id="lec11-3-convnet의-활용예">lec11-3 ConvNet의 활용예</h2>
<h3 id="case-study--alexnet">Case Study : AlexNet</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/d2a23f12-c69d-40c5-9e1a-b332674da61a/image.png" alt=""></p>
<blockquote>
<p>알렉스넷에서 렐루를 처음 만들어서 사용했었다.</p>
</blockquote>
<h3 id="case-study-googlenet">Case Study: GoogLeNet</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/8efa3d61-e06b-4fff-a503-02e0a2003f2e/image.png" alt=""></p>
<blockquote>
<p>Inception module : 어지럽다ㅏㅏㅏㅏㅏㅏ</p>
</blockquote>
<h3 id="case-study-resnet">Case Study: ResNet</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/28f96a7a-fc54-4dd1-9be1-ec7dd8e904aa/image.png" alt=""></p>
<blockquote>
<p>에러율 3.6%로 떨군 유명한 Case</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/dab1bcb2-8806-41a1-b533-2002febc8db2/image.png" alt=""></p>
<blockquote>
<p>알렉스넷이였을땐 8개의 레이어를 사용했는데 ResNet은 152개의 레이어를 사용했다.</p>
</blockquote>
<h3 id="cnn-for-sentence-classification">CNN for Sentence Classification</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c382dc1b-dd07-4328-82f4-695401040fba/image.png" alt=""></p>
<blockquote>
<p>2014년도에 윤 김 박사님께서 CNN을 가지고 자연어 처리</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[모두를 위한 딥러닝 - ML Lec 10]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-05%EA%B8%88-%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D-10%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-05%EA%B8%88-%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D-10%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 05 Aug 2022 05:41:02 GMT</pubDate>
            <description><![CDATA[<h2 id="lec10-1-sigmoid-보다-relu가-더-좋아">lec10-1: Sigmoid 보다 ReLU가 더 좋아</h2>
<h3 id="lets-go-deep--wide-">Let&#39;s go deep &amp; wide !</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/3a6f7146-4d3b-4828-90a3-69ce5f38a583/image.png" alt=""></p>
<blockquote>
<p>W1 = [2, 5] =&gt; x의 갯수가 2개, 출력하고 싶은 갯수 = 5개
W2 = [5, 4] =&gt; W1에서 출력한 갯수를 받아와야하니 x의 갯수가 5개, 출력하고 싶은거 4개
W3 = [4, 1] =&gt; W2에서 출력한 갯수를 받아와야하니 x의 갯수가 4개, 출력하고 싶은거 1개</p>
</blockquote>
<h3 id="9-hidden-layers">9 hidden layers!</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c9fc7dcb-581a-4fe2-bbd6-4f3842a0513f/image.png" alt=""></p>
<blockquote>
<p>처음과 마지막만 신경 쓰면 된다!</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/58d62bdd-2f69-4665-ba15-dd02b5ef7702/image.png" alt=""></p>
<blockquote>
<p>텐서보드를 이용해서 시각화 하고싶을 때</p>
</blockquote>
<h3 id="tensorboard-visualization">Tensorboard visualization</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/696150af-2c9e-44d6-9759-9f52028e5886/image.png" alt=""></p>
<h3 id="poor-results">Poor results?</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/833abe53-68c4-4c83-bb61-7d1449236f29/image.png" alt=""></p>
<blockquote>
<p>코스트 값이 떨어지지 않고 Accuracy가 0.5밖에 되지가 않는다? 왜 이러는거지?</p>
</blockquote>
<h3 id="tensorboard-cost--accuracy">Tensorboard Cost &amp; Accuracy</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/7be3fabd-86a1-468f-98b5-cf20a9d3f4b4/image.png" alt=""></p>
<blockquote>
<p>방금 생긴 문제를 텐서보드를 활용해서 그래프로 나타내보았다</p>
</blockquote>
<h3 id="backpropagation">Backpropagation</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/2f1db914-d6a2-4fc3-849e-942c2048e028/image.png" alt=""></p>
<blockquote>
<p>2단 3단 그래프정도는 잘 학습이 되는데 10단 이상정도의 그래프는 학습이 안된다</p>
</blockquote>
<h3 id="lec-9-2--backpropagation-chain-rule">lec 9-2 : Backpropagation (chain rule)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/403fc6fe-0477-4af9-aa5c-6cef820e846b/image.png" alt=""></p>
<h3 id="vanishing-gradient-nn-winter2-1986-2006">Vanishing gradient (NN winter2: 1986-2006)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/0f422553-80c4-40bf-8726-83586ebce6e9/image.png" alt=""></p>
<blockquote>
<p>기울기가 사라지는 문제이다.
그림으로 보면 앞단에 있는 경사나 기울기는 나타나는데 그러나 단수가 깊어 질수록 경사도가 사라져 버린다</p>
</blockquote>
<h3 id="sigmoid">Sigmoid!</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/85649caa-d166-4837-8eb2-c7acb1555bbf/image.png" alt=""></p>
<blockquote>
<p>0보다 작을경우 버리고 0보다 클 경우 갈때가지 가</p>
</blockquote>
<h3 id="relu-rectified-linear-unit">ReLU: Rectified Linear Unit</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/0e022757-34fe-468d-8529-76b9067587ba/image.png" alt=""></p>
<blockquote>
<p>기존에 시그모이드 함수 있던곳에 렐루 함수를 넣으면 된다!</p>
</blockquote>
<h3 id="relu">ReLu</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/007fa09b-2095-44df-861b-4039f8ff1e43/image.png" alt=""></p>
<blockquote>
<p>마지막 단은 시그모이드를 써야하는데 마지막 단의 출력은 0~1사이여야 하기 때문에</p>
</blockquote>
<h3 id="works-very-well">Works very well</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/1def53e9-4e6d-48b8-824a-2f15c93770dd/image.png" alt=""></p>
<blockquote>
<p>학습이 잘 되는것을 볼 수 있다.</p>
</blockquote>
<h2 id="lec10-2-weight-초기화-잘해보자">lec10-2: Weight 초기화 잘해보자</h2>
<h3 id="cost-function">Cost function</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/d0ba8a7e-81fd-4777-a988-4c2d156d0546/image.png" alt=""></p>
<blockquote>
<p>ReLu를 두번 실행시키면 그래프의 값이 좀 다르게 나온다 그 이유는 실행 시킬때 W를 랜덤값으로 줘서 그런거임</p>
</blockquote>
<h3 id="set-all-initial-weights-to-0">Set all initial weights to 0</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/88021a43-4aae-4b41-acca-69948b6a664a/image.png" alt=""></p>
<blockquote>
<p>W값을 다 0으로 줘버린다면.. x의 값들을 계산을 다 하더라도 결국 w를 곱해야하는데 w가 0이 되버린다면 결과적으로 0이 나와서 안된다</p>
</blockquote>
<h3 id="need-to-set-the-initial-weight-values-wisely">Need to set the initial weight values wisely</h3>
<ul>
<li>Not all 0&#39;s</li>
<li>Challenging issue</li>
<li>Hinton et al. (2006) &quot;A Fast LearningAlgorithmforDeep Belief Nets&quot;<ul>
<li><strong>Restricted Boatman Machine(RBM)</strong></li>
</ul>
</li>
</ul>
<h3 id="good-news">Good news</h3>
<ul>
<li>No need to use complicated RBM for weight initializations</li>
<li>Simple methods are OK<ul>
<li><strong>Xavier initialization:</strong> X. Glorot and Y. Bengio, &quot;Understandingthe difficulty of training deep feedforwardneural networks,&quot; in International conference on artificialintelligence and statistics, 2010</li>
<li><strong>He&#39;s initialization:</strong> K. He, X. Zhang, S. Ren, and J. Sun, &quot;Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification,&quot; 2015</li>
</ul>
</li>
</ul>
<h3 id="xavierhe-initialization">Xavier/He initialization</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/d86042ad-f35c-4cf3-9b19-a197ec859e3b/image.png" alt=""></p>
<h3 id="still-an-active-area-of-research">Still an active area of research</h3>
<ul>
<li>We don&#39;t know how to initialize perfectweight values, yet</li>
<li>Many new algorithms<ul>
<li>Batch normalization</li>
<li>Layer sequential uniform variance</li>
<li>...</li>
</ul>
</li>
</ul>
<h2 id="lec10-3-dropout-과-앙상블">lec10-3: Dropout 과 앙상블</h2>
<h3 id="overfitting">Overfitting</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/7076dada-cc57-4129-b943-5f7ee0912a81/image.png" alt=""></p>
<h3 id="am-i-overfitting">Am I overfitting?</h3>
<ul>
<li>Very high accuracyon the training dataset (eg:0.99)</li>
<li>Pooraccuracy on the test dataset (0.85)
<img src="https://velog.velcdn.com/images/eastgun_/post/fcb15c0a-cee0-4a2a-a1f2-57388392763a/image.png" alt=""></li>
</ul>
<blockquote>
<p>파란색 선이 training error 빨간색 선이 test error
y축이 acc x축이 w를 몇개를 사용했는지 하는 Layer</p>
</blockquote>
<h3 id="solutionsfor-overfitting">Solutionsfor overfitting</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/f7d4a7b4-0de7-46f9-b19b-638bdc68b6e1/image.png" alt=""></p>
<blockquote>
<p>딥러닝에서는 굳이 features의 수를 줄일 필요는 없다</p>
</blockquote>
<h3 id="regularization">Regularization</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/38abfcf9-7514-4861-8163-c349f7e2e655/image.png" alt=""></p>
<h3 id="dropout-a-simple-way-to-prevent-neural-networks-form-overfitting-srivastavaet-al-2014">Dropout: A Simple Way to Prevent Neural Networks form Overfitting [Srivastavaet al. 2014]</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/aae9426b-13fb-4ee0-ba85-e1dc0670c601/image.png" alt=""></p>
<blockquote>
<p>랜덤하게 몇개의 노드를 죽여보자 라고 얘기 나온게 Dropout</p>
</blockquote>
<h3 id="waaaait-a-second-howcould-this-possiblybe-agood-idea">Waaaait a second... Howcould this possiblybe agood idea?</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/e9e661e0-bdf7-4f38-a56c-1bc29332b94e/image.png" alt=""></p>
<blockquote>
<p>랜덤하게 노드를 죽여서 쉬게 만든 다음 학습시키고 마지막에 총동원해서 예측을 하니 더 잘된다</p>
</blockquote>
<h3 id="tensorflow-implementation">TensorFlow implementation</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/ee7dc943-7d90-433a-abf3-c1cb7bf398b2/image.png" alt=""></p>
<blockquote>
<p>텐서플로우에서는 tf.nn.dropout로 랜덤하게 죽이는 메소드가 있다. 무조건 학습할때만 드랍아웃을 시키고 테스팅을 할땐 시키지말아야한다</p>
</blockquote>
<h3 id="what-is-ensemble">What is Ensemble?</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/b50aa071-6c60-4d11-a50b-835046ef0c50/image.png" alt=""></p>
<h2 id="lec10-4-레고처럼-넷트웍-모듈을-마음껏-쌓아-보자">lec10-4: 레고처럼 넷트웍 모듈을 마음껏 쌓아 보자</h2>
<h3 id="fast-forward">Fast forward</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/d475e8b8-4944-4ac6-9d89-331cad9cd12c/image.png" alt=""></p>
<h3 id="split--merge">Split &amp; merge</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/067d10cf-2d7d-416a-89cd-1ea4c4ad6314/image.png" alt=""></p>
<h3 id="recurrent-network">Recurrent network</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/ef250dd9-d5e7-43ae-be1f-ca25308ccced/image.png" alt=""></p>
<h3 id="the-only-limit-isyour-imagination">&#39;The only limit isyour imagination&#39;</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/efdc555a-7138-4350-a0d6-e76952eeec9f/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022. 08. 05(금) Spark & Hadoop 초격차 10일차]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-05%EA%B8%88-Spark-Hadoop-%EC%B4%88%EA%B2%A9%EC%B0%A8-10%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-05%EA%B8%88-Spark-Hadoop-%EC%B4%88%EA%B2%A9%EC%B0%A8-10%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 05 Aug 2022 04:54:39 GMT</pubDate>
            <description><![CDATA[<h2 id="두번째-mapreduce---sorting">두번째 MapReduce - Sorting</h2>
<h3 id="추가-된-소스">추가 된 소스</h3>
<pre><code class="language-java">public static class TopKMapper extends Mapper&lt;Object, Text, Text, Text&gt; {
        // Key값을 기준으로 정렬이 되어있는 맵
        private TreeMap&lt;Double, Text&gt; topKMap = new TreeMap&lt;&gt;();

        @Override
        protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            String[] columns = value.toString().split(&quot;\t&quot;);
            topKMap.put(Double.parseDouble(columns[1]), new Text(columns[0]));

            if (topKMap.size() &gt; K) {
                topKMap.remove(topKMap.firstKey());
            }
        }

        @Override
        protected void cleanup(Context context) throws IOException, InterruptedException {
            for (Double k : topKMap.keySet()) {
                // 맵의 아웃풋으로 평점이 키로 출력이 되고, 두번째로 영화제목이 출력이 된다
                context.write(new Text(k.toString()), topKMap.get(k));
            }
        }
    }

    public static class TopKReducer extends Reducer&lt;Text, Text, Text, Text&gt; {
        private TreeMap&lt;Double, Text&gt; topKMap = new TreeMap&lt;&gt;();

        @Override
        protected void reduce(Text key, Iterable&lt;Text&gt; values, Context context) throws IOException, InterruptedException {
            for (Text value : values) {
                topKMap.put(Double.parseDouble(key.toString()), new Text(value));
                if (topKMap.size() &gt; K) {
                    topKMap.remove(topKMap.firstKey());
                }
            }
        }

        @Override
        protected  void cleanup(Context context) throws IOException, InterruptedException {
            // 내림차순 키값으로 가져와서 처리
            for (Double k : topKMap.descendingKeySet()) {
                context.write(topKMap.get(k), new Text(k.toString()));
            }
        }
    }

    @Override
    public int run(String[] args) throws Exception {
        Job job = Job.getInstance(getConf(), &quot;MovieAverageRateTopK First&quot;);
        job.setJarByClass(MovieAverageRateTopK.class);
        job.setReducerClass(MovieRatingJoinReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        MultipleInputs.addInputPath(job, new Path(args[0]), TextInputFormat.class, MovieMapper.class);
        MultipleInputs.addInputPath(job, new Path(args[1]), TextInputFormat.class, RatingMapper.class);

        FileOutputFormat.setOutputPath(job, new Path(args[2]));

        int returnCode = job.waitForCompletion(true) ? 0 : 1;

        // 정상적으로 완료가 됐을 시
        if (returnCode == 0) {
            Job job2 = Job.getInstance(getConf(), &quot;MovieAverageRateTopK Second&quot; );
            job2.setJarByClass(MovieAverageRateTopK.class);
            job2.setMapperClass(TopKMapper.class);
            job2.setReducerClass(TopKReducer.class);
            job2.setNumReduceTasks(1);
            job2.setOutputKeyClass(Text.class);
            job2.setOutputValueClass(Text.class);

            FileInputFormat.addInputPath(job2, new Path(args[2]));
            FileOutputFormat.setOutputPath(job2, new Path(args[3]));

            return job2.waitForCompletion(true) ? 0 : 1;
        }
        return 1;
    }
</code></pre>
<h2 id="두번째-mapreduce---unit-test">두번째 MapReduce - Unit Test</h2>
<h3 id="추가된-소스">추가된 소스</h3>
<pre><code class="language-java">/** 두번째 MapReduce - Unit Test */
    @Test
    public void topKMapTest() throws IOException {
        // withOutput 위치를 바꿀 시 에러가 뜸 즉, 출력순서가 뒤바뀜
        // 작은 순서부터 실행이 되야 하는데 순서가 뒤바뀌면서 큰 순서부터 되버려서 에러가 생김
        new MapDriver&lt;Object, Text, Text, Text&gt;()
                .withMapper(new MovieAverageRateTopK.TopKMapper())
                .withInput(new LongWritable(0), new Text(&quot;Toy Story (1995)\t4.25&quot;))
                .withInput(new LongWritable(1), new Text(&quot;Jumanji (1995)\t3.5&quot;))
                .withOutput(new Text(&quot;3.5&quot;), new Text(&quot;Jumanji (1995)&quot;))
                .withOutput(new Text(&quot;4.25&quot;), new Text(&quot;Toy Story (1995)&quot;))
                .runTest();
    }

    @Test
    public void topKReduceTest() throws IOException {
        // 여기도 출력 결과의 순서가 중요함. 여긴 높은 평점부터 낮은평점순으로 순서가 되야 함.
        new ReduceDriver&lt;Text, Text, Text, Text&gt;()
                .withReducer(new MovieAverageRateTopK.TopKReducer())
                .withInput(new Text(&quot;3.5&quot;), Arrays.asList(new Text(&quot;Jumanji (1995)&quot;)))
                .withInput(new Text(&quot;4.25&quot;), Arrays.asList(new Text(&quot;Toy Story (1995)&quot;)))
                .withOutput(new Text(&quot;Toy Story (1995)&quot;), new Text(&quot;4.25&quot;))
                .withOutput(new Text(&quot;Jumanji (1995)&quot;), new Text(&quot;3.5&quot;))
                .runTest();
    }</code></pre>
<h2 id="영화-평점-top-30-실행">영화 평점 Top 30 실행</h2>
<h3 id="명령어를-통해-코드-실행">명령어를 통해 코드 실행</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c80a4228-368d-4a2a-8ec4-4a7bdc5e0c62/image.png" alt="">
<img src="https://velog.velcdn.com/images/eastgun_/post/3df5c871-45a7-40e2-9285-07b892972267/image.png" alt="">
<img src="https://velog.velcdn.com/images/eastgun_/post/155c805c-2097-4c79-ac38-3828d382c84f/image.png" alt="">
<img src="https://velog.velcdn.com/images/eastgun_/post/30a3e127-c69d-4b81-9c34-622ae4c7c374/image.png" alt=""></p>
<h3 id="실행-결과-1">실행 결과 1</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/5bfe91ee-c32b-4041-b1f1-23f06b27519a/image.png" alt=""></p>
<h3 id="실행-결과-2">실행 결과 2</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/4f7828b8-4c8d-448f-bbfe-0be208aa8f37/image.png" alt=""></p>
<blockquote>
<p>잘 작동되는걸 확인 할 수 있다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022. 08. 05(금) Python 공부 10일차]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-05%EA%B8%88-Python-%EA%B3%B5%EB%B6%80-10%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-05%EA%B8%88-Python-%EA%B3%B5%EB%B6%80-10%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 05 Aug 2022 01:27:31 GMT</pubDate>
            <description><![CDATA[<h2 id="조건문--반복문-연습문제">조건문 &amp; 반복문 연습문제</h2>
<h3 id="if--for-연습문제">if &amp; for 연습문제</h3>
<pre><code class="language-python"># 1번 문제 : 구구단을 2 - 9단까지 출력하시오
x = 2
while x &lt;= 9:
    y = 1
    while y &lt;= 9:
        print(x, &#39;x&#39;, y, &#39;=&#39;, x * y)
        y += 1
    x += 1

# 2번 문제 : 1 - 100까지 정수 중 2의 배수 또는 11의 배수를 모두 출력하시오
nums = list(range(1, 101))
for x in nums:
    if x % 2 == 0 or x % 11 == 0:
        print(x)

# 3번 문제 : a = [22, 1, 3, 4, 7, 98, 21, 55, 87, 99, 19, 20, 45] 에서 최대값과 최소값을 찾으시오. (sorted, sort 사용 금지)

# sort 함수(정렬)을 사용한 경우
a = [22, 1, 3, 4, 7, 98, 21, 55, 87, 99, 19, 20, 45]
a.sort()
a[0], a[-1]

# 최대 최소 동시에
_min = a[0]
_max = a[0]
for x in a:
    if x &lt; _min:
        _min = x
    if x &gt; _max:
        _max = x

print(_min, _max)


# 4번 문제 : a = [22, 1, 3, 4, 7, 98, 21, 55, 87, 99, 19, 20, 45] 에서 평균을 구하세요.

# while
i = 0
_sum = 0
while i &lt; len(a):
    _sum += a[i]
    i += 1

print(_sum / len(a))

# for
_sum = 0
for x in a:
    _sum += x

print(_sum / len(a))</code></pre>
<h2 id="함수의-이해-및-사용">함수의 이해 및 사용</h2>
<h3 id="함수">함수?</h3>
<ul>
<li>지금까지 무심코 코드에서 사용된 많은 함수들이 존재 합니다.</li>
<li>예를들면, sum, len, range 같은 함수 등이 있죠.</li>
<li>함수란 우리가 알고있는 개념처럼 주어진 입력(input)에 대해서 의도된 출력(output)를 전달하는 역할을 합니다.</li>
<li>그렇다면 하나씩 살펴보겠습니다.<ul>
<li>range 함수는 정수를 입력으로 전달하면 [0, 정수) 로 이루어진 리스트를 생성하는 역할을 합니다.</li>
<li>sum 함수는 리스트, 튜플등을 입력으로 전달하면 전체 아이템의 합을 출력으로 전달하는 역할을 합니다.</li>
<li>len 함수는 리스트, 튜플 등을 입력으로 전달할하면 아이템의 개수를 출력으로 전달하는 역할을 합니다.</li>
</ul>
</li>
<li>그리고, 위의 함수들은 모두 python 내부에 이미 정의(구현)이 되어 있습니다.</li>
<li>위와 같은 함수를 내장함수(built-in function)이라고 합니다.<pre><code class="language-python">### 함수?
</code></pre>
</li>
</ul>
<h1 id="내장-함수의-예">내장 함수의 예</h1>
<p>a = [1, 2, 3, 4]
length = len(a)
print(length)</p>
<p>summation = sum(a)
print(summation)</p>
<pre><code>

#### 함수의 정의
- 정의 시 최초에 def 키워드 사용
- argument 정의 (함수에 입력으로 전달하는 값을 의미, argument 또는 parameter라고 함)
- : (콜론) -&gt; 함수 역시 코드 블록이기 때문에 콜론(:) 필요
- body (함수의 구현 부분, 함수 역시 코드 블록이기 떄문에 들여쓰기 된 부분까지 함수의 코드블록으로 인지함)
  - 함수를 호출한 코드 (caller)로 함수가 해당 기능을 수행하고 완료된 값(output)을 전달하기 위해 return 키워드 사용
  - 즉, return 이후에 오는 값을 caller로 전달
- 함수의 네이밍 역시 중요
  - 즉, 어떤 기능을 하는 함수인지 이름으로 최대한 나타날 수 있게 해야함
  - e.g) get_a (x) get_student_name (o)
  ```python
  #### 함수의 정의
  def add(x, y):
      n = x + y
      return n

  c = add(30, 300)
  print(c)</code></pre><h4 id="함수의-사용호출">함수의 사용(호출)</h4>
<ul>
<li>함수명(파라미터1, 파라미터2, ... 파라미터n)</li>
<li>위와 같이 정의 된 함수의 이름과 전달되는 parameter(인자)를 괄호안에 전달하여 함수를 호출</li>
<li>함수가 호출되면 실행의 흐름이 호출자(caller)에서 함수(callee)로 변경 됨</li>
<li>함수의 입력(인풋) 파라미터(parameter), 아규먼트(argument)라고도 함
<img src="https://velog.velcdn.com/images/eastgun_/post/bfb7639c-c608-460e-a09b-1a25f678eea9/image.png" alt=""><pre><code class="language-python">#### 함수의 사용(호출)
d = add(30, 40)
print(d)</code></pre>
</li>
</ul>
<h4 id="함수-네이밍naming">함수 네이밍(naming)</h4>
<ul>
<li>함수 이름으로부터 기능이 명시</li>
<li>의미와 반대되거나 맞지 않는 이름은 사용 금지<pre><code class="language-python">#### 함수 네이밍(naming)
# 의미에 맞지않는 함수명은 사용하지 말자
def substract(x, y):
  sub = x - y
  return sub
</code></pre>
</li>
</ul>
<p>print(substract(4, 3))</p>
<pre><code>
#### parameter(argument) (인자)
- 함수에 전달되는 입력(input)
- 입력이 필요하지 않을 수도, 1개의 입력만 있을 수도, 여러개의 입력이 존재할 수도 있음
- 파라미터로 int, string, float, boolean, list, dict 등등 어떤 파이썬 객체도 전달 가능
- 심지어 함수도 함수의 파라미터로 전달 가능
- python의 경우, 타입 명시가 없기 때문에, 함수 생성 시, 의도된 파라미터의 타입에 맞게 입력을 전달하는 것이 중요
- 또한 파라미터를 전달 할 때, 정의된 순서에 따라 값을 전달하는 것이 중요
```python
#### parameter(argument)(인자)
def test():
    print(&#39;haha&#39;)
    print(&#39;good&#39;)

    return 100

a = test()
print(a)</code></pre><h4 id="default-parameter-기본-인자">Default parameter( 기본 인자)</h4>
<ul>
<li>함수의 파라미터에 기본값 지정 가능</li>
<li>파라미터를 명시하지 않을 경우, 지정된 기본값으로 대체<pre><code class="language-python">#### Default parameter(기본 인자)
def add2(x, y, z=5):
  a = x + y + z
  return a
</code></pre>
</li>
</ul>
<p>add2(10, 20)</p>
<pre><code>
- **기본 파라미터의 다른 예**
  - print 함수
    - seq, end, file등 여러 기본 파라미터를 가짐
    ```python
    # 기본 파라미터의 다른 예
    print(1, 2, 3, sep=&#39;!&#39;, end=&#39;%%%&#39;)  # 1!2!3%%%
    print(2, 3, 4, sep=&#39;p&#39;) # 2p3p4
    ```

#### Default parameter 사용 시 주의점
- 디폴트 파라미터 뒤에 일반 파라미터가 위치할 수 없음
- e.g) 올바른 예
  &gt; def test(a, b, c = 1)

  &gt; def test(a, b =1, c = 2)

  &gt; def test(a = 1, b = 1, c = 3)

- e.g) 올바르지 않은 예
  &gt; def test(a, b = 1, c)

  &gt; def test(a = 1, b, c)

  &gt; def test(a = 1, b = 1, c)

![](https://velog.velcdn.com/images/eastgun_/post/c82e226e-9a65-4527-a2b1-c50562651d27/image.png)

#### keyword parameter (키워드 파라미터)
- 파이썬의 경우, 파라미터에 값을 전달 할 때, 파라미터의 이름을 명시하여 전달 가능
- 파라미터 이름을 사용하지 않을 경우, 기본적으로 순서에 맞게 전달

```python
    #### keyword parameter (키워드 파라미터)
    def test(x, y, z):
    a = x + y + z
    return a

    test(x=10, y=50, z=3)   # 63</code></pre><h4 id="return-리턴">return (리턴)</h4>
<ul>
<li><p>기본적으로 함수의 종료를 명시</p>
<ul>
<li><p>return옆에 값이나 수식이 있다면 해당 값을 호출자(caller)에게 반환(전달)</p>
</li>
<li><p>return만 존재하면 None 반환</p>
</li>
<li><p>return이 없는 경우, 기본적으로 함수 코드 블록이 종료되면 종료로 간주. 이때도 None 반환</p>
<pre><code class="language-python">  #### return (리턴)
  def weird_multiply(x, y):
    if x &gt; 10:
        return x * y

    print(x + y)
    return (x + 2) * y

  print(weird_multiply(12, 5))

  # 비교
  def weird_multiply2(x, y):
    if x &gt; 10:
        return x * y

  print(weird_multiply2(2, 5))</code></pre>
</li>
</ul>
</li>
</ul>
<h4 id="multiple-return-복수-값-반환">multiple return (복수 값 반환)</h4>
<ul>
<li><p>tuple반환을 하여 복수개의 값 리턴 가능</p>
<pre><code class="language-python">#### multiple return (복수 값 반환)
def add_mul(x, y):
  s = x + y
  m = x * y

  return s, m
</code></pre>
</li>
</ul>
<p>c = add_mul(20, 3)
print(type(c))
print(c)</p>
<p>a, b = add_mul(20, 3)
print(a, b)</p>
<pre><code>
#### variable scope (변수의 범위)
- 변수가 참조 가능한 코드상의 범위를 명시
- 함수내의 변수는 자신이 속한 코드를 블록이 종료되면 소멸됨
- 이렇게 특정 코드 블록에서 선언된 변수를 **지역변수(local variable)** 이라고 함
- 반대로 가장 상단에서 정의되어 프로그램 종료 전까지 유지되는 변수를 **전역변수(global variable)** 이라고 함
- 같은 이름의 지역변수와 전역변수가 존재할 경우, 지역변수의 우선순위가 더 높음

```python
#### variable scope (변수의 범위)
num1 = 10
num2 = 30

def test(num1, num2):
    print(num1, num2)
    return num1 + num2

test(30, 40)

print(num1, num2)</code></pre><h4 id="variable-length-argument-가변길이-인자">variable length argument (가변길이 인자)</h4>
<ul>
<li><p>전달되는 파라미터의 개수가 고정적이지 않은 경우 사용</p>
</li>
<li><p>e.g)</p>
<ul>
<li>print 함수</li>
<li>format 함수</li>
</ul>
<blockquote>
<p><em>args, *</em>kwargs</p>
</blockquote>
<blockquote>
<p>*args : 파라미터를 튜플의 형태로 전달</p>
</blockquote>
<blockquote>
<p>**kwags : 파라미터를 딕셔너리 형태로 전달(네임드 파라미터)</p>
</blockquote>
</li>
</ul>
<pre><code class="language-python">#### variable length argument (가변길이 인자)

# 파라미터를 정의할때 앞에 * 붙이게 되면 그 함수는 호출하는 입장에선 가변길이 함수가 되고 내부적으론 튜플로 인식이 된다.
def test(*x):
    print(type(x))


test(10, 20)


def test_2(*args):  # arguments
    for item in args:
        print(item)


test_2(10, 30, 40)</code></pre>
<h4 id="keyword-parameter-키워드-파라미터">keyword parameter (키워드 파라미터)</h4>
<ul>
<li>**가 붙은 경우에는 키워드 파라미터로 인식</li>
<li>즉 함수 호출 시, 파라미터의 이름과 값을 함께 전달 가능</li>
</ul>
<pre><code class="language-python">#### keyword parameter (키워드 파라미터)
def test2(**kwargs):  # key word arguments
    for key, value in kwargs.items():
        print(&#39;key:&#39;, key, &#39;, value:&#39;, value)

test2(a=1, b=2, c=3, d=4, name=&#39;Bob&#39;, age=90)</code></pre>
<ul>
<li>가변길이 함수의 대표적인 예 <strong>문자열 포맷 함수</strong><ul>
<li>여러가지 값과 포맷을 이용하여 문자열을 정의할 수 있는 함수</li>
<li>{} placeholder를 문자열 내에 위치 시킨 후, 해당 위치에 format함수로 전달된 값으로 대체하여 문자열 생성</li>
<li>포맷 구성은 다음 링크 참조 : <a href="https://pyformat.info/">https://pyformat.info/</a></li>
</ul>
</li>
</ul>
<pre><code class="language-python"># 가변길이 함수의 대표적인 예 **문자열 포맷 함수**

a = &#39;오늘 온도: {today_temp}도, 강수확률은: {today_prob}% 내일온도: {tomorrow_temp}도&#39;.format(tomorrow_temp = 23, today_prob = 40, today_temp = 40)
print(a)
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[모두를 위한 딥러닝 - ML Lec 09]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-04%EB%AA%A9-%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D-9%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-04%EB%AA%A9-%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D-9%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 04 Aug 2022 13:57:31 GMT</pubDate>
            <description><![CDATA[<h2 id="lec9-1-xor-문제-딥러닝으로-풀기">lec9-1: XOR 문제 딥러닝으로 풀기</h2>
<h3 id="one-logistic-regression-unit-cannot-separate-xor">One logistic regression unit cannot separate XOR</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/8688163e-64a2-4a62-b49b-51a22f3494cc/image.png" alt=""></p>
<blockquote>
<p>XOR은 굉장히 간단했지만 초창기 뉴럴 네트워크 전문가들한테는 절망을 안겨다 줬었다</p>
</blockquote>
<h3 id="neural-network-nn-no-one-on-earth-had-found-a-viable-way-to-train">Neural network (NN) &quot;No one on earth had found a viable way to train*&quot;</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/4aa25ee4-a24f-4304-9c5a-9f969b628285/image.png" alt=""></p>
<blockquote>
<p>그 당시에 나왔던 이야기가, 여러가지로 겹치면 풀수가 있지만 각각의 W, b를 어떻게 학습할 수가 있냐 불가능하다 라고 나옴</p>
</blockquote>
<h3 id="xor-using-nn">XOR using NN</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/776c7df3-9d24-4bc1-8b03-5a591125ec56/image.png" alt=""></p>
<blockquote>
<p>XOR의 속성으로는 리니어하게 선을 찾을 수 없다</p>
</blockquote>
<h3 id="neural-net">Neural Net</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/11e8535e-daa2-410a-a4b9-746634c94a0e/image.png" alt=""></p>
<blockquote>
<p>이 문제를 3개의 네트워크를 가지고 풀어보자</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/13ec2be7-68f4-40cf-974b-81f6c1cbc5fe/image.png" alt=""></p>
<blockquote>
<p>4가지 케이스로 테스트 해봅시다. ( 1번째 케이스)</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/9b6e7952-dad6-4401-ae25-619eb77d7afa/image.png" alt=""></p>
<blockquote>
<p>2번째 케이스</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/606b0f24-e742-46d6-898b-1b95f1a20b46/image.png" alt=""></p>
<blockquote>
<p>3번째 케이스</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/86009915-dd54-4151-92e9-1883b8ff563a/image.png" alt=""></p>
<blockquote>
<p>4번째 케이스</p>
</blockquote>
<h3 id="forward-propagation">Forward propagation</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/d0d8bb9b-4640-439d-80c4-d6ac66a8fedf/image.png" alt=""></p>
<blockquote>
<p>각각 계산했던 식을 더 간편하게 작성 , 이게 즉 뉴럴 네트워크</p>
</blockquote>
<h3 id="nn">NN</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c4d8543e-f3a5-49ba-a7de-bea366f76b7f/image.png" alt=""></p>
<blockquote>
<p>위에 작성했던 식을 더 간단하게 작성</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/636eef0a-6df7-4459-9716-b37b43e86fdd/image.png" alt=""></p>
<blockquote>
<p>수식어로 써본다면</p>
</blockquote>
<h2 id="lec9-x-특별편-10분안에-미분-정리하기-lec9-2-이전에-보세요">lec9-x: 특별편: 10분안에 미분 정리하기 (lec9-2 이전에 보세요)</h2>
<h3 id="basic-derivative">Basic derivative</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/8c36f546-f3ba-468f-8e5a-85d9e1af8925/image.png" alt=""></p>
<blockquote>
<p>델타 x를 아주 작은값, 0에 가까운 값으로 보낼 때 f(x)에 델타x를 더한값과 더하지 않는 값으로 해서 뺀걸 델타 x로 나눈다
다른말로 순간 변화율</p>
</blockquote>
<h3 id="partial-derivative-consider-other-variables-as-constants">Partial derivative: consider other variables as constants</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/e3641f4b-f47c-4a99-a5ba-1df19bc20a8a/image.png" alt=""></p>
<blockquote>
<p>f(x, y) = xy, ax/af 에서는 x를 미분으로 쓰고 뒤에 y는 상수취급</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/7c321da8-8600-4787-b080-610d79feaf8f/image.png" alt=""></p>
<blockquote>
<p>상수함수는 미분하면 0이 됨
f(x) = x + x 을 미분하면 2</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/ae05a501-0c80-419d-ac31-c29e1db7b202/image.png" alt=""></p>
<blockquote>
<p>복합함수 f(g(x))는 ax/af = (ag/af)*(ax/ag)</p>
</blockquote>
<h2 id="lec9-2-딥넷트웍-학습-시키기-backpropagation">lec9-2: 딥넷트웍 학습 시키기 (backpropagation)</h2>
<h3 id="how-can-we-learn-w1-w2-b1-b2-from-training-data">How can we learn W1, W2, B1, B2 from training data?</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c3aff93d-603e-435f-9acf-4b285c575be6/image.png" alt=""></p>
<h3 id="derivation">Derivation</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/ad9e8fb9-2318-4cbc-ba4d-b19d4c68c2e9/image.png" alt=""></p>
<h3 id="backpropagation-1974-1982-by-paul-werbos-1986-by-hinton">Backpropagation (1974, 1982 by Paul Werbos, 1986 by Hinton)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/0001a6d8-4dab-4fbd-b388-2e3763d75012/image.png" alt=""></p>
<h3 id="back-propagation-chain-rule">Back propagation (chain rule)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/94f8c437-c18a-47a1-a1cd-bd0e1c21298c/image.png" alt=""></p>
<blockquote>
<p>간단한 예제를 가지고 어떻게 동작하는지 이해해 보자.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/80db8a69-f390-46c3-a9be-07a5da1db71b/image.png" alt=""></p>
<h3 id="sigmoid">Sigmoid</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/e3a89d73-5596-4c3c-b416-2edb7597e837/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022. 08. 04(목) Spark & Hadoop 초격차 9일차]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-04%EB%AA%A9-Spark-Hadoop-%EC%B4%88%EA%B2%A9%EC%B0%A8-9%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-04%EB%AA%A9-Spark-Hadoop-%EC%B4%88%EA%B2%A9%EC%B0%A8-9%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 04 Aug 2022 01:48:09 GMT</pubDate>
            <description><![CDATA[<h2 id="첫-번째-mapreduce---join">첫 번째 MapReduce - Join</h2>
<h3 id="movieaverageratetopk">MovieAverageRateTopK</h3>
<pre><code class="language-java">package com.fastcampus.hadoop;

import org.apache.avro.generic.GenericData;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.MultipleInputs;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class MovieAverageRateTopK extends Configured implements Tool {
    public static class MovieMapper extends Mapper&lt;Object, Text, Text, Text&gt; {
        private Text movieId = new Text();
        private Text outValue = new Text();

        @Override
        protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            String[] columns = value.toString().split(&quot;,&quot;);
            if (columns[0].equals(&quot;movieId&quot;)) {
                return;
            }
            movieId.set(columns[0]);
            outValue.set(&quot;M&quot; + columns[1]);
            context.write(movieId, outValue);
        }
    }

    public static class RatingMapper extends Mapper&lt;Object, Text, Text, Text&gt; {
        private Text movieId = new Text();
        private Text outValue = new Text();

        @Override
        protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            String[] colums = value.toString().split(&quot;,&quot;);
            if (colums[0].equals(&quot;userId&quot;)) {
                return;
            }
            movieId.set(colums[1]);
            outValue.set(&quot;R&quot; + colums[2]);
            context.write(movieId, outValue);
        }
    }

    public static class MovieRatingJoinReducer extends Reducer&lt;Text, Text, Text, Text&gt; {
        private List&lt;String&gt; ratingList = new ArrayList&lt;&gt;();
        private Text movieName = new Text();
        private Text outValue = new Text();

        @Override
        protected void reduce(Text key, Iterable&lt;Text&gt; values, Context context) throws IOException, InterruptedException {
            ratingList.clear();

            for (Text value : values) {
                if (value.charAt(0) == &#39;M&#39;) {
                    movieName.set(value.toString().substring(1));
                } else if (value.charAt(0) == &#39;R&#39;) {
                    ratingList.add(value.toString().substring(1));
                }
            }

            double average = ratingList.stream().mapToDouble(Double::parseDouble).average().orElse(0.0);
            outValue.set(String.valueOf(average));
            context.write(movieName, outValue);
        }
    }

    @Override
    public int run(String[] args) throws Exception {
        Job job = Job.getInstance(getConf(), &quot;MovieAverageRateTopK First&quot;);
        job.setJarByClass(MovieAverageRateTopK.class);
        job.setReducerClass(MovieRatingJoinReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        MultipleInputs.addInputPath(job, new Path(args[0]), TextInputFormat.class, MovieMapper.class);
        MultipleInputs.addInputPath(job, new Path(args[1]), TextInputFormat.class, RatingMapper.class);
        return 1;
    }

    public static void main(String[] args) throws Exception {
        int exitCode = ToolRunner.run(new MovieAverageRateTopK(), args);
        System.exit(exitCode);
    }
}
</code></pre>
<h2 id="첫-번째-mapreduce---unit-test">첫 번째 MapReduce - Unit Test</h2>
<h3 id="movieaverageratetopktest">MovieAverageRateTopKTest</h3>
<pre><code class="language-java">package com.fastcampus.hadoop;

import org.apache.hadoop.mrunit.mapreduce.ReduceDriver;
import org.apache.hadoop.mrunit.types.Pair;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mrunit.mapreduce.MapDriver;
import org.junit.Test;

import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;

public class MovieAverageRateTopKTest {
    @Test
    public void movieMapTest() throws IOException {
        MapDriver mapDriver = new MapDriver&lt;Object, Text, Text, Text&gt;()
                .withMapper(new MovieAverageRateTopK.MovieMapper())
                .withInput(new LongWritable(0), new Text(&quot;movieId,title,genres&quot;))
                .withInput(new LongWritable(1), new Text(&quot;1,Toy Story (1995),Adventure|Animation|Children|Comedy|Fantasy&quot;))
                .withInput(new LongWritable(2), new Text(&quot;2,Jumanji (1995),Adventure|Children|Fantasy&quot;));

        /*List&lt;Pair&lt;Text, Text&gt;&gt; result = mapDriver.run();
        System.out.println(result);*/

        mapDriver.withOutput(new Text(&quot;1&quot;), new Text(&quot;MToy Story (1995)&quot;))
                .withOutput(new Text(&quot;2&quot;), new Text(&quot;MJumanji (1995)&quot;))
                .runTest();
    }

    @Test
    public void ratingMapTest() throws IOException {
        new MapDriver&lt;Object, Text, Text, Text&gt;()
                .withMapper(new MovieAverageRateTopK.RatingMapper())
                .withInput(new LongWritable(0), new Text(&quot;userId,movieId,rating,timestamp&quot;))
                .withInput(new LongWritable(1), new Text(&quot;1,1,4.0,964982703&quot;))
                .withInput(new LongWritable(2), new Text(&quot;7,1,4.5,1106635946&quot;))
                .withInput(new LongWritable(3), new Text(&quot;8,2,4.0,839463806&quot;))
                .withInput(new LongWritable(4), new Text(&quot;18,2,3.0,1455617462&quot;))
                .withOutput(new Text(&quot;1&quot;), new Text(&quot;R4.0&quot;))
                .withOutput(new Text(&quot;1&quot;), new Text(&quot;R4.5&quot;))
                .withOutput(new Text(&quot;2&quot;), new Text(&quot;R4.0&quot;))
                .withOutput(new Text(&quot;2&quot;), new Text(&quot;R3.0&quot;))
                .runTest();
    }

    @Test
    public void movieRatingJoinReduceTest() throws IOException {
        new ReduceDriver&lt;Text, Text, Text, Text&gt;()
                .withReducer(new MovieAverageRateTopK.MovieRatingJoinReducer())
                .withInput(new Text(&quot;1&quot;), Arrays.asList(new Text(&quot;MToy Story (1995)&quot;), new Text(&quot;R4.0&quot;), new Text(&quot;R4.5&quot;)))
                .withInput(new Text(&quot;2&quot;), Arrays.asList(new Text(&quot;MJumanji (1995)&quot;), new Text(&quot;R4.0&quot;), new Text(&quot;R3.0&quot;)))
                .withOutput(new Text(&quot;Toy Story (1995)&quot;), new Text(&quot;4.25&quot;))
                .withOutput(new Text(&quot;Jumanji (1995)&quot;), new Text(&quot;3.5&quot;))
                .runTest();

    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022. 08. 04(목) Python 공부 9일차]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-04%EB%AA%A9-Python-%EA%B3%B5%EB%B6%80-9%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-04%EB%AA%A9-Python-%EA%B3%B5%EB%B6%80-9%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 04 Aug 2022 01:18:55 GMT</pubDate>
            <description><![CDATA[<h2 id="반복문while-활용하기">반복문(while) 활용하기</h2>
<h3 id="loop반복문">loop(반복문)</h3>
<ul>
<li>반복적인 작업을 가능하게 해주는 도구</li>
<li>특정 조건을 만족하는 경우 수행할 수 있음(while)</li>
<li>리스트, 문자열, 튜플 등 컬렉션 타입의 아이템을 하나씩 순회하면서 사용 가능 (for)</li>
<li>코드 작업에서, 가장 많이 사용하는 구문 중 하나</li>
<li>주의할점: while을 사용할 경우, <strong>반복을 멈추게 하는 장치가 필요</strong><ul>
<li>그렇지 않으면 셀이 무한히 수행되며, jupyter notebook의 재부팅이 필요</li>
</ul>
</li>
</ul>
<h4 id="while-키워드">while 키워드</h4>
<ul>
<li>while 뒤의 조건이 True일 경우, while 코드 블록을 계속 수행</li>
<li>while 코드 블록<ul>
<li>if와 마찬가지로 while문 아래의 들여쓰기로 작성 된 부분을 의미</li>
</ul>
</li>
<li>조건이 False가 되면 블록 수행을 멈추고 이후 코드를 수행</li>
</ul>
<h4 id="while-키워드-이용하여-리스트의-아이템-출력하기">while 키워드 이용하여 리스트의 아이템 출력하기</h4>
<pre><code class="language-python">    a = [1, 10, 9, 24, 566, 23, 45, 67, 89]
    i = 0 # 인덱스

    while i &lt; len(a):
        print(a[i])        # 1 10 9 24 566 23 45 67 89
        i += 1

</code></pre>
<ul>
<li><p>조건문과 함께 사용하기</p>
<pre><code class="language-python">  a = [1, 10, 9, 24, 566, 23, 45, 67, 89]
  i = 0 # 인덱스

  while i &lt; len(a):
      if a[i] &gt; 20:
          print(a[i])        # 24 566 23 45 67 89
      i += 1</code></pre>
</li>
</ul>
<h4 id="무한-루프">무한 루프</h4>
<ul>
<li>while의 경우 종료가 되지 않도록 코드를 작성하면 블록에서 빠져나올 수 없음</li>
</ul>
<pre><code class="language-python">    while True: # 무한 루프
        print(&#39;haha&#39;)    </code></pre>
<h4 id="break">break</h4>
<ul>
<li><p>loop를 중단할 때 사용</p>
</li>
<li><p>보통 조건문 안에서 수행되며, 조건을 만족하는 경우 loop를 탈출하기 위해 사용</p>
</li>
<li><p>loop를 중단 하는 경우, while 이후의 코드를 수행</p>
<pre><code class="language-python">  a = [1, 10, 9, 24, 566, 23, 45, 67, 89]

  i = 0
  while i &lt; len(a):
      if a[i] &gt; 20:
          break
      print(a[i])        # 1 10 9
      i += 1</code></pre>
</li>
</ul>
<h4 id="continue">continue</h4>
<ul>
<li>break 처럼 반복을 중단하여 빠져나오진 않고, 다시 while 조건으로 점프함</li>
<li>특정한 경우에는 코드를 수행하지 않고 다음으로 건너 뛰기 위해 사용<pre><code class="language-python">  a = 7
  while a &gt; 0;
      a -= 1
      if a == 5:
          continue
      print(a)    # 6 4 3 2 1</code></pre>
</li>
</ul>
<h2 id="반복문for-활용하기">반복문(for) 활용하기</h2>
<ul>
<li>리스트, 문자열 등등 순회 가능한 객체를 순회하면서 값을 처리할 때 사용</li>
<li>아래와 같은 문법으로 사용</li>
<li>여기서 i는 매번 수행 될 때마다, a의 아이템으로 순차적으로 변경 됨</li>
<li>모든 아이템이 순회되면 for 블록 종료<pre><code class="language-python">  a = [1, 2, 3, 4, 5]
  for i in a:
      print (i, i * 2)

</code></pre>
</li>
</ul>
<pre><code>1 2
2 4
4 8
3 6
5 10</code></pre><pre><code>#### 문자열의 아이템 출력하기
- 문자열의 경우 순회 가능, 리스트의 유사하게 순회 가능
```python
    a = &#39;hello world&#39;
    for character in a:
        print(character)</code></pre><h4 id="리스트-아이템-출력하기">리스트 아이템 출력하기</h4>
<pre><code class="language-python">    a = [1, 10, 3, 4, 5]
    for num in a:
        if num % 2 == 0:
            print(num/2)
        else:
            print(num+1)


    2
    5.0
    4
    2.0
    6</code></pre>
<h4 id="dict의-아이템-출력하기">dict의 아이템 출력하기</h4>
<ul>
<li><p>dictionary의 경우 기본적으로 순회 하게 되면 key값을 참조</p>
</li>
<li><p>keys() 함수를 이용하여 key 값만 순회 가능</p>
</li>
<li><p>values() 함수를 이용하여 value 값만 순회 가능</p>
</li>
<li><p>items() 함수를 이용하여 tuple형태로 key, value 순회 가능</p>
<pre><code class="language-python">  a = {&#39;korea&#39; : &#39;seoul&#39;, &#39;japan&#39; : &#39;tokyo&#39;, &#39;canada&#39; : &#39;ottawa&#39;}
  for key in a:
      print(key)
  korea
  japan
  canada

  for value in a.values():
      print(value)

  seoul
  tokyo
  ottawa

  for key, value in a.items():
      print(key, value)

  korea seoul
  japan tokyo
  canada ottawa</code></pre>
</li>
</ul>
<h4 id="for에서-index-사용하기">for에서 index 사용하기</h4>
<ul>
<li>기본적으로 for에 리스트를 순회하는 경우, 값만 추출 함</li>
<li>아래와 같은 코드로 인덱스와 값 모두 사용 가능(enumerate 함수 이용)<pre><code class="language-python">  a = [1, 2, 3, 4, 5]
  for index, num in enumerate(a):
      print(index, num)

</code></pre>
</li>
</ul>
<pre><code>0 1
1 2
2 3
3 4 
4 5</code></pre><pre><code>
#### break
- for의 경우에도 특정 조건일 때, loop 종료가 가능
```python
    a = [100, 90, 80, 70, 60, 50]
    for num in a:
        if num &lt; 80:
            break
        print(num)

    100 
    90
    80</code></pre><h4 id="continue-1">continue</h4>
<ul>
<li><p>해당 아이템을 건너 뛰고 싶을 때 사용</p>
<pre><code class="language-python">  a = [100, 90, 80, 70, 60, 50]
  for num in a:
      if num &gt;= 60 and num &lt;= 70:
          continue
      print(num)    

  100
  90
  80
  50</code></pre>
</li>
</ul>
<h4 id="loop-중첩">loop 중첩</h4>
<ul>
<li><p>반복문의 경우에도 중첩하여 사용 가능</p>
</li>
<li><p>중첩이라는 것은 반복문 블록의 코드안에 또 반복문의 코드가 작성되는 것을 의미</p>
</li>
<li><p>이런 경우, 내부 루프는 외부 루프가 수행되는 만큼 반복 수행 됨</p>
</li>
<li><p>또한 중첩의 경우 무한히 가능</p>
<pre><code class="language-python">  a = [1, 2, 4]
  for i in a:
      for j in a:
          print (i * j)

  1
  2
  4
  2
  4
  8
  4
  8
  16</code></pre>
<h4 id="구구단-출력하기">구구단 출력하기</h4>
<pre><code class="language-python">  x = [2, 3, 4, 5, 6, 7, 8, 9]
  y = [1, 2, 3, 4, 5, 6, 7, 8, 9]

  for i in x:
      for j in y:
          print(i, &#39;x&#39;, j, &#39;=&#39;, i+j)</code></pre>
</li>
</ul>
<h4 id="collection의-길이">collection의 길이</h4>
<ul>
<li>len() 내장함수로 계산 가능</li>
<li>내장함수란 팡썬 내부에 구현되어 있어서, import하지 않고도 사용 가능한 함수를 의미</li>
<li>abs, len, type, range 등이 있음 (과정 진행하면서 필요할 때마다 다룰 예정)<pre><code class="language-python">  a = [1, 2 ,3, 4, 5, 1]
  len(&#39;hello world&#39;)
  11</code></pre>
</li>
</ul>
<h4 id="range-함수">range 함수</h4>
<ul>
<li>리스트를 쉽게 만들 수 있는 내장함수</li>
<li>주어진 값에 따라 다양한 결과를 반환</li>
<li>1 ~ 100까지의 리스트 생성하기<pre><code class="language-python">  a = list(range(1, 101))
</code></pre>
</li>
</ul>
<pre><code>- 연습문제 1부터 100사이의 5의 배수만을 갖는 리스트를 생성하시오
```python
    list(range(1, 101, 5))</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[모두를 위한 딥러닝 - ML Lec 08]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-03%EC%88%98-%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D-8%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-03%EC%88%98-%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D-8%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 03 Aug 2022 05:36:47 GMT</pubDate>
            <description><![CDATA[<h2 id="lec-08-1-딥러닝의-기본-개념-시작과-xor-문제">lec 08-1: 딥러닝의 기본 개념: 시작과 XOR 문제</h2>
<h3 id="ultimate-dream-thinking-machine">Ultimate dream: thinking machine</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/a3ce0f4d-8cf4-4703-8701-e08841f7fb48/image.png" alt=""></p>
<blockquote>
<p>뇌가 굉장히 복잡하게 연결되어있다에 놀랍고, 연결된 부분부분들을 자세히 봤더니 Neuron이라 불리는 유닛이 너무 단순하게 동작이 되더라</p>
</blockquote>
<h3 id="activation-functions">Activation Functions</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/cdd90a25-9eff-40b0-86ea-7375ac877998/image.png" alt=""></p>
<blockquote>
<p>뉴런을 수학적으로 만든것이 Activation Functions 
x의 값을 w랑 곱하고 곱한 값들을 다 더하고 어떤 bias라는 값으로 합한다. 그런다음에 activation function이라는게 있어서 이 합한 값이 어떤 일정 값을 넘어가면 1이라는 신호를 주고 안넘어가면 0 신호를 준다.</p>
</blockquote>
<h3 id="logistic-regression-units">Logistic regression units</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/6a03ba3d-63d7-4b7c-82aa-209c2adb2cb6/image.png" alt=""></p>
<h3 id="hardware-implementations">Hardware implementations</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/f3124880-be2e-4bdf-9e4c-ad3a976cd082/image.png" alt=""></p>
<blockquote>
<p>이 기계를 직접 만들었었다.</p>
</blockquote>
<h3 id="false-promises">False Promises</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/3d6ecc6b-1c32-444a-b9ea-1b5d2ca447bd/image.png" alt=""></p>
<blockquote>
<p>58년도 기사를 보면 &quot;우리가 이런것을 만들어 냈는데 이것이 곧 스스로 학습해서, 걷기도 할 수있고, 말도하고, 볼수도 있고, 글도 쓰고, 자기생산, 더 가관인것은 자기존재를 인식하게 된다&quot; 라고 말했었음</p>
</blockquote>
<h3 id="simpleandor-problem-linearly-separable">(Simple)AND/OR problem: linearly separable?</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/fc40314c-7a4e-44f7-b4a8-6574e552d36d/image.png" alt=""></p>
<blockquote>
<p>or은 x1의 값과 x2의 값이 00 이면 -0 01 10이면 1이고 11이면 1인 형태
and는 00 01 10이면 -0이고 11일때 1인 형태</p>
</blockquote>
<h3 id="simplexor-problem--linearly-separable">(Simple)XOR problem : linearly separable?</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/bd3a6b76-14b2-47db-b667-fb2b2d0b1752/image.png" alt=""></p>
<blockquote>
<p>XOR은 00, 11일때 0, 01 10일때 1이 된다.
XOR은 리니어하게 선을 그어도 절대 구분을 할수가 없다.</p>
</blockquote>
<h3 id="perceptrons1969-by-marvin-minsky-founder-of-the-mit-ai-lab">Perceptrons(1969) by Marvin Minsky, founder of the MIT AI Lab</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/aae8cfbf-9417-4f89-832c-101969166e99/image.png" alt=""></p>
<blockquote>
<p>이 책에서는 당시 년도에서는 XOR을 풀 수 없다라고 함</p>
</blockquote>
<h3 id="no-one-on-earth-had-found-a-viable-way-to-train">&quot;No one on earth had found a viable way to train*&quot;</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/5825531d-cdca-446d-b879-532ac25f2522/image.png" alt=""></p>
<blockquote>
<p>그리고 이런 레이어에서 즉 다시 강조한것이 &quot;아무도 못한다&quot;라고 얘기함</p>
</blockquote>
<h3 id="backpropagation1974-1982-by-paul-werbos-1986-by-hinton">Backpropagation(1974, 1982 by Paul Werbos, 1986 by Hinton)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/8d1ebea7-cef8-4039-abf7-d98ecd78b9aa/image.png" alt=""></p>
<blockquote>
<p>86년도가 되면서 문제가 해결이 됌
Backpropagation 알고리즘은 &quot;뒷부분에서 에러를 구해서 이걸 뒤로 전달해나가면서 각각 진행시켜나가면 어떨까?&quot; 에서 시작됐다.</p>
</blockquote>
<h3 id="convolutional-neural-networks">Convolutional Neural Networks</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/2303af5a-b0ce-4452-8274-fe250851b146/image.png" alt=""></p>
<blockquote>
<p>고양이에게 그림을 보게 한 다음에 시신경에 있는 뉴런이 어떻게 동작하는지 봤는데
그림의 형태에 따라 일부의 뉴런만 활성화되고 다른그림을 주면 다른 뉴런이 활성화되는것을 발견함</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/b1c48616-0af4-45c6-bfd5-28c3abf0b7be/image.png" alt=""></p>
<blockquote>
<p>그림을 한번에 다 학습시키는게 아니라 부분부분 보내서 나중에 합치는 네트워크를 개발하게 되었다.</p>
</blockquote>
<h3 id="a-big-problem">A BIG problem</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/aca101fe-e821-469e-b799-aa32cdbd9f5d/image.png" alt=""></p>
<blockquote>
<p>Backpropagation 알고리즘도 곧 큰 문제에 봉착하게 된다.
이 문제는 에러를 구해서 앞으로 보내게 될때 갈수록 신호가 약해지게 되면서 Layer가 많을수록 에러가 거의 전달되지 않고 학습을 시킬 수 없게 돼 성능이 떨어지게 되었다.</p>
</blockquote>
<h2 id="lec-08-2-딥러닝의-기본-개념2-back-propagation-과-20062007-딥의-출현">lec 08-2: 딥러닝의 기본 개념2: Back-propagation 과 2006/2007 &#39;딥&#39;의 출현</h2>
<h3 id="cifar">CIFAR</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/f9c18629-878e-4267-b7ec-999e7e1613df/image.png" alt=""></p>
<blockquote>
<p>훌륭한 단체, 캐나다에서 세운 연구소인데 연구소를 세우면서 당장 돈이 되고 활용도가 높지 않아도 연구하라고 밀어준 단체이다. 이렇게 되면서 뉴럴 네트워크 전문가였던 Hinton은 캐나다로 이민을 갔다</p>
</blockquote>
<h3 id="everyone-else-was-doing-something-different">&quot;Everyone else was doing something different&quot;</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/ace99696-0f97-405b-a5d2-89beb226da2d/image.png" alt=""></p>
<blockquote>
<p>CIFAR 단체 덕분에 딥러닝이 개발 된듯???</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/e44a3aee-2254-4f54-824c-da78e67a6a04/image.png" alt=""></p>
<blockquote>
<p>2006/2007 년도에 Hinton 교수와 Bengio 교수님이 큰 Breakthrough가 되는 두 논문을 발표하게 된다. </p>
</blockquote>
<blockquote>
<p>초기값을 잘 선택한다면 학습할 수 있다는게 2006 논문
2007 논문에서는 한걸음 더 나아가서 신경망을 구축하면 굉장히 복잡한 문제를 풀 수 있다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/ddd2e675-2a7a-4d48-bf91-f13675410561/image.png" alt=""></p>
<blockquote>
<p>정말 주목을 받게된 계기</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/bdbc0520-2062-4618-b5fa-d16f19d10b8a/image.png" alt=""></p>
<blockquote>
<p>2012년에 모두를 깜짝 놀랄만한 논문이 발표되었는데 Hiton 교수 밑에 있는 Alex 박사과정 학생이 26%오류를 15%로 떨구게 되는 논문을 발표 했다</p>
</blockquote>
<h3 id="neural-networks-that-can-explain-photos">Neural networks that can explain photos</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/fa105e39-261f-4de7-a0c8-b52b5b87d5e9/image.png" alt=""></p>
<blockquote>
<p>그림을 설명할 수 있게 됨</p>
</blockquote>
<h3 id="deep-api-learning">Deep API Learning*</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/38bc49e2-1f9a-4009-bb60-08f2c4c3821d/image.png" alt=""></p>
<h3 id="speech-recognition-errors">Speech recognition errors</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/1e9c0fd3-206c-4fdf-88e2-3a76f5528932/image.png" alt=""></p>
<blockquote>
<p>바이두에서는 노이즈가 많은 환경에서도 사람의 말을 90% 정도 알아 들을 수 있게 개발함</p>
</blockquote>
<h3 id="geoffrey-hintons-summary-of-findings-up-to-today">Geoffrey Hinton&#39;s summary of findings up to today</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/849f38ed-db39-4083-9d37-f011e37659e2/image.png" alt=""></p>
<blockquote>
<p>왜 이전에 잘 안됐을까를 4가지정도로 파악했는데 이것은 다음시간에 공부함</p>
</blockquote>
<h3 id="why-should-i-care">Why should I care?</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/37d71451-0be4-4d6b-b536-06827fbb7da8/image.png" alt=""></p>
<blockquote>
<p>나는 연구자도 아니고 컴공도 아닌데 무슨상관이냐?
이것을 알아두면 굉장히 좋다.</p>
</blockquote>
<blockquote>
<p>이러한 기술이 이미 사용되고 있다 예로 , 유튜브에 있는 자동 자막 기능이 컴퓨터가 딥러닝으로 자막을 단거다.</p>
</blockquote>
<h2 id="ml-lab-08-tensor-manipulation">ML lab 08: Tensor Manipulation</h2>
<h3 id="simple-id-array-and-slicing">Simple ID array and slicing</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/fe2f3b9f-4dfb-4ed2-8bd6-8c70741b3ba2/image.png" alt=""></p>
<h3 id="2d-array">2D Array</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/03b263d3-eb63-4235-bb47-d8ad06e4b9a3/image.png" alt=""></p>
<blockquote>
<p>행렬쓰 4행 3열</p>
</blockquote>
<h3 id="shape-rank-axis">Shape, Rank, Axis</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/befeb455-3d33-4459-b901-dfd388227bc9/image.png" alt=""></p>
<blockquote>
<p>1차원 Array 일 경우 rank = 1, Shape = [4]
2차원 Array 일 경우 rank = 2, Shape = [2, 2]
4차원 Array 일 경우 rank = 4, Shape = [1, 2, 3, 4]</p>
</blockquote>
<h4 id="axis">Axis</h4>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/d89df5eb-4d46-4859-aad4-33cafccbb478/image.png" alt=""></p>
<blockquote>
<p>Axis 같은 경우 제일 안쪽에 있는 값이 큰 값, 바깥쪽으로 나갈경우 작아짐.</p>
</blockquote>
<h3 id="matmul-vs-multiply">Matmul VS multiply</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/07ef8c03-3fa1-480c-945a-4b2128cb4cdf/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/77645bfc-8837-44d1-90bb-438f38cdee2a/image.png" alt=""></p>
<blockquote>
<p>그런데 가끔 matrix 곱을 하지않고 실수로 일반 곱을 했을 경우 matrix곱과 일반 곱의 결과는 다르다.</p>
</blockquote>
<h3 id="broadcasting-warning">Broadcasting (@@@WARNING)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/ae3e553a-c9f5-42f5-87fb-27ad62c877f4/image.png" alt=""></p>
<blockquote>
<p>Shape이 같아야 단순 덧셈이 가능하다</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/8f06a9bf-c903-4273-881a-174da866763b/image.png" alt=""></p>
<blockquote>
<p>그런데 Shape이 달라도 연산을 해줄 수 있게 해주는게 Broadcasting 이다</p>
</blockquote>
<h3 id="reduce-mean">Reduce mean</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/397e7b04-c975-4543-911c-dfb1f72e0725/image.png" alt=""></p>
<blockquote>
<p>.reduce_mean은 평균을 구하는데 그것을 하나로 줄여서 구한다?
axis의 값이 무엇이냐에 따라서 값이 다르게 나온다.</p>
</blockquote>
<h3 id="reduce-sum">Reduce sum</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/3682e7fa-ded8-40bd-8075-dcb1f5c11ceb/image.png" alt=""></p>
<blockquote>
<p>axis의 값이 무엇이냐에 따라서 값이 다르게 나온다.</p>
</blockquote>
<h3 id="argmax">Argmax</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/8fbacd64-12ae-4507-9eb7-c8aadba7c877/image.png" alt=""></p>
<blockquote>
<p>Argmax는 axis의 값에 따라 비교를 하면서 크기를 구하는데 구할때 결과값이 value값이 아니라 인덱스 값으로 나오는듯
axis의 값이 무엇이냐에 따라서 값이 다르게 나온다.</p>
</blockquote>
<h3 id="reshape--별이-두개-중요-">reshape** ( 별이 두개! 중요 !)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/b7ef01dd-b1cf-43ad-8de7-2dac88c310cf/image.png" alt=""></p>
<blockquote>
<p>안에거는 3 앞에는 너 알아서해?!
reshape을 할 때 보통 가장 안쪽의 값은 건드리지 않음</p>
</blockquote>
<h3 id="reshape-squeeze-expand">Reshape (squeeze, expand)</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/f57ce98b-c870-473b-8d87-f2acf9cb6624/image.png" alt=""></p>
<blockquote>
<p>squeeze는 개별적인 값으로 되어 있을때 하나의 값으로 표현시켜준다?
expand는 쉐입을 변경시키는 값?</p>
</blockquote>
<h3 id="one-hot">One hot</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/b6a9bc6c-e1cc-443f-8c96-05f24633502c/image.png" alt=""></p>
<h3 id="casting">Casting</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/651efe6f-5ad0-4c05-881e-b701d506264d/image.png" alt=""></p>
<blockquote>
<p>주어진 tensor에서 True, False 값을 0이나 1로</p>
</blockquote>
<h3 id="stack">Stack</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/cd6d8746-0555-45a7-8bc0-e711abca1338/image.png" alt=""></p>
<blockquote>
<p>여러개 변수의 값을 하나로 쌓되 axis의 값에 따라 다르게 쌓아짐</p>
</blockquote>
<h3 id="ones-and-zeros-like">Ones and Zeros like</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/43ab8b19-8221-4dc3-9ad4-f5af4b352855/image.png" alt=""></p>
<blockquote>
<p>비슷한 모양이나 똑같은것으로 0또는 1로된 Tensor를 만들고 싶을 때
ones 로 하면 1로 zeros로 하면 0으로</p>
</blockquote>
<h3 id="zip">Zip</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/8b899f34-1852-4f29-b12e-0ac10c2646e4/image.png" alt=""></p>
<blockquote>
<p>복수개의 Tensor를 가지고 있을 때 Zip으로 묶어서 한방에 처리 할 때</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022. 08. 03(수) Spark & Hadoop 초격차 8일차]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-03%EC%88%98-Spark-Hadoop-%EC%B4%88%EA%B2%A9%EC%B0%A8-8%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-03%EC%88%98-Spark-Hadoop-%EC%B4%88%EA%B2%A9%EC%B0%A8-8%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 03 Aug 2022 04:35:32 GMT</pubDate>
            <description><![CDATA[<h2 id="mrunit을-이용한-unit-test">MRUnit을 이용한 Unit Test</h2>
<h3 id="wordcounttest">wordCountTest</h3>
<pre><code class="language-java">package com.fastcampus.hadoop;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mrunit.mapreduce.MapDriver;
import org.apache.hadoop.mrunit.mapreduce.MapReduceDriver;
import org.apache.hadoop.mrunit.mapreduce.ReduceDriver;
import org.apache.hadoop.mrunit.types.Pair;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class WordCountTest {
    MapDriver&lt;Object, Text, Text, IntWritable&gt; mapDriver;
    ReduceDriver&lt;Text, IntWritable, Text, IntWritable&gt; reduceDriver;
    MapReduceDriver&lt;Object, Text, Text, IntWritable, Text, IntWritable&gt; mapReduceDriver;

    @Before
    public void Setup() {
        mapDriver = new MapDriver&lt;&gt;(new WordCount.TokenizerMapper());
        reduceDriver = new ReduceDriver&lt;Text, IntWritable, Text, IntWritable&gt;(new WordCount.IntSumReducer());
        mapReduceDriver = new MapReduceDriver&lt;&gt;(new WordCount.TokenizerMapper(), new WordCount.IntSumReducer());
    }

    @Test
    public void wordCountMapTest() throws IOException {
        new MapDriver&lt;Object, Text, Text, IntWritable&gt;()
                .withMapper(new WordCount.TokenizerMapper())
                .withInput(new LongWritable(0L), new Text(&quot;dog dog cat cat owl cat&quot;))
                .withOutput(new Text(&quot;dog&quot;), new IntWritable(1))
                .withOutput(new Text(&quot;dog&quot;), new IntWritable(1))
                .withOutput(new Text(&quot;cat&quot;), new IntWritable(1))
                .withOutput(new Text(&quot;cat&quot;), new IntWritable(1))
                .withOutput(new Text(&quot;owl&quot;), new IntWritable(1))
                .withOutput(new Text(&quot;cat&quot;), new IntWritable(1))
                .runTest();
    }

    @Test
    public void wordCountMapTest2() throws IOException {
        List&lt;Pair&lt;Text, IntWritable&gt;&gt; result = mapDriver.withInput(new LongWritable(0L), new Text(&quot;dog dog cat cat owl cat&quot;))
                .run();
        System.out.println(result);
    }

    @Test
    public void wordCountReduceTest() throws IOException {
        new ReduceDriver&lt;Text, IntWritable, Text, IntWritable&gt;()
                .withReducer(new WordCount.IntSumReducer())
                .withInput(new Text(&quot;cat&quot;), Arrays.asList(new IntWritable(1), new IntWritable(1), new IntWritable(1)))
                .withInput(new Text(&quot;dog&quot;), Arrays.asList(new IntWritable(1), new IntWritable(1)))
                .withInput(new Text(&quot;owl&quot;), Arrays.asList(new IntWritable(1)))
                .withOutput(new Text(&quot;cat&quot;), new IntWritable(3))
                .withOutput(new Text(&quot;dog&quot;), new IntWritable(2))
                .withOutput(new Text(&quot;owl&quot;), new IntWritable(1))
                .runTest();
    }

    @Test
    public void wordCountReduceTest2() throws IOException {
        List&lt;Pair&lt;Text, IntWritable&gt;&gt; result =  reduceDriver
                .withInput(new Text(&quot;cat&quot;), Arrays.asList(new IntWritable(1), new IntWritable(1), new IntWritable(1)))
                .withInput(new Text(&quot;dog&quot;), Arrays.asList(new IntWritable(1), new IntWritable(1)))
                .withInput(new Text(&quot;owl&quot;), Arrays.asList(new IntWritable(1)))
                .run();

        System.out.println(result);
    }

    @Test
    public void wordCountTest() throws IOException {
        mapReduceDriver
                .withInput(new LongWritable(0L), new Text(&quot;dog dog cat cat owl cat&quot;))
                .withOutput(new Text(&quot;cat&quot;), new IntWritable(3))
                .withOutput(new Text(&quot;dog&quot;), new IntWritable(2))
                .withOutput(new Text(&quot;owl&quot;), new IntWritable(1))
                .runTest();;
    }

    @Test
    public void wordCountTest2() throws IOException {
        List&lt;Pair&lt;Text, IntWritable&gt;&gt; result = mapReduceDriver
                .withInput(new LongWritable(0L), new Text(&quot;dog dog cat cat owl cat&quot;))
                .run();
        System.out.println(result);
    }

    @Test
    public void wordCountWithCounter() throws IOException {
        MapDriver&lt;Object, Text, Text, IntWritable&gt; mapDriver1 = new MapDriver&lt;&gt;(new WordCountWithCounter.TokenizerMapper());
        mapDriver1
                .withInput(new LongWritable(0L), new Text(&quot;&#39;hello&#39; &#39;world fastcampus hadoop !!&#39;&quot;))
                .run();
        System.out.println(mapDriver1.getCounters().findCounter(WordCountWithCounter.Word.WITHOUT_SPECIAL_CHARACTER).getValue());
        System.out.println(mapDriver1.getCounters().findCounter(WordCountWithCounter.Word.WITH_SPECIAL_CHARACTER).getValue());
    }
}
</code></pre>
<h2 id="mockito를-이용한-unit-test">Mockito를 이용한 Unit Test</h2>
<h3 id="wordcounttest-with-mockito">wordCountTest With mockito</h3>
<pre><code class="language-java">package com.fastcampus.hadoop;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Counter;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.junit.Test;
import com.fastcampus.hadoop.WordCount.TokenizerMapper;
import org.mockito.InOrder;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import static org.mockito.Mockito.*;

public class WordCountTestWithMockito {
    @Test
    public void wordCountMapTest() throws IOException, InterruptedException {
        TokenizerMapper mapper = new TokenizerMapper();
        Mapper.Context context = mock(Mapper.Context.class);
        mapper.word = mock(Text.class);
        mapper.map(new LongWritable(0), new Text(&quot;dog dog cat&quot;), context);

        InOrder inOrder = inOrder(mapper.word, context);
        inOrder.verify(mapper.word).set(eq(&quot;dog&quot;));
        inOrder.verify(context).write(eq(mapper.word), eq(new IntWritable(1)));
        inOrder.verify(mapper.word).set(eq(&quot;dog&quot;));
        inOrder.verify(context).write(eq(mapper.word), eq(new IntWritable(1)));
        inOrder.verify(mapper.word).set(eq(&quot;cat&quot;));
        inOrder.verify(context).write(eq(mapper.word), eq(new IntWritable(1)));
    }
    @Test
    public void wordCountReduceTest() throws IOException, InterruptedException {
        WordCount.IntSumReducer reducer = new WordCount.IntSumReducer();
        Reducer.Context context = mock(Reducer.Context.class);

        List&lt;IntWritable&gt; values = Arrays.asList(new IntWritable(1), new IntWritable(1));

        reducer.reduce(new Text(&quot;dog&quot;), values, context);
        verify(context).write(new Text(&quot;dog&quot;), new IntWritable(2));
    }

    @Test
    public void counterTest() throws IOException, InterruptedException {
        WordCountWithCounter.TokenizerMapper mapper = new WordCountWithCounter.TokenizerMapper();
        Mapper.Context context = mock(Mapper.Context.class);
        Counter counter = mock(Counter.class);
        when(context.getCounter(WordCountWithCounter.Word.WITHOUT_SPECIAL_CHARACTER)).thenReturn(counter);

        mapper.map(new LongWritable(0), new Text(&quot;dog dog cat&quot;), context);

        verify(counter, times(3)).increment(1);
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022. 08. 03(수) Python 공부 8일차]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-03%EC%88%98-Python-%EA%B3%B5%EB%B6%80-8%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-03%EC%88%98-Python-%EA%B3%B5%EB%B6%80-8%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 03 Aug 2022 01:24:19 GMT</pubDate>
            <description><![CDATA[<h2 id="컬렉션-타입의-이해">컬렉션 타입의 이해</h2>
<h3 id="tuple">tuple</h3>
<ul>
<li><p>리스트와 같이 복수개의 값을 갖는 컬렉션 타입</p>
</li>
<li><p>생성된 후 변경이 불가능</p>
<pre><code class="language-python">  a = [1, 2, 3]
  b = (1, 2, 3)

  print(type(a))
  print(type(b))

  a[0] = 100
  print(a)

  b[0] = 100
  print(b)



</code></pre>
</li>
</ul>
<pre><code>&lt;class &#39;list&#39;&gt;
&lt;class &#39;tuple&#39;&gt;
[100, 2, 3]</code></pre><pre><code>![](https://velog.velcdn.com/images/eastgun_/post/a0a757da-edb4-46d7-a9c5-fd5b43a034d5/image.png)


#### typle unpacking
- 튜플의 값을 차례대로 변수에 대입
```python
    a, b, c = 100, 200
    print(a, b, c)

    100 200</code></pre><ul>
<li><p>연습문제 : a와 b의 값을 교환하시오</p>
<pre><code class="language-python">  a = 5
  b = 4

  print(a, b)

  # 일반적인 logic
  temp = a
  a = b
  b = temp

  # 파이썬은 튜플의 언팩킹으로 쉽게 교환 가능
  a, b = b, a

  print(a, b)

  5 4
  4 5</code></pre>
</li>
</ul>
<h3 id="dictionary">dictionary</h3>
<ul>
<li><p>키와 값을 갖는 데이터 구조</p>
</li>
<li><p>키는 내부적으로 ahsh값으로 저장</p>
</li>
<li><p>순서를 따지지 않음. <strong>즉, 인덱스가 없음</strong></p>
<pre><code class="language-python">  # dictionary 은 중괄호를 사용함
  a = {&#39;Korea&#39; : &#39;Seoul&#39;, 
       &#39;Canada&#39;: &#39;Ottawa&#39;, 
       &#39;USA&#39;: &#39;Washington D.C&#39; }

  b = {0:1, 1:6, 7:9, 8:10}
  type(b)        # dict
  print(b[0])    # 인덱스값을 찾는게 아니라 b의 딕셔너리 값들이 상수여서 상수 0을 찾는것

  print(a)    # {&#39;Korea&#39; : &#39;Seoul&#39;, &#39;Canada&#39;: &#39;Ottawa&#39;, &#39;USA&#39;: &#39;Washington D.C&#39; }
  print(a[&#39;Korea&#39;])    # Seoul</code></pre>
</li>
<li><p><strong>항목 추가 및 변경</strong></p>
<ul>
<li><p>기존에 키가 존재 하면, 새로운 값으로 업데이트</p>
</li>
<li><p>존재하지 않으면, 새로운 키, 값 생성</p>
<pre><code class="language-python">a = {&#39;Korea&#39; : &#39;Seoul&#39;, 
     &#39;Canada&#39;: &#39;Ottawa&#39;, 
     &#39;USA&#39;: &#39;Washington D.C&#39; }

a[&#39;Japan&#39;] = &#39;Tokyo&#39;
a[&#39;China&#39;] = &#39;Beijing&#39;

print(a)    # {&#39;Korea&#39; : &#39;Seoul&#39;, &#39;Canada&#39;: &#39;Ottawa&#39;, &#39;USA&#39;: &#39;Washington D.C&#39;, &#39;Japan&#39;:&#39;Tokyo&#39;, &#39;China&#39;:&#39;Beijing&#39; }</code></pre>
</li>
</ul>
</li>
<li><p><strong>update()</strong></p>
<ul>
<li>두 딕셔너리를 병합함</li>
<li>겹치는 키가 있다면 parameter로 전달되는 키 값이 overwrite된다.<pre><code class="language-python">a = {&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}
b = {&#39;a&#39;: 2, &#39;d&#39;: 4, &#39;e&#39;: 5}
</code></pre>
</li>
</ul>
<p>a.update(b)</p>
<p>print(a)
{&#39;a&#39;: 2, &#39;b&#39;: 2, &#39;c&#39;: 3, &#39;d&#39;: 4, &#39;e&#39;: 5}
```</p>
</li>
<li><p><strong>key 삭제</strong></p>
<ul>
<li>del 키워드 사용</li>
<li>pop 함수 이용<pre><code class="language-python">a = {&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}
print(a)    # {&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}
</code></pre>
</li>
</ul>
<p>a.pop(&#39;b&#39;)
del a[&#39;b&#39;] # 범용적으로 지울 수 있는 del
print(a)    # {&#39;a&#39;: 1, &#39;c&#39;: 3}</p>
<pre><code></code></pre></li>
<li><p><strong>clear()</strong></p>
<ul>
<li>딕셔너리의 모든 값을 초기화<pre><code class="language-python">a = {&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}
print(a)    # {&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}
a.clear()
print(a)    # {}</code></pre>
</li>
</ul>
</li>
<li><p><strong>in</strong></p>
<ul>
<li>key값 존재 확인</li>
<li>O(1) 연산 - 딕셔너리의 크기와 관계없이 항상 연산의 속도가 일정하다는 의미<pre><code class="language-python">a = {&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}
print(a)    # {&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}
</code></pre>
</li>
</ul>
<p>&#39;b&#39; in a    # True
&#39;d&#39; in a    # False ## dict의 in은 갯수가 무수히 많든 바로 찾음
```</p>
</li>
<li><p><strong>value access</strong></p>
<ul>
<li><p>dict[key]로 접근, 키가 없는 경우 에러 발생
<img src="https://velog.velcdn.com/images/eastgun_/post/6abb1e8e-4c62-444c-9aeb-76f0e97dea46/image.png" alt=""></p>
</li>
<li><p>.get() 함수로 접근, 키가 없는 경우 None반환
<img src="https://velog.velcdn.com/images/eastgun_/post/37663e5c-509e-467d-aa06-bcbc2503b2c9/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h4 id="모든-keys-values-접근">모든 keys, values 접근</h4>
<ul>
<li><p>keys() - 키만 반환</p>
</li>
<li><p>values() - 값만 반환</p>
</li>
<li><p>items() - 키, 값의 튜플을 반환</p>
<pre><code class="language-python">   a = {&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}
  print(a)                 # {&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}
  print(a.keys())            # dict_keys([&#39;a&#39;, &#39;b&#39;, &#39;c&#39;])
  print(a.values())        # dict_values([1, 2, 3])

  print(list(a.keys()))    # [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]    ## list로 변환가능
  print(list(a.values()))    # [1, 2, 3]            ## list로 변환 가능

  list(a.items())            # [(&#39;a&#39;, 1), (&#39;b&#39;, 2), (&#39;c&#39;, 3)]</code></pre>
</li>
</ul>
<h3 id="set">set</h3>
<ul>
<li><p>dictionary에서 key만 활용하는 데이터 구조로 이해</p>
</li>
<li><p>수학에서의 집합과 동일한 개념</p>
<pre><code class="language-python">  a = {1, 1, 2, 3, 3, 4, 1, 5}
  print(a)    # {1, 2, 3, 4, 5}        ## 중복을 제거해서 출력함
  print(a[0])    # 인덱스 값이 없어 오류남</code></pre>
</li>
<li><p><strong>set()으로 집합으로 변환</strong></p>
<pre><code class="language-python">  a = set()        # 빈 set을 생성함
  a = [1, 1, 2, 3, 3, 4, 1, 5]
  print(a)    # [1, 1, 2, 3, 3, 4, 1, 5]

  b = set(a)
  print(b)    # {1, 2, 3, 4, 5}
</code></pre>
</li>
</ul>
<pre><code>- **set operations**
  - 수학 연산과 동일
  - 교집합, 합집합, 차집합 등 지원
```python
    a = {1, 2, 3}
    b = {2, 3, 4}

    print(a.union(b))        # {1, 2, 3, 4}    ## 합집합
    print(a.intersection(b))# {2, 3}        ## 교집합
    print(a.difference(b))    # {1}            ## 차집합
    print(a.issubset(b))    # False            ## 부분 집합

</code></pre><h2 id="조건문if-elif-else-활용하기">조건문(if, elif, else) 활용하기</h2>
<h3 id="condition-조건문">condition (조건문)</h3>
<ul>
<li><p>특정 조건을 만족하는 경우에만 수행할 작업이 있는 경우 사용</p>
</li>
<li><p>모든 조건은 boolean으로 표현 됨 (예외 사항은 아래 배울 예정)</p>
</li>
<li><p>if, elif, else 키워드가 사용</p>
</li>
<li><p>조건문의 경우 if, elif, else 블록에 종속된 코드는 들여쓰기로 표현 가능</p>
</li>
<li><p>즉 아래코드에서와 같이, 조건문 아래에 들여쓰기된 2줄의 코드만이 조건문의 조건에 따라 수행될 수도, 수행되지 않을 수도 있는 코드라고 할 수 있음</p>
</li>
<li><p>들여쓰기 된 코드를 블록(block), 또는 코드블록이라고 함</p>
</li>
<li><p>python에서 모든 블록의 시작점의 마지막에는 :(콜론, colon) 추가가 필요</p>
<pre><code class="language-python">  if 6 &gt;= 5:
      print (&#39;6 is greater than 5&#39;)
      print (&#39;Yeah, it is true&#39;)
  print (&#39;This code is not belongs to if statements&#39;)</code></pre>
</li>
<li><p>Logical AND, OR, NOT</p>
<ul>
<li>조건문에 사용되는 조건의 경우, boolean이기 때문에, 논리식 AND, OR, NOT이 사용 가능</li>
<li>AND : and</li>
<li>OR : or</li>
<li>NOT : not</li>
</ul>
</li>
<li><p>논리표</p>
<ul>
<li>AND<ul>
<li>T AND T : T</li>
<li>T AND F : F</li>
<li>F AND T : F</li>
<li>F AND F : F</li>
</ul>
</li>
<li>OR<ul>
<li>T OR T : T</li>
<li>T OR F : T</li>
<li>F OR T : T</li>
<li>F OR F : F</li>
</ul>
</li>
<li>NOT<ul>
<li>NOT T : F</li>
<li>NOT F : T</li>
</ul>
</li>
</ul>
</li>
<li><p>우선순위</p>
<ul>
<li>NOT &gt; AND &gt; OR</li>
</ul>
</li>
</ul>
<h4 id="if의-조건이-bool이-아닌-경우">if의 조건이 bool이 아닌 경우</h4>
<ul>
<li>일반적으로는 조건문에는 bool이 주로 위치 함</li>
<li>하지만, 정수, 실수, 문자열 리스트 등 기본 타입도 조건에 사용 가능</li>
<li>False로 간주되는 값( 각 타입의 기본값)<ul>
<li>None</li>
<li>0</li>
<li>0.0</li>
<li>&#39;&#39;</li>
<li>[] -&gt; 빈 리스트</li>
<li>() -&gt; 빈 튜플</li>
<li>{} -&gt; 빈 딕셔너리</li>
<li>set() -&gt; 빈 집합</li>
</ul>
</li>
<li>그 밖에는 모두 True로 간주</li>
</ul>
<h4 id="if-else">if, else</h4>
<ul>
<li><p>if가 아닌 경우, 나머지 조건을 표현하고 싶다면 바로 아래 else 블락 사용</p>
</li>
<li><p>이 경우, if조건이 True인 경우, if 블락의 코드가 수행, 거짓인 경우 else 블락의 코드가 수행</p>
</li>
<li><p>주의 할 점: if와 else사이에 다른 코드 삽입 불가</p>
<pre><code class="language-python">  # 짝수인 경우에는 2로 나눈 값을 출력하고
  # 홀수인 경우에는 1을 더한 값을 출력해라

  a = 10
  if a % 2 == 0:    # 짝수인지 판별
      print(a / 2)
  else:
      print(a + 1)

  5.0</code></pre>
</li>
</ul>
<h4 id="if-elif-else">if, elif, else</h4>
<ul>
<li>조건이 여러개인 경우, 다음 조건을 elif 블록에 명시 가능</li>
<li>이 경우, 각 조건을 확인 후, True인 조건의 코드 브락을 실행 한 후, 전체 if, elif, else 구문을 종료</li>
<li>조건문을 사용할 때는, if 이후, 0개 이상의 elif를 사용 가능하며 0개 또는 1개의 else를 사용 가능함
<img src="https://velog.velcdn.com/images/eastgun_/post/92c295d7-ed2e-4d5e-83a4-7f80f36fdc78/image.png" alt=""></li>
</ul>
<h3 id="중첩-조건문nested-condition">중첩 조건문(nested condition)</h3>
<ul>
<li><p>조건문의 경우 중첩하여 작성 가능</p>
</li>
<li><p>중첩의 의미는 depth(깊이)로 생각할 수 있으며, depth의 제한은 없음</p>
<pre><code class="language-python">  a = 10
  b = 9
  c = 8

  if a == 10:
      if c == 8:
          if b == 8:
              print(&#39;a is ten and b is 8&#39;)
          else:
              print(&#39;a is ten and b is not 8&#39;)</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022. 08. 02(화) Spark & Hadoop 초격차 7일차]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-02%ED%99%94-Spark-Hadoop-%EC%B4%88%EA%B2%A9%EC%B0%A8-7%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-02%ED%99%94-Spark-Hadoop-%EC%B4%88%EA%B2%A9%EC%B0%A8-7%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 03 Aug 2022 00:00:55 GMT</pubDate>
            <description><![CDATA[<h2 id="reduce-side-join-실습-2">Reduce-side join 실습 2</h2>
<h4 id="순서">순서</h4>
<ol>
<li>정렬하고자 하는 값을 포함하는 <strong>복합 키 클래스 정의</strong></li>
<li>정의한 복합키를 통해서 어느 리듀스에게 전달될지 결정하는 <strong>파티셔너 클래스 정의</strong></li>
<li>리듀스에 입력될 값을 <strong>그룹핑해주는 클래스 정의</strong></li>
<li>리듀스에 입력을 <strong>키를 기준으로 정렬해 주기위한 클래스를 정의</strong></li>
</ol>
<h3 id="1-texttext-클래스---복합-키-클래스-정의">1. TextText 클래스 - 복합 키 클래스 정의</h3>
<pre><code class="language-python">package com.fastcampus.hadoop;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public class TextText implements WritableComparable&lt;TextText&gt; {
    private Text first;
    private Text second;

    // 생성자 정의
    public TextText() {
        set(new Text(), new Text());
    }

    public TextText(String first, String second) {
        set(new Text(first), new Text(second));
    }

    public TextText(Text first, Text second) {
        set(first, second);
    }

    public void set(Text first, Text second) {
        this.first = first;
        this.second = second;
    }

    public Text getFirst() {
        return first;
    }

    public Text getSecond() {
        return second;
    }

    @Override
    public int compareTo(TextText o) {
        // 첫번 째 들어있는 first 값들을 기준으로 비교를 하고
        int cmp = first.compareTo(o.first);
        // 일치하지 않을 때에
        if (cmp != 0) {
            return cmp;
        }

        // 일치할땐 second 값들을 리턴
        return second.compareTo(o.second);
    }

    /** Writable 인터페이스 밑에 있는 두개의 메소드를 재정의 */
    // 직렬화를 위한
    @Override
    public void write(DataOutput out) throws IOException {
        first.write(out);
        second.write(out);
    }

    // 직렬화된 데이터를 읽을 때
    @Override
    public void readFields(DataInput in) throws IOException {
        first.readFields(in);
        second.readFields(in);
    }

    // Hashcode 재정의
    @Override
    public int hashCode() {
        // 해쉬코드 값을 재정의 할때는 소수를 많이 곱해줌
        return first.hashCode() * 163 + second.hashCode();
    }

    // equals 재정의
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof TextText) {
            TextText tt = (TextText) obj;
            return first.equals(tt.first) &amp;&amp; second.equals(tt.second);
        }

        return false;
    }

    // toString 재정의
    @Override
    public String toString() {
        return first.toString() + &quot;, &quot; + second.toString();
    }
}
</code></pre>
<h3 id="2-keypartitioner-클래스---파티셔너-클래스-정의">2. KeyPartitioner 클래스 - 파티셔너 클래스 정의</h3>
<pre><code class="language-python">// 파티셔너 클래스 정의
    public static class KeyPartitioner extends Partitioner&lt;TextText, Text&gt; {
        @Override
        public int getPartition(TextText key, Text value, int numPartitions) {
            return (key.getFirst().hashCode() &amp; Integer.MAX_VALUE) % numPartitions;
        }
    }</code></pre>
<h3 id="3-groupcomparator-클래스---그룹핑-클래스-정의">3. GroupComparator 클래스 - 그룹핑 클래스 정의</h3>
<pre><code class="language-python">// 그룹핑 클래스 정의
    public static class GroupComparator extends WritableComparator {
        protected GroupComparator() {
            super(TextText.class, true);
        }

        @Override
        public int compare(WritableComparable a, WritableComparable b) {
            TextText t1 = (TextText) a;
            TextText t2 = (TextText) b;
            return t1.getFirst().compareTo(t2.getFirst());
        }
    }</code></pre>
<h3 id="4-keycomparator-클래스---키-정렬-클래스-정의">4. KeyComparator 클래스 - 키 정렬 클래스 정의</h3>
<pre><code class="language-python">// 키 정렬 클래스 정의
    public static class KeyComparator extends WritableComparator {
        protected KeyComparator() {
            super(TextText.class, true);
        }

        @Override
        public int compare(WritableComparable a, WritableComparable b) {
            TextText t1 = (TextText) a;
            TextText t2 = (TextText) b;
            int cmp = t1.getFirst().compareTo(t2.getFirst());
            if (cmp != 0) {
                return cmp;
            }
            return t1.getSecond().compareTo(t2.getSecond());
        }
    }</code></pre>
<h3 id="전체-코드">전체 코드</h3>
<pre><code class="language-python">package com.fastcampus.hadoop;

import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Partitioner;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.MultipleInputs;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import java.io.IOException;
import java.util.Iterator;

public class ReduceSideJoinCustomkey extends Configured implements Tool {
    static enum DataType {
        DEPARTMENT(&quot;a&quot;), EMPLOYEE(&quot;b&quot;);

        DataType(String value) {
            this.value = value;
        }
        private final String value;
        public String value() {
            return value;
        }
    }

    public static class DepartmentMapper extends Mapper&lt;LongWritable, Text, TextText, Text&gt; {
        TextText outKey = new TextText();
        Text outValue = new Text();

        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            // dept_no, dept_name
            String[] split = value.toString().split(&quot;,&quot;);

            outKey.set(new Text(split[0]), new Text(DataType.DEPARTMENT.value));
            outValue.set(split[1]);
            context.write(outKey, outValue);
        }
    }

    public static class EmployeeMapper extends  Mapper&lt;LongWritable, Text, TextText, Text&gt; {
        TextText outKey = new TextText();
        Text outValue = new Text();

        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            // emp_no, birth_date, first_name, last_name, gender, hire_date, dept_no
            String[] split = value.toString().split(&quot;,&quot;);

            outKey.set(new Text(split[6]), new Text(DataType.EMPLOYEE.value));
            outValue.set(new Text(split[0] + &quot;\t&quot; + split[2] + &quot;\t&quot; + split[4]));
            context.write(outKey, outValue);
        }
    }

    public static class ReduceJoinReducer extends Reducer&lt;TextText, Text, Text, Text&gt; {
        Text outKey = new Text();
        Text outValue = new Text();

        @Override
        protected void reduce(TextText key, Iterable&lt;Text&gt; values, Context context) throws IOException, InterruptedException {
            Iterator&lt;Text&gt; iter = values.iterator();

            // 항상 values에는 values로  값이 전달 될땐 두번째의 키 값으로 정렬이 되어 있기 떄문에 항상 department text가 먼저 오게 된다.
            String departmentText = iter.next().toString();

            while (iter.hasNext()) {
                Text employeeText = iter.next();
                String[] employeeSplit = employeeText.toString().split(&quot;\t&quot;);
                outKey.set(employeeSplit[0]);
                outValue.set(employeeSplit[1] + &quot;\t&quot; + employeeSplit[2] + &quot;\t&quot; + departmentText);
                context.write(outKey, outValue);
            }
        }
    }

    // 키 정렬 클래스 정의
    public static class KeyComparator extends WritableComparator {
        protected KeyComparator() {
            super(TextText.class, true);
        }

        @Override
        public int compare(WritableComparable a, WritableComparable b) {
            TextText t1 = (TextText) a;
            TextText t2 = (TextText) b;
            int cmp = t1.getFirst().compareTo(t2.getFirst());
            if (cmp != 0) {
                return cmp;
            }
            return t1.getSecond().compareTo(t2.getSecond());
        }
    }

    // 그룹핑 클래스 정의
    public static class GroupComparator extends WritableComparator {
        protected GroupComparator() {
            super(TextText.class, true);
        }

        @Override
        public int compare(WritableComparable a, WritableComparable b) {
            TextText t1 = (TextText) a;
            TextText t2 = (TextText) b;
            return t1.getFirst().compareTo(t2.getFirst());
        }
    }

    // 파티셔너 클래스 정의
    public static class KeyPartitioner extends Partitioner&lt;TextText, Text&gt; {
        @Override
        public int getPartition(TextText key, Text value, int numPartitions) {
            return (key.getFirst().hashCode() &amp; Integer.MAX_VALUE) % numPartitions;
        }
    }

    // 드라이버 정의
    @Override
    public int run(String[] args) throws Exception {
        Job job = Job.getInstance(getConf(), &quot;ReduceSideJoinCustomKey&quot;);

        job.setJarByClass(ReduceSideJoinCustomkey.class);
        job.setReducerClass(ReduceJoinReducer.class);
        job.setMapOutputKeyClass(TextText.class);
        job.setMapOutputValueClass(Text.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        job.setPartitionerClass(KeyPartitioner.class);
        job.setSortComparatorClass(KeyComparator.class);
        job.setGroupingComparatorClass(GroupComparator.class);

        MultipleInputs.addInputPath(job, new Path(args[0]), TextInputFormat.class, EmployeeMapper.class);
        MultipleInputs.addInputPath(job, new Path(args[1]), TextInputFormat.class, DepartmentMapper.class);

        FileOutputFormat.setOutputPath(job, new Path(args[2]));
        return job.waitForCompletion(true) ? 0 : 1;
    }

    public static void main(String[] args) throws Exception {
        int exitCode = ToolRunner.run(new ReduceSideJoinCustomkey(), args);
        System.exit(exitCode);
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/a8e15de0-6ea9-45b0-87a7-7137147adfae/image.png" alt="">
<img src="https://velog.velcdn.com/images/eastgun_/post/08dff311-3a6a-4ba6-aced-ce9982fe6c5c/image.png" alt=""></p>
<h4 id="실행-결과">실행 결과</h4>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/02f5e98c-fd40-42a0-9e96-e416e377a883/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[모두를 위한 딥러닝 - ML Lec 07]]></title>
            <link>https://velog.io/@eastgun_/2022.-08.-02%ED%99%94-%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D-7%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@eastgun_/2022.-08.-02%ED%99%94-%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D-7%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 02 Aug 2022 05:24:17 GMT</pubDate>
            <description><![CDATA[<h2 id="lec-07-1-학습-rate-overfitting-그리고-일반화-regularization">lec 07-1: 학습 rate, Overfitting, 그리고 일반화 (Regularization)</h2>
<h3 id="gradient-descent">Gradient descent</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/0999355a-e4bb-4ea9-9208-c60046a20c43/image.png" alt=""></p>
<blockquote>
<p>우리가 cost function을 정의하고 그 cost function을 최소화하는 값을 찾기 위해서 사용 했던 Gradient descent 알고리즘 이다.</p>
</blockquote>
<h3 id="large-learning-rate--overshooting">Large learning rate : overshooting</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/6a1f14ca-02a3-499a-be20-20c42eb89f35/image.png" alt=""></p>
<blockquote>
<p>러닝 레이트를 잘 정하는게 중요한데 만약에 이 값을 엄청 크게 주었다고 가정해 보자.
그럴 땐 그래프 바깥으로 튕겨나가버릴 수 있다. 이렇게하면 학습이 이루어지지 않을 뿐만 아니라 코스트펑션을 출력할 때 숫자가 아닌 값들이 찍혀나올 수 있다. 이러한 현상을 Overshooting 이라 한다. </p>
</blockquote>
<h3 id="small-learning-rate--takes-too-long-stops-at-local-minimum">Small learning rate : takes too long, stops at local minimum</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/72fdd87c-07d2-4b8f-8082-30447eb5b936/image.png" alt=""></p>
<blockquote>
<p>반대로 굉장히 작은 러닝 레이트를 지정해준다면 지정한 횟수를 수행하고도 최저점을 못찾고 중간에 멈춰버릴 수 있다.</p>
</blockquote>
<h3 id="try-several-learning-rates">Try several learning rates</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/7ecd5073-fc77-40d3-a073-6a3296f31372/image.png" alt=""></p>
<blockquote>
<p>전반적으로는 러닝 레이트를 정하는 것에 특별한 방법은 없다.가진 환경에 따라 다 다르기 때문에 보통 0.01로 시작을 많이 하고 오버슈팅이 일어나면 작게 반대로 너무 적게 움직여서 끝나는거같으면 크게 올리면 된다.</p>
</blockquote>
<h3 id="data-x-preprocessing-for-gradient-descent">Data (X) preprocessing for gradient descent</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/297809b4-7371-4946-894d-f49274d9100a/image.png" alt=""></p>
<blockquote>
<p>데이터를 사전처리해야할 이유가 있는데, 우리가 가장 많이 사용하는 알고리즘인 gradient descent 알고리즘으로 예시를 들겠다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/644f498f-b381-4de5-a20b-2845b10f093d/image.png" alt=""></p>
<blockquote>
<p>예를 들어서 우리가 가지고 있는 데이터의 값 중에 x1의 값과 x2의 값에 큰 차이가 난다면 이전 그래프의 등고선 모양보다는 옆으로 길게 늬운 등고선이 나타난다.
그러면 우리가 시작점을 잡고 러닝 레이트 값이 좋은 값임에도 불과하고 조금이라도 밖으로 나가게되면 튀어 나가게 되어버린다. 
데이터 값에 큰 차이가 있을 경우에 Normalize 할 필요가 있다</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/21bda5e5-89a3-4b0e-ba59-0980745872a9/image.png" alt=""></p>
<blockquote>
<p>오리지날 데이터가 2차원 형태로 저렇게 되어 있다고 할 때 보통 많이 쓰는 방법이 zero-centered data이며 데이터의 중심이 0으로 갈 수 있도록 바꿔주는 방법을 취하기도 하고
또 가장 많이 사용하는 방법은 어떤 값이 이 값 전체의 범위가 어떤 형태의 범위안에 항상 들어가도록 Normalized data 하는 방법이 있다</p>
</blockquote>
<blockquote>
<p>그래서 내가 러닝 레이트를 잘 잡은 거 같은데 이상하게 학습이 일어나지 않고 코스트 함수가 발산을 한다거나 이상한 동작을 보일때는 데이터중에 큰 차이가 나는 값이 있는지 그리고 preprocessing을 했는지 점검해보면 좋다</p>
</blockquote>
<h3 id="standardization">Standardization</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/9b806a69-f58d-4a47-974f-1c3bd619dcf7/image.png" alt=""></p>
<blockquote>
<p>x의 값을 우리가 계산한 평균과 분산의 값을 가지고 나누어 주면 되는데 파이썬을 가지고 만든다면 이렇게 한줄로 표시할 수 있다.
이런 형태의 노말리제이션이 있지만 그 중에 한 가지를 선택해서 x 데이터를 처리해보는 것도 머신러닝에 좋은 성능을 발휘하기 위한 방법일 수가 있다.</p>
</blockquote>
<h3 id="overfitting">Overfitting</h3>
<ul>
<li>Our model is very good with training data set (with memorization)</li>
<li>Not good at test dataset orin real use</li>
</ul>
<blockquote>
<p>머신러닝의 가장 큰 문제인 Overfitting, 오버피팅이란 학습 데이터에 너무 잘맞는 모델을 만들 수가 있는데 training data set에는 잘 맞지만 test data set이나 실제 사용했을 경우에는 정확성이 떨어지는걸 오버피팅이라 한다</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/57fc68a7-104f-407c-a7d7-24ad8b273f6f/image.png" alt=""></p>
<blockquote>
<p>왼쪽 모델1같은 경우는 리니어하게 그어서 좋은 모델의 표본이라 할 수 있지만
오른쪽 모델2같은 경우는 가지고 있는 데이터에 너무 딱 맞게 선을 그어버려서 training data set에는 잘 맞겠지만 다른 데이터가 들어오게 될 때는 굉장히 정확도가 떨어 질 수 있다. 이러한 모델이 오버피팅이다.</p>
</blockquote>
<h3 id="solutions-for-overfitting">Solutions for overfitting</h3>
<ul>
<li>More training data!</li>
<li>Reduce the number of features</li>
<li><strong>Regularization</strong></li>
</ul>
<blockquote>
<p>오버피팅을 줄이는 가장 좋은 방법은 training data를 많이 가지고 있는것이다
또 하나는 우리가 가지고 있는 features의 갯수를 중복된 것이 있으면 줄인다던지 이런 방법도 오버피팅을 줄이는방법이다.</p>
</blockquote>
<blockquote>
<p>마지막으로 이 두가지 방법 외에도 하나의 기술적인 방법이 있는데 이게 Regularization이라는 방법이다.</p>
</blockquote>
<h3 id="regularization">Regularization</h3>
<ul>
<li>Let&#39;s not have too big numbers in the weight</li>
</ul>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/297d7894-bfe0-49bd-9955-b87afadd91a6/image.png" alt=""></p>
<blockquote>
<p>일반화 시킨다는 얘기는 우리가 가지고 있는 w를 너무나 큰 값을 가지지 말자
우리가 주로 오버피팅이라고 설명을 할 때 보통 그래프의 선을 데이터에 맞게 구부리는 것을 말하는데 이것을 구부리지말고 피자 라고 하는걸 Regularization
여기서 편다는 이야기는 같이 좀 w이 적은 값을 가진다는 얘기고 구부린다는 것은 w값이 큰 값을 가졌을때 구부러지는건데 그래서 좀 구부리지 말고 좀 펴 라는 얘기이다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/14f48673-cc7e-4899-acfe-51ec86ad9b96/image.png" alt=""></p>
<blockquote>
<p>이것을 하기 위해서는 우리가 코스트 함수를 설명할 때 코스트를 최소화 시키는 것이 우리의 목표였는데 이 코스트 함수의 뒤에 <strong>이 텀</strong>을 추가시켜 준다</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/f0f5b0f5-a66e-4738-9bb3-a79855c62b75/image.png" alt=""></p>
<blockquote>
<p>람다값을 regularization strength라 한다
텐서플로우로 구현할때 간단하게 표현할 수 있다.</p>
</blockquote>
<h2 id="lec-07-2-trainingtesting-데이타-셋">lec 07-2: Training/Testing 데이타 셋</h2>
<h3 id="performance-evaluation-is-this-good">Performance evaluation: is this good?</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/0cab782b-0bd0-4649-9e8a-8ae4fc1b3c50/image.png" alt=""></p>
<blockquote>
<p>이전 시간에 배운것들을 통해서 우리의 머신러닝 모델을 데이터를 가지고 학습을 시켰다.
이렇게 학습을 시킨 모델이 얼마나 훌륭한가? 얼마나 성공적으로 예측을 할 수 있을까 평가를 할까요</p>
</blockquote>
<h3 id="evaluation-using-training-set">Evaluation using training set?</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/2fc97885-81a0-47a5-a813-3deab46cb235/image.png" alt=""></p>
<blockquote>
<p>우리가 이런 형태의 데이터가 있다고 생각을 해보자. 보통 training set 을 가지고 모델을 학습을 시키는데 다 시키고 난 뒤 다시 training set 을 가지고 물어보게 되면 이것이 공정한 방법일까요? 이런식으로 한다면 머신러닝은 100% 완벽한 답을 할 수도 있을것이다. 그냥 외워버리면 되니까
이것은 좋은방법이 아니다</p>
</blockquote>
<h3 id="training-and-test-sets">Training and test sets</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/fe0da80e-1c1c-4f8c-b58b-a64e4ca6b344/image.png" alt=""></p>
<blockquote>
<p>좋은 방법은 우리가 시험을 보는 방식이랑 똑같다. 얼추 3:7로 나뉘어서 7은 training 3은 test set으로 구분해서 training set을 가지고 모델을 학습 시키고 완벽하게 끝났다라고 했을 때 단 한번의 기회로 testing data set을 가지고 비교를 한다.
한마디로 training set은 교과서이고 이 교과서를 가지고 공부를 하다가 다 했을 경우 testing data set을 시험이라 비유했을 경우 단 한번 시험으로 성능을 평가하면 된다.</p>
</blockquote>
<h3 id="training-validation-and-test-sets">Training, validation and test sets</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c9f8e868-e216-43ad-b72a-e2aec4b54940/image.png" alt=""></p>
<blockquote>
<p>바로 직전에 얘기 했듯이 보통 통상적으로 트레이닝 셋과 테스팅 셋으로 나뉘는게 일반적인데
지난번에 얘기 할때 알파라는 러닝 레이트라는것을 얘기 했었고, 또 하나의 상수가 학습할 때 들어가는 것이 람다라고 했던 어떤 레귤러제이션을 하는데 얼마나 강하게 할것인가하는 값이였다.
이러한 값을 조금 튜닝할 필요가 있을 때 우리가 가지고 있는 트레이닝 셋을 Training과 Validation 두개로 다시 나눕니다. 
일반적으로 트레이닝 셋으로 모델을 학습시킨 다음에 이 벨리데이션 셋을 가지고 이런 상수 값들이 어떤것이 좋을까 하는 것들을 튜닝을 하게 된다. 이것을 이제 Validation이라 하고 비유하자면 모의고사로 보면 되고 해서 완벽하게 되면 이제 Testing data set을 가지고 모델이 잘 동작하는지 평가를 하면 된다.</p>
</blockquote>
<h3 id="online-learning">Online learning</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/229a9d7a-6562-47f1-ba97-03c4eeebc54f/image.png" alt=""></p>
<blockquote>
<p>그리고 데이터 셋이 굉장히 많을 경우에 한번에 다 넣어서 학습을 시키기가 힘들 때가 있다.
이럴 때 나온게 Online learning이다.</p>
</blockquote>
<blockquote>
<p>예를 들어 데이터가 100만개가 있다고 가정할때, 한번에 넣어서 학습을 시킬려면 베타공간도 많이 필요하고 하니까 그렇게 하지 않고 잘라 가지고 10만개 씩 잘라서 학습을 시킵니다. 한번 학습 시키고 끝났으면 두번째를 학습시키고 세번째를 학습시키고,, 자 이때 모델이 해야하는 일은 첫번째 학습이 된 결과가 모델에 남아 있어야 한다. 그래서 두번째 데이터를 학습 시키면 이 모델에 추가가 되어서 새로운 학습이 되어야 한다.</p>
</blockquote>
<h3 id="minist-dataset">MINIST Dataset</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/d9f822e3-75c2-43a7-a63e-7965463463a6/image.png" alt=""></p>
<blockquote>
<p>유명한 데이터셋인데 그림을 보면 사람이 적어놓은 숫자를 컴퓨터가 인식을 할 수 있는지를 테스트하는 Dataset 이다. 이것이 필요했던 이유는 미국 우체국에서 우편번호를 받게되면 최소한 자동으로 분류를 할 수 있게 컴퓨터에게 시키기 위해서 만들어졌다.</p>
</blockquote>
<blockquote>
<p>여기 보면 데이터셋이 나뉘어져 있는데 training set과 test set으로 나뉘어져있는것을 볼 수 있다.</p>
</blockquote>
<h2 id="ml-lab-07-1-trainingtest-dataset-learning-rate-normalization">ML lab 07-1: training/test dataset, learning rate, normalization</h2>
<h3 id="training-and-test-datasets">Training and Test datasets</h3>
<pre><code class="language-python">import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

tf.set_random_seed(777)  # for reproducibility

x_data = [[1, 2, 1], [1, 3, 2], [1, 3, 4], [1, 5, 5], [1, 7, 5], [1, 2, 5], [1, 6, 6], [1, 7, 7]]
y_data = [[0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 1, 0], [0, 1, 0], [0, 1, 0], [1, 0, 0], [1, 0, 0]]

# Evaluation our model using this test dataset
x_test = [[2, 1, 1], [3, 1, 2], [3, 3, 4]]
y_test = [[0, 0, 1], [0, 0, 1], [0, 0, 1]]

X = tf.placeholder(&quot;float&quot;, [None, 3])
Y = tf.placeholder(&quot;float&quot;, [None, 3])

W = tf.Variable(tf.random_normal([3, 3]))
b = tf.Variable(tf.random_normal([3]))

# tf.nn.softmax computes softmax activations
# softmax = exp(logits) / reduce_sum(exp(logits), dim)
hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)

# Cross entropy cost/loss
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))
# Try to change learning_rate to small numbers
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)

# Correct prediction Test model
prediction = tf.argmax(hypothesis, 1)
is_correct = tf.equal(prediction, tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))

# Launch graph
with tf.Session() as sess:
    # Initialize TensorFlow variables
    sess.run(tf.global_variables_initializer())

    for step in range(201):
        cost_val, W_val, _ = sess.run([cost, W, optimizer], feed_dict={X: x_data, Y: y_data})
        print(step, cost_val, W_val)

    # predict
    print(&quot;Prediction:&quot;, sess.run(prediction, feed_dict={X: x_test}))
    # Calculate the accuracy
    print(&quot;Accuracy: &quot;, sess.run(accuracy, feed_dict={X: x_test, Y: y_test}))
</code></pre>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/990d8af7-b029-4afa-90e5-806af0832171/image.png" alt=""></p>
<h3 id="learning-rate-nan">Learning rate: NaN!</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/06b8212b-4c20-446f-a22d-bb85c7f56b42/image.png" alt=""></p>
<h3 id="big-learning-rate---ex-15-일-때">Big learning rate - ex) 1.5 일 때</h3>
<pre><code class="language-python">import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

tf.set_random_seed(777)  # for reproducibility

x_data = [[1, 2, 1], [1, 3, 2], [1, 3, 4], [1, 5, 5], [1, 7, 5], [1, 2, 5], [1, 6, 6], [1, 7, 7]]
y_data = [[0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 1, 0], [0, 1, 0], [0, 1, 0], [1, 0, 0], [1, 0, 0]]

# 이 테스트 데이터 세트를 사용하여 모델 평가
x_test = [[2, 1, 1], [3, 1, 2], [3, 3, 4]]
y_test = [[0, 0, 1], [0, 0, 1], [0, 0, 1]]

X = tf.placeholder(&quot;float&quot;, [None, 3])
Y = tf.placeholder(&quot;float&quot;, [None, 3])

W = tf.Variable(tf.random_normal([3, 3]))
b = tf.Variable(tf.random_normal([3]))

# tf.nn.softmax computes softmax activations
# softmax = exp(logits) / reduce_sum(exp(logits), dim)
hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)

# Cross entropy cost/loss
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))
# Try to change learning_rate to small numbers
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1.5).minimize(cost)

# 정확한 예측 테스트 모델
prediction = tf.argmax(hypothesis, 1)
is_correct = tf.equal(prediction, tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))

# Launch graph
with tf.Session() as sess:
    # 세션을 열고 변수 초기화
    sess.run(tf.global_variables_initializer())

    for step in range(201):
        cost_val, W_val, _ = sess.run([cost, W, optimizer], feed_dict={X: x_data, Y: y_data})
        print(step, cost_val, W_val)

    # 테스트 데이터로 확인해보기
    print(&quot;Prediction:&quot;, sess.run(prediction, feed_dict={X: x_test}))
    # Calculate the accuracy
    print(&quot;Accuracy: &quot;, sess.run(accuracy, feed_dict={X: x_test, Y: y_test}))
</code></pre>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/5dcd30b4-dc74-4282-9a40-8e5ea0accaa4/image.png" alt=""></p>
<h3 id="small-learning-rate---ex-1e-10-일-때">Small learning rate - ex) 1e-10 일 때</h3>
<pre><code class="language-python">import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

tf.set_random_seed(777)  # for reproducibility

x_data = [[1, 2, 1], [1, 3, 2], [1, 3, 4], [1, 5, 5], [1, 7, 5], [1, 2, 5], [1, 6, 6], [1, 7, 7]]
y_data = [[0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 1, 0], [0, 1, 0], [0, 1, 0], [1, 0, 0], [1, 0, 0]]

# 이 테스트 데이터 세트를 사용하여 모델 평가
x_test = [[2, 1, 1], [3, 1, 2], [3, 3, 4]]
y_test = [[0, 0, 1], [0, 0, 1], [0, 0, 1]]

X = tf.placeholder(&quot;float&quot;, [None, 3])
Y = tf.placeholder(&quot;float&quot;, [None, 3])

W = tf.Variable(tf.random_normal([3, 3]))
b = tf.Variable(tf.random_normal([3]))

# tf.nn.softmax computes softmax activations
# softmax = exp(logits) / reduce_sum(exp(logits), dim)
hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)

# Cross entropy cost/loss
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))
# Try to change learning_rate to small numbers
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-10).minimize(cost)

# 정확한 예측 테스트 모델
prediction = tf.argmax(hypothesis, 1)
is_correct = tf.equal(prediction, tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))

# Launch graph
with tf.Session() as sess:
    # 세션을 열고 변수 초기화
    sess.run(tf.global_variables_initializer())

    for step in range(201):
        cost_val, W_val, _ = sess.run([cost, W, optimizer], feed_dict={X: x_data, Y: y_data})
        print(step, cost_val, W_val)

    # 테스트 데이터로 확인해보기
    print(&quot;Prediction:&quot;, sess.run(prediction, feed_dict={X: x_test}))
    # Calculate the accuracy
    print(&quot;Accuracy: &quot;, sess.run(accuracy, feed_dict={X: x_test, Y: y_test}))
</code></pre>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/1296161b-3245-45ed-a806-44bdfb1b9b9c/image.png" alt=""></p>
<h3 id="non-normalized-inputs">Non-normalized inputs</h3>
<pre><code class="language-python">import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np
tf.set_random_seed(777)  # for reproducibility


xy = np.array([[828.659973, 833.450012, 908100, 828.349976, 831.659973],
               [823.02002, 828.070007, 1828100, 821.655029, 828.070007],
               [819.929993, 824.400024, 1438100, 818.97998, 824.159973],
               [816, 820.958984, 1008100, 815.48999, 819.23999],
               [819.359985, 823, 1188100, 818.469971, 818.97998],
               [819, 823, 1198100, 816, 820.450012],
               [811.700012, 815.25, 1098100, 809.780029, 813.669983],
               [809.51001, 816.659973, 1398100, 804.539978, 809.559998]])

x_data = xy[:, 0:-1]
y_data = xy[:, [-1]]

# placeholders for a tensor that will be always fed.
X = tf.placeholder(tf.float32, shape=[None, 4])
Y = tf.placeholder(tf.float32, shape=[None, 1])

W = tf.Variable(tf.random_normal([4, 1]), name=&#39;weight&#39;)
b = tf.Variable(tf.random_normal([1]), name=&#39;bias&#39;)

# Hypothesis
hypothesis = tf.matmul(X, W) + b

# Simplified cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# Minimize
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)
train = optimizer.minimize(cost)

# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph.
sess.run(tf.global_variables_initializer())

for step in range(101):
    cost_val, hy_val, _ = sess.run(
        [cost, hypothesis, train], feed_dict={X: x_data, Y: y_data})
    print(step, &quot;Cost: &quot;, cost_val, &quot;\nPrediction:\n&quot;, hy_val)
</code></pre>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/d98fa859-cdce-4096-869f-576d375ead51/image.png" alt=""></p>
<h3 id="normalized-inputs-min-max-scale">Normalized inputs (min-max scale)</h3>
<pre><code class="language-python">import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np
tf.set_random_seed(777)  # for reproducibility

def min_max_scaler(data):
    numerator = data - np.min(data, 0)
    denominator = np.max(data, 0) - np.min(data, 0)
    # noise term prevents the zero division
    return numerator / (denominator + 1e-7)

xy = np.array(
    [
        [828.659973, 833.450012, 908100, 828.349976, 831.659973],
        [823.02002, 828.070007, 1828100, 821.655029, 828.070007],
        [819.929993, 824.400024, 1438100, 818.97998, 824.159973],
        [816, 820.958984, 1008100, 815.48999, 819.23999],
        [819.359985, 823, 1188100, 818.469971, 818.97998],
        [819, 823, 1198100, 816, 820.450012],
        [811.700012, 815.25, 1098100, 809.780029, 813.669983],
        [809.51001, 816.659973, 1398100, 804.539978, 809.559998],
    ]
)

# very important. It does not work without it.
xy = min_max_scaler(xy)
print(xy)

x_data = xy[:, 0:-1]
y_data = xy[:, [-1]]

# placeholders for a tensor that will be always fed.
X = tf.placeholder(tf.float32, shape=[None, 4])
Y = tf.placeholder(tf.float32, shape=[None, 1])

W = tf.Variable(tf.random_normal([4, 1]), name=&#39;weight&#39;)
b = tf.Variable(tf.random_normal([1]), name=&#39;bias&#39;)

# Hypothesis
hypothesis = tf.matmul(X, W) + b

# Simplified cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# Minimize
train = tf.train.GradientDescentOptimizer(learning_rate=1e-5).minimize(cost)

# Launch the graph in a session.
with tf.Session() as sess:
    # Initializes global variables in the graph.
    sess.run(tf.global_variables_initializer())

    for step in range(101):
        _, cost_val, hy_val = sess.run(
            [train, cost, hypothesis], feed_dict={X: x_data, Y: y_data}
        )
        print(step, &quot;Cost: &quot;, cost_val, &quot;\nPrediction:\n&quot;, hy_val)</code></pre>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/6f017730-9e9d-4176-b318-535b32053216/image.png" alt=""></p>
<blockquote>
<p>xy = MinMaxScaler(xy) 을 주게 되면 제일 작은값을 0 제일 큰값을 1로 줘서 그 사이를 값에 따라서 노말라이즈를 한다</p>
</blockquote>
<h2 id="ml-lab-07-2-meet-mnist-dataset">ML lab 07-2: Meet MNIST Dataset</h2>
<h3 id="mnist-dataset">MNIST Dataset</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/b25d0139-6d4b-47d3-be68-aa44e0c18515/image.png" alt=""></p>
<h3 id="28x28x1-image">28x28x1 image</h3>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/c8aefbd7-de49-422d-a348-b9f2afda1136/image.png" alt=""></p>
<h3 id="mnist-datasetcode">MNIST Dataset(code)</h3>
<pre><code class="language-python">import tensorflow.compat.v1 as tf
import matplotlib.pyplot as plt
import numpy as np
import random

tf.disable_v2_behavior()

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

print(len(x_train), len(y_train), x_train.shape, y_train.shape)
print(len(x_test), len(y_test), x_test.shape, y_test.shape)

x_train, x_test = x_train / 255.0, x_test / 255.0  # Feature scaling 적용

nb_classes = 10;

x_train_new = x_train.reshape(len(x_train), 784)  # 60000 * 784 배열로 변경 - 한행당 이미지 하나
y_train_new = np.zeros((len(y_train), nb_classes))  # 60000 * 10 배열 생성
for i in range(len(y_train_new)):
    y_train_new[i, y_train[i]] = 1  # one-hot encoding

x_test_new = x_test.reshape(len(x_test), 784)  # 60000 * 784 배열로 변경 - 한행당 이미지 하나
y_test_new = np.zeros((len(y_test), nb_classes))  # 60000 * 10 배열 생성
for i in range(len(y_test_new)):
    y_test_new[i, y_test[i]] = 1  # one-hot encoding

# MNIST data image of shape 28 * 28 = 784
X = tf.placeholder(tf.float32, [None, 784])
# 0 - 9 digits recognition = 10 classes
Y = tf.placeholder(tf.float32, [None, nb_classes])  # 6만개의 학습에 대한 10개의 가설 결과

W = tf.Variable(tf.random_normal([784, nb_classes]))  # 가설이 10개이고 가설별로 784개의 weigh을 가짐, 즉 7840개의 w
b = tf.Variable(tf.random_normal([nb_classes]))  # 가설이 10개니 가설의 b도 10

# Hypothesis (using softmax)
hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)  # 60000 x 10 행렬 - 행별로 열의 값을 확율로 바꿈

# cross entropy
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)

# Test model
is_correct = tf.equal(tf.arg_max(hypothesis, 1), tf.arg_max(Y, 1))
# Calculate accuracy
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))

# parameters
training_epochs = 15  # traing을 몇번 돌릴것인지
batch_size = 100  # 한번에 몇건씩 읽은것인지
total_batch = int(len(x_train_new) / batch_size)

with tf.Session() as sess:
    # Initialize TensorFlow variables
    sess.run(tf.global_variables_initializer())
    # Training cycle
    for epoch in range(training_epochs):
        avg_cost = 0

        for i in range(total_batch):
            # print (epoch,batch_size )
            batch_xs = x_train_new[(epoch * batch_size):(epoch + 1) * batch_size]
            batch_ys = y_train_new[(epoch * batch_size):(epoch + 1) * batch_size]

            _, cost_val = sess.run([optimizer, cost], feed_dict={X: batch_xs, Y: batch_ys})
            avg_cost += cost_val / total_batch

        print(&quot;Epoch: {:04d}, Cost: {:.9f}&quot;.format(epoch + 1, avg_cost))

    # Test the model using test sets
    print(
        &quot;Accuracy: &quot;,
        accuracy.eval(
            session=sess, feed_dict={X: x_test_new, Y: y_test_new}
        ),
    )

    # Get one and predict
    random_idx = random.randrange(1, 10000)
    print(&quot;random_idx : &quot;, random_idx)
    print(
        &quot;Prediction: &quot;,
        sess.run(tf.argmax(hypothesis, 1), feed_dict={X: x_test_new[random_idx: random_idx + 1]}),
    )

    plt.imshow(
        x_test_new[random_idx: random_idx + 1].reshape(28, 28),
        cmap=&quot;Greys&quot;,
        interpolation=&quot;nearest&quot;,
    )
    plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/b7a12b20-54c5-4ada-8ec8-2c7dbd2d4552/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/eastgun_/post/d4489625-10d9-4307-b26c-8f7d7426c15e/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>