<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>이마의 개발 블로그</title>
    <link>https://development-ima.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 20 May 2026 13:10:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>dev-ima</managingEditor>
    <image>
      <title>이마의 개발 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/5346063/attach/2f040b421de24c16a1449c1fe2f6c777</url>
      <link>https://development-ima.tistory.com</link>
    </image>
    <item>
      <title>정적 멤버 함수(static member variable)</title>
      <link>https://development-ima.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;정적 멤버&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;class에는 속하지만, 객체 별로 할당되지 않고 클래스의 모든 객체가 공유하는 멤버&lt;/li&gt;
&lt;li&gt;즉, 클래스의 모든 객체에 대해 하나의 데이터만 유지됨&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1680703046437&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;
using namespace std;

class Something{
public:
	static int s_value;
};

int Something::s_value = 1024;

int main(){
	Something s1;
    cout &amp;lt;&amp;lt; s1.s_value &amp;lt;&amp;lt; endl;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적 멤버 함수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스의 객체를 생성하지않고 호출 가능&lt;/li&gt;
&lt;li&gt;객체를 생성하지 않으므로, this 포인터를 가지지 않음&lt;/li&gt;
&lt;li&gt;특정 객체에 포함되지 않으므로, 정적 멤버 변수만 사용가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1680703350882&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

class Something{
private:
    static int s_value;
    

public:
    static int getValue(){
        return s_value;
    }
    int temp(){
        return this-&amp;gt;s_value;
    }
};

int Something::s_value = 1024;

int main(){
    cout &amp;lt;&amp;lt; Something::getValue() &amp;lt;&amp;lt;endl;

    Something s1, s2;
    cout &amp;lt;&amp;lt; s1.getValue() &amp;lt;&amp;lt; endl;

    int (Something::*fptr1)() = &amp;amp;Something::temp;

    cout &amp;lt;&amp;lt; (s2.*fptr1)() &amp;lt;&amp;lt;endl;

    int (*fptr2)() = &amp;amp;Something::getValue;

    cout &amp;lt;&amp;lt; (*fptr2)() &amp;lt;&amp;lt; endl;

    return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>c++</category>
      <category>C++</category>
      <category>static member</category>
      <category>static member method</category>
      <category>static member variable</category>
      <category>정적멤버변수</category>
      <category>정적멤버함수</category>
      <author>dev-ima</author>
      <guid isPermaLink="true">https://development-ima.tistory.com/17</guid>
      <comments>https://development-ima.tistory.com/17#entry17comment</comments>
      <pubDate>Wed, 5 Apr 2023 23:14:30 +0900</pubDate>
    </item>
    <item>
      <title>메모리의 stack영역, heap영역</title>
      <link>https://development-ima.tistory.com/16</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;정의&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 코딩을 할 때, RAM을 접근하여 일부 메모리를 사용하게 된다. 사용하는 영역은 아래와 같은 그림으로 나타낼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWd5KM/btrZAG2uKvC/X2KH2lh62O1GOQ5Naruls1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWd5KM/btrZAG2uKvC/X2KH2lh62O1GOQ5Naruls1/img.png&quot; data-alt=&quot;메모리 구조(출처:&amp;amp;nbsp;http://www.tcpschool.com/c/c_memory_structure)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWd5KM/btrZAG2uKvC/X2KH2lh62O1GOQ5Naruls1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWd5KM%2FbtrZAG2uKvC%2FX2KH2lh62O1GOQ5Naruls1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;314&quot; height=&quot;512&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메모리 구조(출처:&amp;nbsp;http://www.tcpschool.com/c/c_memory_structure)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 영역: 실행할 프로그램의 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 영역: 전역(global)변수, 정적(static) 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;heap영역: 동적 할당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stack 영역: 지역변수, 매개변수, 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 영역마다 저장되는 변수와 저장할 수 있는 용량이 다르다. 코딩을 할 때, 중요하게 여겨야할 영역은 제목에서 봤듯이 stack과 heap영역이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;stack&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stack영역은 우리가 주로 사용하는 함수의 매개변수나 함수내의 지역변수를 할당할 때, 주로 쓰인다. stack영역의 용량은 비교적 크지않아 제귀함수와 같은 stackoverflow에러를 발생시키는 알고리즘을 사용할 때는 주의를 해야한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;heap&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;heap영역은 c++기준 new와 delete를 통해 동적할당을 하는 경우 접근하게 되는 영역이다. 이는 stack영역에 비해 용량이 크지만 runtime중 동적할당을 할 수 있기 때문에 메모리누수와 같은 문제가 발생할 수 있다.&amp;nbsp;&lt;/p&gt;</description>
      <category>c++</category>
      <category>heap</category>
      <category>stack</category>
      <category>동적할당</category>
      <category>메모리 구조</category>
      <category>지역변수</category>
      <author>dev-ima</author>
      <guid isPermaLink="true">https://development-ima.tistory.com/16</guid>
      <comments>https://development-ima.tistory.com/16#entry16comment</comments>
      <pubDate>Thu, 16 Feb 2023 21:49:04 +0900</pubDate>
    </item>
    <item>
      <title>함수 포인터</title>
      <link>https://development-ima.tistory.com/15</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;정의&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 포인터: 함수의 주소를 담고있는 포인터 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 포인터의 기본형태 : int (*ptrFunc) (int a, int b)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반환 데이터 타입: int형, 함수 포인터명: ptrFunc, 매개변수: int a, int b&lt;/li&gt;
&lt;li&gt;ptrFunc이라는 함수 포인터는 반환데이터 타입을 int형으로 가지며 int형 변수 a와 b를 매개변수로 가진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;쓰임새&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 포인터는 다른 함수의 매개변수로 함수를 받고 싶을 때 사용된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 &lt;b&gt;callback 함수&lt;/b&gt;로 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;callback 함수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;a함수의 인자로 b함수의 함수 포인터를 넘겨 a함수가 실행 될때, b함수도 실행하게하는 것이다.&lt;/li&gt;
&lt;li&gt;주로 라이브러리의 유연성을 제공하기위해 구현된다. 사람마다 원하는 세부기능이 다를 수 있기 때문에 사용자의 함수를 직접작성하여 라이브러리에 구현된 함수의 함수포인터로 넘겨줄 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예시 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1676463296064&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int add(int x, int y, int(*fp_x)(int), int(*fp_y)(int)){
	
    if(fp_x != NULL){
    	x = fp_x(x)
    }

    else if(fp_y != NULL){
    	y = fp_x(y)
    }
    return x + y;
}

int positive(int a){
	if(a&amp;lt;0) return -a;
    return a;
}

int square(int a){
	return a*a;
}

int main(){
	
    add(1, 3, NULL,NULL);
    add(3, 6, positive, NULL);
    add(7, 5, NULL, positive);
    add(4, 4, square, positive);

}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>c++</category>
      <category>C++</category>
      <category>callback</category>
      <category>Function Pointer</category>
      <category>콜백함수</category>
      <category>함수포인터</category>
      <author>dev-ima</author>
      <guid isPermaLink="true">https://development-ima.tistory.com/15</guid>
      <comments>https://development-ima.tistory.com/15#entry15comment</comments>
      <pubDate>Wed, 15 Feb 2023 21:15:39 +0900</pubDate>
    </item>
    <item>
      <title>제 1강 MLops - ML 시스템 workflow 정리</title>
      <link>https://development-ima.tistory.com/14</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;머신러닝 시스템의 workflow&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w4cjD/btrZlqSzL1j/qwRqjAWufFB9oNPWzpB7ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w4cjD/btrZlqSzL1j/qwRqjAWufFB9oNPWzpB7ok/img.png&quot; data-alt=&quot;그림 1 머신러닝 시스템 workflow (fullstackdeeplearning 참조)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w4cjD/btrZlqSzL1j/qwRqjAWufFB9oNPWzpB7ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw4cjD%2FbtrZlqSzL1j%2FqwRqjAWufFB9oNPWzpB7ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;567&quot; height=&quot;338&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 1 머신러닝 시스템 workflow (fullstackdeeplearning 참조)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝 시스템의 workflow는 위와 같이 순환적인 구조를 이루고 있다. 지금 다니고 있는 직장에서도 위와같은 workflow로 진행이된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 위의 과정을 자동화 또는 시각화하여 개발자, 연구자가 쉽게 접근할 수 있도록 해야 일의 능률이 상승한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비지니스 문제 정의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ML이 아닌 다른 알고리즘으로 해결이 가능한가?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위의 물음은 ML을 연구하고 개발하는 사람이라면 가지고 있어야하는 마음가짐 중 하나이다. 굳이 ML을 사용하지 않아도 해결될 문제를 ML로 해결하려는 것은 문제를 더 어렵게 만드는것이다. (ML프로젝트의 실패확률 매우 높음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 목표&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우리가 적용하려는 product가 어느정도의 리스크를 가지고 있으며 그 리스크를 해결할 만큼의 성능이 나오는 지 파악을 할 수 있어야한다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;특정기간 모델을 사용할 수 없는 리스크&lt;/li&gt;
&lt;li&gt;특정 표본에 대한 잘못된 예측을 반환하는 리스크&lt;/li&gt;
&lt;li&gt;시간이 지남에 따라 모델 정확도나 공정성이 떨어지는 리스크&lt;/li&gt;
&lt;li&gt;모델을 유지보수하기 위한 기술 및 리소스가 손실될 리스크&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;만약 초기에 성능 목표(지표)를 객관적으로 설정하지 못한다면 프로젝트의 실패로 까지 이어질 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용 제약&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;투명성, 설명가능성 수준&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ML, DL 모두 블랙박스이긴 하나 왜 이러한 결과가 나왔는지에 대한 설명이 조금이나마 필요하다. 예를 들어 CNN의 CAM과 같이 모델의 결과가 어떠한 특징에 영향을 많이 받았는지에 대한 정보를 알 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 탐색 및 전처리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적합한 데이터 찾기 -&amp;gt; EDA -&amp;gt; 특성 선택 -&amp;gt; 데이터 수집 파이프라인 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EDA&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터의 패턴을 이해하고 의미가 있을 것으로 추정되는 특성 추출&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모델 개발&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 학습 시 입출력 요소&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 셋&lt;/li&gt;
&lt;li&gt;parameter&lt;/li&gt;
&lt;li&gt;출력 데이터&lt;/li&gt;
&lt;li&gt;evaluation metrics&lt;/li&gt;
&lt;li&gt;학습된 모델&lt;/li&gt;
&lt;li&gt;log&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모델 배포&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 배포 시, 고려사항&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델 reproduction&lt;/li&gt;
&lt;li&gt;버전관리(모델, 데이터, 로그, 파라미터)&lt;/li&gt;
&lt;li&gt;서빙 방식&lt;/li&gt;
&lt;li&gt;결과 제공 방법(API, on-device, 등)&lt;/li&gt;
&lt;li&gt;워크플로우 수행시간, 자원 요구사항, 응답지연 요구사항&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모델 모니터링 및 피드백 - 모니터링 요소&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델의 성능 및 서비스 문제를 조기에 감지하기 쉽게하고 연구자가 명확한 지표를 낼 수 있도록 도와준다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원 모니터링
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Task별 CPU, GPU, Memory, dist, Network 사용량&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;상태 점검(health check)&lt;/li&gt;
&lt;li&gt;머신러닝 지표 모니터링
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;온라인 지표&lt;/li&gt;
&lt;li&gt;오프라인 지표&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;각종 인프라 지표 모니터링&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MLops</category>
      <category>DEEPLEARNING</category>
      <category>ML</category>
      <category>ML system</category>
      <category>ML workflow</category>
      <category>MLops</category>
      <category>ML시스템</category>
      <category>딥러닝</category>
      <category>딥러닝 시스템</category>
      <author>dev-ima</author>
      <guid isPermaLink="true">https://development-ima.tistory.com/14</guid>
      <comments>https://development-ima.tistory.com/14#entry14comment</comments>
      <pubDate>Tue, 14 Feb 2023 23:01:38 +0900</pubDate>
    </item>
    <item>
      <title>함수 오버로딩</title>
      <link>https://development-ima.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;c++ 함수 오버로딩의 개념을 정리해 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오버로딩이란 함수를 동일한 이름으로 여러 개 선언하는 것을 의미한다. 단 1가지 조건이 붙는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건 1. 파라미터가 달라야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 파라미터의 수가 같아도 자료형이 다르다면 괜찮다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환형만 다른 경우는 함수오버로딩이 되지 않는다. 간단히 정리해 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 1. 함수의 이름은 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 2. 함수의 파라미터 수가 다르거나 수가 같아도 자료형이 다르다면 괜찮다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 3. 함수의 파라미터가 같은 경우, 반환값만 다르다면 함수오버로딩이 되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1676112079263&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

int sum (int x, int y){
	return x + y;
}

double sum (double x, double y){
	return x + y;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드와 같이 동일한 덧셈기능을 함수를 만들 때, 여러 자료형에 따라 생성해 두고 사용할 수 있습니다.&lt;/p&gt;</description>
      <category>c++</category>
      <category>C++</category>
      <category>function</category>
      <category>Overloading</category>
      <category>오버로딩</category>
      <category>코딩</category>
      <category>함수 오버로딩</category>
      <author>dev-ima</author>
      <guid isPermaLink="true">https://development-ima.tistory.com/13</guid>
      <comments>https://development-ima.tistory.com/13#entry13comment</comments>
      <pubDate>Sat, 11 Feb 2023 19:45:24 +0900</pubDate>
    </item>
    <item>
      <title>Computer vision based Skin Detector</title>
      <link>https://development-ima.tistory.com/12</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;구현 알고리즘&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. global luminance Enhansment 적용(어두운 곳에서 이미지가 촬영되는 경우 적용)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;luminance_Enhansment.png&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ea3E4c/btrHIG0M9jT/cI9DzMCY4jIeWj7c7Vkvc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ea3E4c/btrHIG0M9jT/cI9DzMCY4jIeWj7c7Vkvc0/img.png&quot; data-alt=&quot;그림 1 Luminance Enhansment 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ea3E4c/btrHIG0M9jT/cI9DzMCY4jIeWj7c7Vkvc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fea3E4c%2FbtrHIG0M9jT%2FcI9DzMCY4jIeWj7c7Vkvc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;317&quot; data-filename=&quot;luminance_Enhansment.png&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 1 Luminance Enhansment 알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위의 알고리즘은 논문에서는 지역적으로 적용하여 어두운 이미지를 밝게 만들지만&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot; data-token-index=&quot;1&quot; data-reactroot=&quot;&quot;&gt;능력이 부족하여&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;global하게 위의 알고리즘을 적용하였다. 아래 코드는 global luminance Enhansment 코드이다. 여러분은 코드와 논문을 참조하여 local luminance Enhansment를 구현해보길 바란다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658247805378&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def luminence_Enhansment(src):
    '''
    parameter :
    - src : image frame
    return :
    - new_hsv: image frame
    '''
    hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
    H, S, V = cv2.split(hsv)
    V_N = V/255
    img_size = len(V[0]) * len(V)
    hist, bins = np.histogram(V.flatten(), 255,[0,255])
    cdf = hist.cumsum()
    if cdf[50] &amp;gt; img_size * 0.1:
        z = 0
    elif img_size * 0.1 &amp;gt; cdf[150]:
        z = 1
    elif cdf[50] &amp;lt;= img_size * 0.1 &amp;lt;= cdf[150]:
        z = ((img_size*0.1)-50)/100
    for i in range(0, len(H)):
        for j in range(0, len(H[0])):
            V_I = V_N[i, j]
            V_N[i, j] = ((V_I**(0.75*z+0.25))+(0.4*(1-z)*(1-V_I))+V_I**(2-z))*0.5
            V_N[i, j] = int(V_N[i, j]*255)
    V_N = np.array(V_N, dtype=S.dtype)
    new_hsv = cv2.merge([H, S, V_N])
    new_hsv = cv2.cvtColor(new_hsv, cv2.COLOR_HSV2BGR)
    return new_hsv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. YCbCr based Skin Detection&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Skin detect는 단순히 특정 YCbCr 값을 가지고 탐지를 진행하였다. 코드는 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658247848592&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def skindetector(img):
    '''
    parameter :
    - img : image frame
    return :
    - YCrCn_result : image frame
    '''
    #converting from gbr to YCbCr color space
    img_YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
    #skin color range for hsv color space
    YCrCb_mask = cv2.inRange(img_YCrCb, (0, 135, 85), (255,180,135))
    YCrCb_mask = cv2.morphologyEx(YCrCb_mask, cv2.MORPH_OPEN, np.ones((3,3), np.uint8))
    YCrCb_result = cv2.bitwise_not(YCrCb_mask)
    return YCrCb_result&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;응용 application&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;휴대폰을 들고있는 손을 예측하는 application 구현&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;알고리즘 설명&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 이미지 input&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 이미지 좌측상단, 우측상단, 좌측하단, 우측하단 4개의 image로 crop&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 사람 손은 보통 아래에 있기 때문에 좌측하단, 우측하단 이미지를 이용해 skin detection&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 좌측하단의 0픽셀이 더 많은 경우 오른손, 우측하단의 0픽셀이 더 많은 경우 왼손&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 결과 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 위의 알고리즘을 구현한 코드이다.&lt;/p&gt;
&lt;pre id=&quot;code_1658248049326&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from . import SkinDetector

def counting_black(img):
    '''
    counting 0 value pixel for counting black pixels
    '''
    count = 0
    for i in range(0, len(img)):
        for j in range(0, len(img[0])):
            if img[i, j] == 0:
                count += 1
    return count


def call_decision(img):
    '''
    parameters :
    img = image frame

    return :
    left or right = black pixels / all pixels of crop_image
    'right_hand' or 'left_hand' (str)
    '''
    height, width = img.shape[0], img.shape[1]
    Enhan_img = SkinDetector.luminence_Enhansment(img)
    skin_img = SkinDetector.skindetector(Enhan_img)
    l_img = skin_img[height-(height//2): height, 0:width-(width//2)]
    r_img = skin_img[height-(height//2): height, width-(width//2):width]
    l_pixels = counting_black(l_img)
    r_pixels = counting_black(r_img)
    left = l_pixels/(l_img.shape[0]*l_img.shape[1])
    right = r_pixels/(r_img.shape[0]*r_img.shape[1])
    if l_pixels &amp;gt; r_pixels:
        return left, 'right_hand'
    elif l_pixels &amp;lt;= r_pixels:
        return right, 'left_hand'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행코드는 아래 github를 들어가서 실행해 보시거나 혹은 위의 코드를 베이스로 직접 구현해보시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/22ema/ComputerVision/tree/main/SkinDetector&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/22ema/ComputerVision/tree/main/SkinDetector&lt;/a&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고 논문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A Robust Face Detection Method Based on Skin Color and Edges&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nonlinear transfer function-based local approach for color image enhancement&lt;/p&gt;</description>
      <category>Computer Vision</category>
      <category>Computer Vision</category>
      <category>cv</category>
      <category>image Enhancement</category>
      <category>skin color detection</category>
      <category>skin detection</category>
      <author>dev-ima</author>
      <guid isPermaLink="true">https://development-ima.tistory.com/12</guid>
      <comments>https://development-ima.tistory.com/12#entry12comment</comments>
      <pubDate>Wed, 20 Jul 2022 01:29:47 +0900</pubDate>
    </item>
    <item>
      <title>LBP (Local Binary Pattern) for Face Recognition</title>
      <link>https://development-ima.tistory.com/11</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;LBP&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oh0J1/btrHAH6NLV8/7IKCwTX4Qao2l3Wvztl490/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oh0J1/btrHAH6NLV8/7IKCwTX4Qao2l3Wvztl490/img.jpg&quot; data-alt=&quot;그림 1 출처 : &amp;amp;nbsp;http://www.scholarpedia.org/article/Local_Binary_Patterns&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oh0J1/btrHAH6NLV8/7IKCwTX4Qao2l3Wvztl490/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foh0J1%2FbtrHAH6NLV8%2F7IKCwTX4Qao2l3Wvztl490%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;221&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 1 출처 : &amp;nbsp;http://www.scholarpedia.org/article/Local_Binary_Patterns&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pq5Nh/btrHDPhYDuN/EmmCzUkbeS7uPlexILFXTK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pq5Nh/btrHDPhYDuN/EmmCzUkbeS7uPlexILFXTK/img.jpg&quot; data-alt=&quot;그림 2 출처 :&amp;amp;nbsp;[Ahonen06]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pq5Nh/btrHDPhYDuN/EmmCzUkbeS7uPlexILFXTK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPq5Nh%2FbtrHDPhYDuN%2FEmmCzUkbeS7uPlexILFXTK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;99&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 2 출처 :&amp;nbsp;[Ahonen06]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림1 처럼 이미지를 tile로 나누고 각 tile의 LBP 히스토그램을 나열하여 최종적으로 feature histogram을 만든다. 다른 이미지의 feature histogram과 비교하여 동일인인지 판별할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LBP hisogram을 만들기 위해서 그림2와 같은 연산이 필요하다. 알고리즘은 아래와 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3x3 block으로 이미지의 pixel정보를 얻어온다.&lt;/li&gt;
&lt;li&gt;center pixel을 중심으로 나머지 픽셀들과 크기비교를 한다. center pixel 보다 크거나 같다면 1 작다면 0으로 계산한다.&lt;/li&gt;
&lt;li&gt;(그림3 참고)좌측 pixel 부터 차례대로 나열하여 11001011이라는 2진수를 만든다. 그리고 이를 다시 10진수로 바꾸면 203이라는 값이나오고 이 값이 중간 픽셀의 값으로 바뀌게된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 간단한 알고리즘을 직접사용하기 위해 구현을 진행하였다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;먼저 이미지를 25x25 타일로 crop한다. 그리고 LBP를 적용한 후 feature histogram을 계산한다. 그리고 이때 prev_hist와 hist사이의 제곱오차를 계산하여 이전 이미지와 현재이미지 사이의 오차를 계산한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1658154900852&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def lbp_run(self, recent_frame):
        gray = cv2.cvtColor(recent_frame, cv2.COLOR_BGR2GRAY)
        resize_frame = cv2.resize(gray, (250, 250))
        hist=list()
        for x in range(25, 251, 25):
            for y in range(25, 251, 25):
                self.LBP(resize_frame[y-25:y,x-25:x])
                for i in np.histogram(self.transform_img.flatten(),10,[0,255])[0]:
                    hist.append(i/625)
        if self.prev_hist == None:
            self.result_hist = None
        else:
            # self.result_hist = [((self.prev_hist[i]-hist[i])**2)/(self.prev_hist[i]+hist[i]) for i in range(0, len(hist))]
            self.result_hist = [((self.prev_hist[i]-hist[i])**2) for i in range(0, len(hist))]
        self.prev_hist = hist&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 위 함수에서 사용된 LBP 알고리즘이다.&lt;/p&gt;
&lt;pre id=&quot;code_1658154929870&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def lbp_run(self, recent_frame):
        gray = cv2.cvtColor(recent_frame, cv2.COLOR_BGR2GRAY)
        resize_frame = cv2.resize(gray, (250, 250))
        hist=list()
        for x in range(25, 251, 25):
            for y in range(25, 251, 25):
                self.LBP(resize_frame[y-25:y,x-25:x])
                for i in np.histogram(self.transform_img.flatten(),10,[0,255])[0]:
                    hist.append(i/625)
        if self.prev_hist == None:
            self.result_hist = None
        else:
            # self.result_hist = [((self.prev_hist[i]-hist[i])**2)/(self.prev_hist[i]+hist[i]) for i in range(0, len(hist))]
            self.result_hist = [((self.prev_hist[i]-hist[i])**2) for i in range(0, len(hist))]
        self.prev_hist = hist&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 실행 코드는 아래 github를 clone하여 실행해보시거나 위의 코드들을 참고하여 직접 구현해보시는 것을 추천 드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;github link : &lt;a href=&quot;https://github.com/22ema/ComputerVision/tree/main/LBPRecognizer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/22ema/ComputerVision/tree/main/LBPRecognizer&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658155004705&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - 22ema/ComputerVision: Computer Vision based module&quot; data-og-description=&quot;Computer Vision based module. Contribute to 22ema/ComputerVision development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/22ema/ComputerVision/tree/main/LBPRecognizer&quot; data-og-url=&quot;https://github.com/22ema/ComputerVision&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kG7G1/hyO7xH7Ymv/lvLKNQ9k4VVA2EsTMGk6n1/img.png?width=1200&amp;amp;height=600&amp;amp;face=982_123_1032_177&quot;&gt;&lt;a href=&quot;https://github.com/22ema/ComputerVision/tree/main/LBPRecognizer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/22ema/ComputerVision/tree/main/LBPRecognizer&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kG7G1/hyO7xH7Ymv/lvLKNQ9k4VVA2EsTMGk6n1/img.png?width=1200&amp;amp;height=600&amp;amp;face=982_123_1032_177');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - 22ema/ComputerVision: Computer Vision based module&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Computer Vision based module. Contribute to 22ema/ComputerVision development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Computer vision 베이스이기 때문에 현재 딥러닝 기반의 기술들 보다 정확도가 다소 떨어지지만 GPU 자원이 없다면 위의 코드도 적용해볼 수 있을것 같습니다. 그리고 위의 LBP 코드를 기반으로 확장된 논문들이 많기 때문에 다른 논문들을 읽는데도 본 포스트가 도움이 될 것 같습니다. 감사합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://darkpgmr.tistory.com/116&quot;&gt;https://darkpgmr.tistory.com/116&lt;/a&gt;&lt;/p&gt;</description>
      <category>Computer Vision</category>
      <category>Computer Vision</category>
      <category>cv</category>
      <category>Face Recognition</category>
      <category>Histogram</category>
      <category>LBP</category>
      <category>Recognition</category>
      <author>dev-ima</author>
      <guid isPermaLink="true">https://development-ima.tistory.com/11</guid>
      <comments>https://development-ima.tistory.com/11#entry11comment</comments>
      <pubDate>Mon, 18 Jul 2022 23:37:55 +0900</pubDate>
    </item>
    <item>
      <title>OpenCV Face Detection and Recognition(얼굴 탐지 및 인식) - 1부</title>
      <link>https://development-ima.tistory.com/10</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;서론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 포스트에서는 Computer vision 기반의 3가지 얼굴 인식 및 탐지 방법을 연구합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- eigenfaces (1부)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Local Binary Patterns Histograms (2부)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Fisherfaces&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Eigenfaces face recognition&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EigenFaces face recognition은 PCA 방법(Principal Component Analysis) 방법을 사용하여 얼굴 데이터를 high demention에서 low demention으로 처리하고 얼굴 데이터의 주요 구성 정보를 얻은 다음 얼굴 인식을 완료한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EigenFaces 얼굴의 인식 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- create the EigenFace recognizer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- train the model with a known image&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- recognizer to identify the unknown image and confirm its identity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 얼굴 인식 단계의 설명은 code level로 설명을 하였습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PCA(Principal Component Analysis)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PCA는 분포된 데이터들의 주성분을 찾는 방법, 보통 여러차원의 큰 데이터를 3차원, 2차원으로 낮추어 보기위해 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러차원에서 데이터가 보여졌을 지라도 데이터가 실제로 있는 차원은 더 낮은 차원일 수 있다. 그래서 PCA를 사용하여 데이터가 실제로 존재하는 차원을 찾는 것이라고 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PCA는 데이터 하나 하나에 대한 성분을 분석하는 것이 아니라, 여러 데이터들이 모여 하나의 분포를 이룰 때 이 &lt;b&gt;분포의 주 성분&lt;/b&gt;을 분석한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주성분 이란 데이터들의 분산이 가장 큰 방향 벡터를 의미 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baFTgg/btrGS38YHo8/g5qkYdGEwPSAcLVnsFFtG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baFTgg/btrGS38YHo8/g5qkYdGEwPSAcLVnsFFtG0/img.png&quot; data-alt=&quot;2D에서의 PCA 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baFTgg/btrGS38YHo8/g5qkYdGEwPSAcLVnsFFtG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaFTgg%2FbtrGS38YHo8%2Fg5qkYdGEwPSAcLVnsFFtG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;451&quot; height=&quot;429&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2D에서의 PCA 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Code(Python)&lt;/h4&gt;
&lt;pre id=&quot;code_1657348353980&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import cv2

if __name__ == &quot;__main__&quot;:
    train_images = list()
    labels = list()
    test_image = None

    recoginer = cv2.face.EigenFaceRecognizer_create()
    recoginer.train(train_images, labels)
    label, confidence = recoginer.predict(test_image)

    print(&quot;Matching label :&quot;, label)
    print(&quot;Credibility: &quot;, confidence)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대략 위의 코드를 참고해서 직접 실습을 해보면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인식기를 생성한 후, 학습을 진행한다. 그리고 학습된 인식기를 이용해 테스트 이미지를 예측하고 label과 정확도를 출력하는 코드이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://programmer.ink/think/opencv-python-33.opencv-face-detection-and-recognition-face-recognition.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://programmer.ink/think/opencv-python-33.opencv-face-detection-and-recognition-face-recognition.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657344084331&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[OpenCV-Python]33.OpenCV face detection and recognition -- face recognition&quot; data-og-description=&quot;[OpenCV-Python]33.OpenCV face detection and recognition -- face recognition Posted by saadlive on Wed, 05 Jan 2022 22:41:50 +0100 33.OpenCV face detection and recognition - face recognition preface &amp;emsp; face recognition is to further judge a person's identi&quot; data-og-host=&quot;programmer.ink&quot; data-og-source-url=&quot;https://programmer.ink/think/opencv-python-33.opencv-face-detection-and-recognition-face-recognition.html&quot; data-og-url=&quot;https://programmer.ink/think/opencv-python-33.opencv-face-detection-and-recognition-face-recognition.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://programmer.ink/think/opencv-python-33.opencv-face-detection-and-recognition-face-recognition.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmer.ink/think/opencv-python-33.opencv-face-detection-and-recognition-face-recognition.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[OpenCV-Python]33.OpenCV face detection and recognition -- face recognition&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[OpenCV-Python]33.OpenCV face detection and recognition -- face recognition Posted by saadlive on Wed, 05 Jan 2022 22:41:50 +0100 33.OpenCV face detection and recognition - face recognition preface &amp;emsp; face recognition is to further judge a person's identi&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmer.ink&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://darkpgmr.tistory.com/110&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://darkpgmr.tistory.com/110&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657345467090&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[선형대수학 #6] 주성분분석(PCA)의 이해와 활용&quot; data-og-description=&quot;주성분 분석, 영어로는&amp;nbsp;PCA(Principal Component Analysis). 주성분 분석(PCA)은 사람들에게 비교적 널리 알려져 있는 방법으로서, 다른 블로그, 카페 등에 이와 관련된 소개글 또한 굉장히 많다. 그래도 기&quot; data-og-host=&quot;darkpgmr.tistory.com&quot; data-og-source-url=&quot;https://darkpgmr.tistory.com/110&quot; data-og-url=&quot;https://darkpgmr.tistory.com/110&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ofEpZ/hyO1632vAh/IQzmCOIJfHKKoUK8QBncRk/img.png?width=451&amp;amp;height=429&amp;amp;face=0_0_451_429,https://scrap.kakaocdn.net/dn/SJJft/hyO1YLIjYF/nYSR8jJxrWxXFpcJ5Aa0B1/img.png?width=451&amp;amp;height=429&amp;amp;face=0_0_451_429,https://scrap.kakaocdn.net/dn/cnrmL2/hyO13MZ2tu/7QNKpSIrkqEqYxkneXQTa1/img.png?width=550&amp;amp;height=412&amp;amp;face=0_0_550_412&quot;&gt;&lt;a href=&quot;https://darkpgmr.tistory.com/110&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://darkpgmr.tistory.com/110&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ofEpZ/hyO1632vAh/IQzmCOIJfHKKoUK8QBncRk/img.png?width=451&amp;amp;height=429&amp;amp;face=0_0_451_429,https://scrap.kakaocdn.net/dn/SJJft/hyO1YLIjYF/nYSR8jJxrWxXFpcJ5Aa0B1/img.png?width=451&amp;amp;height=429&amp;amp;face=0_0_451_429,https://scrap.kakaocdn.net/dn/cnrmL2/hyO13MZ2tu/7QNKpSIrkqEqYxkneXQTa1/img.png?width=550&amp;amp;height=412&amp;amp;face=0_0_550_412');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[선형대수학 #6] 주성분분석(PCA)의 이해와 활용&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주성분 분석, 영어로는&amp;nbsp;PCA(Principal Component Analysis). 주성분 분석(PCA)은 사람들에게 비교적 널리 알려져 있는 방법으로서, 다른 블로그, 카페 등에 이와 관련된 소개글 또한 굉장히 많다. 그래도 기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;darkpgmr.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Vision</category>
      <category>Computer Vision</category>
      <category>cv</category>
      <category>detect</category>
      <category>Face Recognition</category>
      <category>pca</category>
      <category>Recognition</category>
      <category>vision</category>
      <author>dev-ima</author>
      <guid isPermaLink="true">https://development-ima.tistory.com/10</guid>
      <comments>https://development-ima.tistory.com/10#entry10comment</comments>
      <pubDate>Sat, 9 Jul 2022 15:34:45 +0900</pubDate>
    </item>
    <item>
      <title>1. UML 다이어그램 정리</title>
      <link>https://development-ima.tistory.com/9</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJbHDs/btrEKUVsNxx/R7QZkdp128pNXZir5NiFDk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJbHDs/btrEKUVsNxx/R7QZkdp128pNXZir5NiFDk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJbHDs/btrEKUVsNxx/R7QZkdp128pNXZir5NiFDk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bJbHDs/btrEKUVsNxx/R7QZkdp128pNXZir5NiFDk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;283&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;283&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인사말&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬의 기초는 어느정도 숙지가 되었다고 생각이 됩니다. 그런데 다른 사람이 작성해둔 복잡한 코드나 혹은 내가 작성한 코드를 좀 더 나은(다른 사람이나 내가 유지보수하기 쉬운)코드를 설계 및 구현하고 싶어 아래 Design Pattern 강의를 듣는 중입니다. 그 중에서 좀 중요한 내용이나 다시 보면 좋을 것 같은 내용들을 정리하여 블로그에 작성하려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;UML 다이어그램&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인 패턴의 구조를 설명하거나 설계할 때, UML 다이어그램을 기반으로 작성하기 때문에, 기본적인 UML 다이어그램에 대해 정리를 하겠습니다. (본 설명은 draw.io를 이용하여 diagram을 그리며 설명합니다. 실습을 직접해보고 싶으신 분들은 draw.io를 이용하여 웹상에서 편하게 실습 할 수 있습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. A Basic Class&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zdypC/btrENI64SEh/zT8MUeA8dNLtWzqOXTiA8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zdypC/btrENI64SEh/zT8MUeA8dNLtWzqOXTiA8K/img.png&quot; data-alt=&quot;기본적인 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zdypC/btrENI64SEh/zT8MUeA8dNLtWzqOXTiA8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzdypC%2FbtrENI64SEh%2FzT8MUeA8dNLtWzqOXTiA8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;277&quot; height=&quot;228&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본적인 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림은 UML 다이어그램에서 작성되는 class의 예시이다. field는 멤버변수, method 는 메서드를 나타낸다. 멤버변수와 메서드는 public과 private으로 외부에서는 해당 변수값을 직접접근 하지 못하도록 제어할 수 있는데 이는 현재 UML 다이어그램과 상관이 크게 없는 내용이기 때문에 생략하겠습니다. 궁금하신 분들은 한번 직접 찾아보시는 것도 좋을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;2. Directed Association(직접 연관)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 디자인 패턴 강의에서는 a filled arraw라고 소개되었지만 draw.io에서는 아래와 같은 화살표를 사용하여 표현을 하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kKm2K/btrEJ53NIEo/skvNWmr8D78PHeqby5o1i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kKm2K/btrEJ53NIEo/skvNWmr8D78PHeqby5o1i1/img.png&quot; data-alt=&quot;Directed Association&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kKm2K/btrEJ53NIEo/skvNWmr8D78PHeqby5o1i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkKm2K%2FbtrEJ53NIEo%2FskvNWmr8D78PHeqby5o1i1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;252&quot; height=&quot;440&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Directed Association&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림에서 Person 클래스가 Car 클래스 또는 Car 클래스의 객체를 사용하기 때문에 Directed Association입니다. 예를 들어 &quot;Person은 Car 엔진의 시동을 겁니다.(start_engine(void))&quot;와 같이 Person이 Car 클래스의 객체 내 메서드를 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설명이 부족한 것 같아 Association과 함께 설명해보겠습니다.&lt;b&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Association&lt;/b&gt;은 양방향으로 위의 다이어그램이 양방향이 되려면 Car 또한 Person에 대한 정보를 가지고 있어야합니다. 예를 들어 Car의 주인을 출력하는 함수가 있다면 Person객체에서 이름 변수를 호출할 수 있어야한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Directed Association&lt;/b&gt;은 Association과 다르게 Car는 Person에 대한 정보가 전혀없고 Person에 접근을 할 수 없는 상태이어야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Extends/Inhrits A Class&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Extends(확장) 그리고 Inhrits(상속) 되는 클래스는 빈 화살표로 표현된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;229&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6sNpw/btrELjNU35Q/dhXaXzJwAihX0P98KAM4j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6sNpw/btrELjNU35Q/dhXaXzJwAihX0P98KAM4j0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6sNpw/btrELjNU35Q/dhXaXzJwAihX0P98KAM4j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6sNpw%2FbtrELjNU35Q%2FdhXaXzJwAihX0P98KAM4j0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;229&quot; height=&quot;427&quot; data-origin-width=&quot;229&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Car 클래스를 상속하는 BMW m340i는 Car 클래스 내 멤버변수와 메서드를 그대로 상속받는다. &lt;b&gt;기본적으로 Car가 가질 수 있는 속성 및 기능을 Car 클래스 정의하고 Car를 상속하는 다양한 자동차들을 만들면 각 자동차 객체에서 다시 제 구현할 필요가 없어진다!&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Interface&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A5HTZ/btrEJ53Uogb/CqD4KMCLtiLHt8hKh7kibk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A5HTZ/btrEJ53Uogb/CqD4KMCLtiLHt8hKh7kibk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A5HTZ/btrEJ53Uogb/CqD4KMCLtiLHt8hKh7kibk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA5HTZ%2FbtrEJ53Uogb%2FCqD4KMCLtiLHt8hKh7kibk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;331&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;interface(implementation)는 점선과 빈 화살표로 구성되어져있다. Iclass (interface)는 다양한 곳에서 활용된다. HAL에서 각 장치의 interface를 정의할 때 주로 사용된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;interface를 추상클래스로 선언하고 interface를 상속하는 Class A는 interface에서 선언한 method가 무조건 구현되어 있어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 구현하는 이유는 예를 들어 안드로이드 OS 임베디드 장치에서 카메라를 사용하고 싶다. 그런데 이 카메라 드라이버를 접근해서 기능을 사용하고 싶은데 그 기능은 모든 카메라별로 다 따로 저장할 수 없다. 그렇기 때문에 android os에서 사용할 수 있는 기능을 interface에 정의하고 그 인터페이스를 통해 카메라를 control하면 해당 기능이 구현된 어떤 camera라도 작동시킬수 있게된다. (이게 정확하게 맞는지는 좀 애매하지만 글을 읽었을때, interface에 대해서 이해를 할 수 있겠끔 작성하였습니다. 문제가 있다고 생각되시면 댓글 부탁드립니다.)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.Aggregates&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NKTDF/btrEOaib5RJ/7pILJfC3MZibEBDLkGF7M1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NKTDF/btrEOaib5RJ/7pILJfC3MZibEBDLkGF7M1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NKTDF/btrEOaib5RJ/7pILJfC3MZibEBDLkGF7M1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNKTDF%2FbtrEOaib5RJ%2F7pILJfC3MZibEBDLkGF7M1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;301&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Aggregates(집합)은 위와 같이 빈 마름모와 화살표로 이루어져있다. 말그대로 집합관계를 나타내는데, 둘이 필요관계는 아니라는 게 포인트이다. Library는 꼭 Book이 있어야하는 건 아니며 Book 또한 Library에 있어야하는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 다이어그램은&amp;nbsp; Library 클래스가 Book을 집계하기 때문에 집합관계를 그렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Association과 Aggregates의 차이가 궁금해서 인터넷을 찾아 보았다. 아래의 링크를 참조하여 확인해보세요.(광고아님ㅋㅋ)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stanleykou.tistory.com/entry/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Association-Aggregation-Composition-%EC%97%90-%EB%8C%80%ED%95%9C-%EC%84%A4%EB%AA%85&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stanleykou.tistory.com/entry/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Association-Aggregation-Composition-%EC%97%90-%EB%8C%80%ED%95%9C-%EC%84%A4%EB%AA%85&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655202714734&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[소프트웨어 공학] Association, Aggregation, Composition 에 대한 설명&quot; data-og-description=&quot;Q:&amp;nbsp;Association, Aggregation, Composition 이 세가지의 차이가 무엇인가요? 구현 시 어떻게 적용되는지&amp;nbsp;설명 해주세요. (질문자: ???) A: Association: 모든 오브젝트가 각자의 라이프사이클을 가지고 있고, 어..&quot; data-og-host=&quot;stanleykou.tistory.com&quot; data-og-source-url=&quot;https://stanleykou.tistory.com/entry/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Association-Aggregation-Composition-%EC%97%90-%EB%8C%80%ED%95%9C-%EC%84%A4%EB%AA%85&quot; data-og-url=&quot;https://stanleykou.tistory.com/entry/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Association-Aggregation-Composition-%EC%97%90-%EB%8C%80%ED%95%9C-%EC%84%A4%EB%AA%85&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bwI8Ds/hyOK64Bk97/2KlURAa1khCEa6SnOKC4Yk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/MbMmH/hyOLhLO5uz/JIVhK7k6zMIvJDRlA8i8w1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/zn9Et/hyOK7PYgrH/2YmP2KcUFJllk25wHLQTm0/img.png?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200&quot;&gt;&lt;a href=&quot;https://stanleykou.tistory.com/entry/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Association-Aggregation-Composition-%EC%97%90-%EB%8C%80%ED%95%9C-%EC%84%A4%EB%AA%85&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stanleykou.tistory.com/entry/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-Association-Aggregation-Composition-%EC%97%90-%EB%8C%80%ED%95%9C-%EC%84%A4%EB%AA%85&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bwI8Ds/hyOK64Bk97/2KlURAa1khCEa6SnOKC4Yk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/MbMmH/hyOLhLO5uz/JIVhK7k6zMIvJDRlA8i8w1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/zn9Et/hyOK7PYgrH/2YmP2KcUFJllk25wHLQTm0/img.png?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[소프트웨어 공학] Association, Aggregation, Composition 에 대한 설명&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Q:&amp;nbsp;Association, Aggregation, Composition 이 세가지의 차이가 무엇인가요? 구현 시 어떻게 적용되는지&amp;nbsp;설명 해주세요. (질문자: ???) A: Association: 모든 오브젝트가 각자의 라이프사이클을 가지고 있고, 어..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stanleykou.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://medium.com/@2xel/class-diagram%EC%9D%98-%EA%B4%80%EA%B3%84-%EC%97%B0%EA%B4%80-a84db4731e42&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://medium.com/@2xel/class-diagram%EC%9D%98-%EA%B4%80%EA%B3%84-%EC%97%B0%EA%B4%80-a84db4731e42&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655202916687&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Class Diagram의 관계(연관)&quot; data-og-description=&quot;Dependency(의존)&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/@2xel/class-diagram%EC%9D%98-%EA%B4%80%EA%B3%84-%EC%97%B0%EA%B4%80-a84db4731e42&quot; data-og-url=&quot;https://medium.com/@2xel/class-diagram%EC%9D%98-%EA%B4%80%EA%B3%84-%EC%97%B0%EA%B4%80-a84db4731e42&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://medium.com/@2xel/class-diagram%EC%9D%98-%EA%B4%80%EA%B3%84-%EC%97%B0%EA%B4%80-a84db4731e42&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/@2xel/class-diagram%EC%9D%98-%EA%B4%80%EA%B3%84-%EC%97%B0%EA%B4%80-a84db4731e42&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Class Diagram의 관계(연관)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Dependency(의존)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.Composition&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BMsuB/btrEPaWhBxN/XkInT7l3WkHTgwLtqTYHCk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BMsuB/btrEPaWhBxN/XkInT7l3WkHTgwLtqTYHCk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BMsuB/btrEPaWhBxN/XkInT7l3WkHTgwLtqTYHCk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBMsuB%2FbtrEPaWhBxN%2FXkInT7l3WkHTgwLtqTYHCk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;301&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Composition은 채워진 마름모에 화살표가 그려진 모습이다. ClassA는 ClassB가 무조건 존재해야만 구현이되며 서로 생명주기를 공유한다. 즉 Aggregation는 독립적으로 각 Class가 생명주기를 가지지만 Composition은 서로 생명주기를 공유하며 서로간에 무조건적으로 있어야하는 Class이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Design Pattern 강의 참조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.udemy.com/course/python-design-patterns&quot;&gt;https://www.udemy.com/course/python-design-patterns&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655193688880&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;udemy_com:course&quot; data-og-title=&quot;Python Design Patterns&quot; data-og-description=&quot;Design patterns to improve the speed, code reuse, and performance of your Python applications&quot; data-og-host=&quot;www.udemy.com&quot; data-og-source-url=&quot;https://www.udemy.com/course/python-design-patterns&quot; data-og-url=&quot;https://www.udemy.com/course/python-design-patterns/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bA0lhQ/hyOLb5L16m/rPeTbyTW4vd87qT8cKMqr0/img.jpg?width=480&amp;amp;height=270&amp;amp;face=0_0_480_270,https://scrap.kakaocdn.net/dn/0OcYy/hyOK28PBgU/zQ2UkTja4RhPnNdCXIbaBk/img.jpg?width=480&amp;amp;height=270&amp;amp;face=0_0_480_270&quot;&gt;&lt;a href=&quot;https://www.udemy.com/course/python-design-patterns&quot; data-source-url=&quot;https://www.udemy.com/course/python-design-patterns&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bA0lhQ/hyOLb5L16m/rPeTbyTW4vd87qT8cKMqr0/img.jpg?width=480&amp;amp;height=270&amp;amp;face=0_0_480_270,https://scrap.kakaocdn.net/dn/0OcYy/hyOK28PBgU/zQ2UkTja4RhPnNdCXIbaBk/img.jpg?width=480&amp;amp;height=270&amp;amp;face=0_0_480_270');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Python Design Patterns&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Design patterns to improve the speed, code reuse, and performance of your Python applications&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.udemy.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Design Pattern</category>
      <category>Design Pattern</category>
      <category>Python</category>
      <category>UML</category>
      <category>UML Diagram</category>
      <category>UML 다이어그램</category>
      <category>디자인패턴</category>
      <author>dev-ima</author>
      <guid isPermaLink="true">https://development-ima.tistory.com/9</guid>
      <comments>https://development-ima.tistory.com/9#entry9comment</comments>
      <pubDate>Tue, 14 Jun 2022 19:38:46 +0900</pubDate>
    </item>
    <item>
      <title>Machine Learning with Python -2주차-</title>
      <link>https://development-ima.tistory.com/8</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Regression&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;회귀는 연속값을 예측하는 방식이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 과거의 데이터로 자동차의 엔진크기, 실린더 수, 연료 소비량, 이산화탄소 배출량이 있다. 데이터를 통해 아직 제조되지 않은 차량의 이산화탄소 배출량을 예측하기 위해 회귀의 방식을 사용할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Linear Regression&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;독립변수&lt;/b&gt; : 자동차의 엔진크기, 실린더 수, 연료 소비량&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;종속변수&lt;/b&gt; : 이산화탄소 배출량&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선형 회귀에서 사용되는 데이터들은 종속변수가 연속적이어야 하며 이산값이어서는 안된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Simple Linear Regression&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 독립변수를 통해 종속변수를 예측한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 자동차의 엔진크기를 이용하여 이산화탄소 배출량을 예측하는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b12TAg/btrEdaJStMk/dVBYlU1Ik2WQHLZNAZaKKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b12TAg/btrEdaJStMk/dVBYlU1Ik2WQHLZNAZaKKK/img.png&quot; data-alt=&quot;Simple Linear Regression&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b12TAg/btrEdaJStMk/dVBYlU1Ik2WQHLZNAZaKKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb12TAg%2FbtrEdaJStMk%2FdVBYlU1Ik2WQHLZNAZaKKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;406&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Simple Linear Regression&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 Simple Linear Regression은 일차방정식으로 표현할 수 있다. 예를 들어 x축이 자동차의 엔진 크기이고 y축이 이산화탄소 배출량이라고 가정했을때(물론 아닙니다. 단순 예시일 뿐, 입니다.), 자동차 엔진의 크기가 1이면 이산화탄소 배출량은 약 3.7정도의 값을 가진다고 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 독립변수와 종속변수의 분포를 보고 선형관계를 파악하는 것이 목적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pred = ceta0 + ceta1 * x1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 수식에서 최적의 ceta0와 ceta1을 찾는 것이 목적이라고 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;error(오차)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최적의 ceta0와 ceta1을 찾기위해 예측값과 실제 정답값(GT)사이의 오차를 계산해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 오차를 계산하면 y-pred 수식을 이용하여 오차를 구할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 보통 MSE, MAE, RMSE 등과 같은 방식으로 오차를 구한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvRBMc/btrEbDGfsMg/sfB3T1U2FmLlLZsttAw6QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvRBMc/btrEbDGfsMg/sfB3T1U2FmLlLZsttAw6QK/img.png&quot; data-alt=&quot;MSE&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvRBMc/btrEbDGfsMg/sfB3T1U2FmLlLZsttAw6QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvRBMc%2FbtrEbDGfsMg%2FsfB3T1U2FmLlLZsttAw6QK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;353&quot; height=&quot;143&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MSE&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;model Evaluation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습과 테스트 셋으로 나눈다 이때, 학습과 테스트 셋은 서로 중복된 데이터가 존재해서는 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 최적의 학습과 테스트 셋을 만들기 위해 K-fold cross validation을 사용하기도 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Multiple Linear Regression&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러개의 독립변수를 통해 종속변수를 예측한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 자동차의 엔진크기와 실린더의 수를 통해 이산화탄소 배출량을 예측하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Estimate ceta&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;optimization 알고리즘을 통해 최적화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Gradient Descent&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Non-Linear Regression&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Polynomial regression&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독립변수와 종속변수의 관계가 X의 N차수 다항식으로 모델링 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 pred = ceta0 + ceta1 * x + ceta2 * x^2 + ceta3 * x^3으로 표현될 수 있다. 그런데 이는 다시 선형회귀로도 표현할 수 잇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x1 = x&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x2 = x^2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x3 = x^3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;으로 치환된다면 선형회귀로 표현이 가능하다. 그렇기 때문에 Least Squares 방식으로 최적의 다항식이 추정 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 문제는 데이터에 잘맞는 회귀유형을 선택해야한다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>deeplearning study</category>
      <author>dev-ima</author>
      <guid isPermaLink="true">https://development-ima.tistory.com/8</guid>
      <comments>https://development-ima.tistory.com/8#entry8comment</comments>
      <pubDate>Tue, 7 Jun 2022 19:11:15 +0900</pubDate>
    </item>
  </channel>
</rss>