<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>space_song.log</title>
        <link>https://velog.io/</link>
        <description>반갑습니다</description>
        <lastBuildDate>Sat, 25 May 2024 04:41:25 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. space_song.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/space_song" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[NVM으로 Node.js 설치]]></title>
            <link>https://velog.io/@space_song/NVM%EC%9C%BC%EB%A1%9C-Node.js-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@space_song/NVM%EC%9C%BC%EB%A1%9C-Node.js-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Sat, 25 May 2024 04:41:25 GMT</pubDate>
            <description><![CDATA[<h2 id="nodejs">Node.js</h2>
<p> 자바스크립트는 애초에 웹 브라우저 위에서 동적으로 변하는 페이지를 만들기 위해 탄생하였다. Node.js는 자바스크립트 코드를 웹 브라우저에서 꺼내, 데스크톱 환경이나 서버 위에서도 돌아갈 수 있게 만들어주는 런타임 환경이다.</p>
<h2 id="nvm">NVM</h2>
<p>보통 Node.js는 NVM을 통해 사용된다. NVM은 비공식 Node.js 버전 관리 프로그램이다. </p>
<blockquote>
<p><a href="https://github.com/nvm-sh/nvm">깃허브 링크</a></p>
</blockquote>
<p>다음 명령으로 설치한다.</p>
<pre><code>curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash</code></pre><p>아래 명령으로 NVM을 활성화 시킨다.</p>
<pre><code>source ~/.bashrc</code></pre><p>이제 NVM으로 Node.js를 설치하자. 다음 명령어는 최신 버전의 Node.js를 설치한다.</p>
<pre><code>nvm install node</code></pre><p>nvm ls-remote --lts 명령어로 LTS 패키지 목록을 볼 수 있다. nvm install &lt;버전&gt;을 입력하면 해당 버전을 다운로드 할 수 있고 nvm use &lt;버전&gt;으로 사용할 버전을 바꿀 수 있다.</p>
<p>nvm --help로 명령어 목록을 볼 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[인공지능 기초]]></title>
            <link>https://velog.io/@space_song/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@space_song/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Sun, 19 May 2024 09:17:29 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>📕혼자 공부하는 머신러닝 딥러닝</strong>을 학습한 내용을 정리한 문서입니다.</p>
</blockquote>
<p><a href="https://github.com/rickiepark/hg-mldl">공식 깃허브 링크</a></p>
<h2 id="📖-개론">📖 개론</h2>
<p> <strong>인공지능</strong>은 사람처럼 <strong>학습하고 추론할 수 있는 지능을 가진 컴퓨터 시스템</strong>을 만드는 기술이다. 인공지능의 역사는 지금으로부터 80년 전 앨런 튜링이 인공지능이 사람과 같은 지능을 테스트할 수 있는 튜링 테스트를 발표하면서 태동한다. 이 시기를 인공지능 태동기라고 한다. </p>
<p> 이후 프랑크 로젠블라트가 퍼셉트론을 발표하면서 인공지능 황금기가 시작된다. 하지만 1950 ~ 60년대는 아직 컴퓨터의 성능에 한계가 명확했던 시대이기에 인공지능의 성능은 아주 간단한 문제를 해결하는 것에 그쳤고, 한동안 인공지능에 겨울이 도래했다. 전문가시스템이 등장하면서 잠깐 인공지능 붐이 찾아오기도 했지만 잠시 뿐이었다.</p>
<p> 시간은 현재에 이르러, 컴퓨터의 성능이 기하급수적으로 발전했고 다시 인공지능이 각광을 받고 있다. 지금은 어디를 가더라도 인공지능이라는 글자가 보이고 대부분의 기업들은 인공지능으로 공격적인 마케팅을 펼치고 있다. 2016년 알파고를 시작으로 인공지능은 이제 우리의 일상생활에도 깊숙히 침투해 자리잡았다. </p>
<hr>
<h2 id="🧠-강약인공지능">🧠 강/약인공지능</h2>
<p> 인공지능은 약인공지능과 강인공지능 두 가지로 분류해볼 수 있다. 아이언맨의 자비스, Her의 사만다처럼 사람과 구분하기 어려운 지능을 가진 컴퓨터 시스템을 <strong>강인공지능</strong>이라고 한다.</p>
<p> 반면 우리가 현실에서 마주하는 인공지능은 약인공지능이다. <strong>약인공지능</strong>은 아주 좁은 특정 분야에서 사람이 해내는 일을 도와주는 역할만 할 수 있다. 음성비서, 자율주행 자동차, 기계 번역, 음악 추천, 알파고 등이 약인공지능이다. </p>
<h2 id="머신러닝과-딥러닝">머신러닝과 딥러닝</h2>
<p> 머신러닝은 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야이다. 머신러닝 알고리즘 중에 인공 신경망을 기반으로 한 방법을 딥러닝이라고 한다. 어떤 사람들은 인공신경망과 딥러닝을 구분하지 않고 사용하기도 한다.</p>
<ul>
<li><strong>머신러닝</strong> : 스스로 데이터에서 학습하는 알고리즘</li>
<li><strong>딥러닝</strong> : 인공신경망을 사용한, 머신러닝의 한 분야</li>
</ul>
<h2 id="지도학습과-비지도-학습">지도학습과 비지도 학습</h2>
<p> 머신러닝 알고리즘은 크게 지도 학습과 비지도 학습으로 나뉜다. 둘의 차이는 훈련하기 위한 데이터에 정답이 있는가에 달려있다.</p>
<ul>
<li><p><strong>지도학습</strong> : 훈련하기 위한 데이터에 정답이 있다. 개와 고양이 사진을 주며 어떤 것이 개, 어떤 것이 고양이인지 정답을 알려주고 훈련시킨다. 인공지능은 사진을 보면 개인지 고양이인지 정답을 맞춘다.
이때 개, 고양이 사진을 입력 input
알려준 정답을 타깃 target 이라고 한다.</p>
</li>
<li><p><strong>비지도학습</strong> : 데이터에 정답이 없다. 정답을 알려주지 않고 개와 고양이 사진을 잔뜩 준다. 인공지능이 사진을 보고 정답을 맞힐 수는 없지만 데이터를 분류하고 파악한다.</p>
</li>
</ul>
<hr>
<h2 id="📑-데이터-나누기">📑 데이터 나누기</h2>
<p> 머신러닝의 훈련에 사용되는 데이터는 머신러닝의 평가에 사용되는 데이터와는 달라야한다. 모의고사 문제와 수능 문제가 똑같다면 다들 쉽게 만점을 받아버릴테니까. 머신러닝의 훈련과 정확한 평가를 위해서 보통은 준비된 데이터를 두 개로 나눈다. </p>
<ul>
<li><strong>테스트 세트</strong> : 평가에 사용하는 데이터</li>
<li><strong>훈련 세트</strong> : 훈련에 사용되는 데이터</li>
</ul>
<p>테스트 세트의 데이터는 훈련에 사용된 데이터를 재사용해서는 안된다. </p>
<h2 id="📑-샘플링-편향">📑 샘플링 편향</h2>
<p> 생선은 분류하는 머신러닝을 만든다고 해보자. 생선에 대한 데이터를 잔뜩 준비해야 할 것이다. 이때 하나의 생선 데이터를 샘플이라고 한다.</p>
<p> 이제 각 샘플들을 적절히 묶어 테스트 세트와 훈련 세트로 나누어야 할 것이다. 생선이 참치와 복어 두 종류라고 가정해보자. 테스트 세트엔 참치 샘플들로만 구성하고, 훈련 세트엔 복어 샘플로만 구성하면 어떻게 될까? 당연히 머신러닝은 두 생선을 분류하지 못하게 된다. 이러한 현상을 <strong>샘플링 편향</strong>이라고 부른다. <strong>각 세트에는 샘플이 골고루 섞여 있어야 한다.</strong></p>
<h2 id="📑-데이터-전처리">📑 데이터 전처리</h2>
<p> 각 샘플을 분류하는데 샘플이 가진 특성값들을 기준으로 한다. 생선 데이터에 특성으로 무게와 길이가 있다고 하자. 무게값의 범위는 0 ~ 1000, 길이 값의 범위는 10 ~ 40 정도 될 것이다. 이렇게 두 특성 간 범위(스케일)이 매우 다르다면, 클래스를 분류하는데 스케일이 작은 특성은 무시되고 스케일이 큰 특성의 힘이 매우 강해지는 일이 벌어진다. <strong>두 특성이 주는 영향을 같게 만들기 위해서 스케일을 일정한 기준으로 맞춰주어야 한다</strong>. 이 과정을 <strong>데이터 전처리</strong>라고 한다.</p>
<p> <strong>표준점수</strong>는 가장 널리 사용되는 전처리 방법이다. 각 특성값이 평균에서 표준편차의 몇 배만큼 떨어져 있는지 나타낸다.</p>
<hr>
<h3 id="머신러닝-기초용어-정리">머신러닝 기초용어 정리</h3>
<p>분류 : 여러개의 종류 중 하나를 구별해 내는 문제
클래스 : 분류로 구분되는 종류  ex) 동물 분류에서 개, 고양이, 참새
이진분류 : 2개의 클래스 중 하나를 고르는 문제</p>
<p>특성 feature : 데이터의 특징
입력 input : 지도학습에서 제공하는 데이터
타깃 target : 지도학습에서 알려주는 정답</p>
<p>훈련 training : 답을 찾기위한 학습과정
정확도 accuracy : 분류해낸 결과와 정답간의 차이</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS] 부동소수점 오차]]></title>
            <link>https://velog.io/@space_song/CS-%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90-%EC%98%A4%EC%B0%A8</link>
            <guid>https://velog.io/@space_song/CS-%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90-%EC%98%A4%EC%B0%A8</guid>
            <pubDate>Wed, 24 Jan 2024 08:54:14 GMT</pubDate>
            <description><![CDATA[<h3 id="컴퓨터님은-실수를-정확히-연산하지-못해">컴퓨터님은 실수를 정확히 연산하지 못해</h3>
<p>0.1 + 0.1은 당연히 0.2다. 컴퓨터, 너도 그렇게 생각하지?</p>
<pre><code>0.1 + 0.1 == 0.2
&gt;&gt; false</code></pre><p> 컴퓨터에서 실수의 연산 결과는 우리의 생각과 다를 수 있다. 이런 현상은 특정한 프로그래밍 언어에서만 나타는게 아니라 모든 컴퓨터에서 전반적으로 나타나는 문제다. 문제의 원인이 컴퓨터가 수를 2진수로 다루는 것에 있기 때문이다.</p>
<h3 id="정수의-표현법">정수의 표현법</h3>
<p> 모두가 알다시피 컴퓨터는 모든 수를 2진수로 변환해 저장한다. 0와 1만 다룰 줄 아니까.
 컴퓨터는 10진수 숫자 7을 00000111로 변환해서 다루는 것이다.</p>
<p> 컴퓨터 내부의 메모리, 디스크는 0 또는 1의 두가지 상태중 하나를 저장할 수 있는 방을 수억개씩 가지고 있다고 생각하면 된다. 위의 경우 8칸의 방을 할당해서 00000111을 저장할 것이다.</p>
<h3 id="실수의-표현법">실수의 표현법</h3>
<p> 오케이, 여기까지 문제 없다. 그러면 실수는 어떻게 저장할까?</p>
<h4 id="1-고정소수점-fixed-point">1. 고정소수점 fixed point</h4>
<blockquote>
<p>(부호 1비트)(정수부 15비트)(소수부 16비트) //총 32비트</p>
</blockquote>
<p>오케이, 10진수 실수를 2진수로 변환한 다음에 그냥 정수부랑 소수부 두개로 나눠서 따로 저장하면 되겠네! 단순명료하다.
 그런데 문제가 있다. 표현할 수 있는 범위가 너무 작다.</p>
<h4 id="2-부동소수점-floationg-point">2. 부동소수점 floationg point</h4>
<p>  그래서 등장했다. 실수를 가수부와 지수부로 나누는 방법이다.</p>
<blockquote>
<p>±(1.가수부)×2^(지수부-127)
(부호 1비트)(지수부 8비트)(가수부 23비트) //총 32비트. IEEE float</p>
</blockquote>
<p>  똑똑한 사람들이 고민한 결과 이 수식을 이용해서 컴퓨터에 실수를 저장하기로 합의했다. 이제 자릿수의 제한이 있는 고정소수점 방식보다 더 넓은 범위의 실수를 저장할 수 있게 되었다. 현재 대부분의 컴퓨터는 부동소수점 방식을 따른다.</p>
<p>  그런데 문제가 있다. 부동소수점 방식도 여전히 실수를 2진수로 변환하기 때문에 여기서 문제가 발생한다. 
  0.125 같은 숫자는 2진수로 0.001로 깔끔하게 떨어진다.
  하지만 0.1 같은 경우 2진수로 표현하면 0.0001100110011001100110011001100110011001100110011...가 무한히 반복되는 <code>순환소수</code>가 된다!!! 이걸 컴퓨터에 저장하려면 당연히 일정부분부터는 <code>버릴 수 밖에 없다</code>. 바로 여기서 오차가 발생한다.</p>
<pre><code> float a = 0.1; //이건 0.1에 아주 가까울 뿐인 다른 숫자다!</code></pre><h3 id="해결-못하나요">해결 못하나요?</h3>
<p>  몇가지 방법이 있다. 아주 정확히 계산해야 할 필요가 있을때 쓰는 방법이다.</p>
<h4 id="1-정수로-저장하자">1. 정수로 저장하자</h4>
<p> 1.23 같은 실수는 100을 곱해 123으로 저장하면 된다.</p>
<h4 id="2-반올림-문법을-사용하자">2. 반올림 문법을 사용하자</h4>
<p> 반올림 문법을 적절하게 사용해서 문제를 막으면 된다.</p>
<h4 id="3-double-자료형을-쓰자">3. double 자료형을 쓰자</h4>
<p> float말고 double을 써보자. double은 64비트를 할당해주는 자료형이다. 당연히 오차가 훨씬 더 작아진다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C/C++] enum, enum class]]></title>
            <link>https://velog.io/@space_song/CC-enum-enum-class</link>
            <guid>https://velog.io/@space_song/CC-enum-enum-class</guid>
            <pubDate>Mon, 22 Jan 2024 14:13:48 GMT</pubDate>
            <description><![CDATA[<h3 id="열거형이란">열거형이란?</h3>
<p> 프로그램을 만들다보면 C/C++가 제공하는 자료형만으로는 뭔가 아쉬울때가 있다. C/C++는 그런 우리를 위해 사용자가 마음대로 만들어 쓸 수 있는 enum, enum class, struct, class, union과 같은 사용자 정의 자료형을 제공한다.
 열거형(enum)은 특정 정수에 이름을 붙여 가독성을 높이는데 유용하다.
-&gt;열거형은 열거한 모든 값이 지정한 정수값으로 컴파일 타임에 변경된다.
-&gt;열거형을 정의해도 메모리에는 할당되지 않는다. 변수를 선언한 경우에 메모리가 할당된다.
-&gt;각 열거자의 값은 정수상수이지만, int 등 정수형과 비교하려면 형변환 연산자가 필요하다. (원래는 됐는데 enum class 나오면서 불가능해짐.)</p>
<h2 id="📌enum">📌enum</h2>
<h4 id="사용법">사용법</h4>
<pre><code>enum ChessPiece{
    PAWN, 
    ROOK, 
    KNIGHT, 
    BISHOP, 
    QUEEN, 
    KING
};</code></pre><p>열거형 키워드, 열거형 이름, 구성 상수 이름 순서로 적는다. 값을 지정하지 않으면 0부터 1씩 차례로 증가하며 값을 지정하면 지정된 값부터 1씩 증가한다.</p>
<pre><code>enum ChessPiece{
    PAWN = 1, 
    ROOK, 
    KNIGHT, 
    BISHOP, 
    QUEEN = 10, 
    KING
};</code></pre><p>PAWN = 1, ROOK = 2, KNIGHT = 3, BISHOP = 4, QUEEN = 10, KING = 11 이 된다.</p>
<h4 id="이름-중복-불가">이름 중복 불가</h4>
<pre><code>enum ChessPiece{
    PAWN, 
    ROOK, 
    KNIGHT, //이름 중복으로 오류가 난다.
    BISHOP, 
    QUEEN, 
    KING
};
enum CharacterClass{
    KNIGHT,    //이름 중복으로 오류가 난다.
    WIZARD,
    ARCHER
};</code></pre><p>열거자의 값들은 같은 namespace에 속하므로 같은 이름을 사용할 수 없다.</p>
<h2 id="📌enum-class">📌enum class</h2>
<p> 위처럼 enum은 별도의 namespace를 가지지 못한다는 단점을 가지고 있었다. 이 문제점을 보완하기 위해 등장한것이 enum class다.</p>
<pre><code>enum class ChessPiece{
    PAWN, 
    ROOK, 
    KNIGHT,
    BISHOP, 
    QUEEN, 
    KING
};
enum class CharacterClass{
    KNIGHT,
    WIZARD,
    ARCHER
};</code></pre><p>이후 <strong>enum class명::열거자</strong>로 접근하면 이름중복 걱정없이 사용할 수 있다.</p>
<h4 id="●◡●-명시적-형변환">(●&#39;◡&#39;●) 명시적 형변환</h4>
<pre><code>//명시적 형변환 사용
int main() {
    if(static_cast&lt;int&gt;(ChessPiece::PAWN) == 0) {
        std::cout &lt;&lt; &quot;PAWN is 0.&quot; &lt;&lt; std::endl;
    }
}</code></pre><p>enum class를 int와 비교하려면 명시적 형변환을 사용해야한다.</p>
<h4 id="●◡●-다른-정수형으로-정의">(●&#39;◡&#39;●) 다른 정수형으로 정의</h4>
<pre><code>enum class CharacterClass : short{
    KNIGHT,
    WIZARD,
    ARCHER
};</code></pre><p>해당 열거형의 크기가 형식에 맞춰진다.</p>
<h4 id="●◡●-전방선언">(●&#39;◡&#39;●) 전방선언</h4>
<pre><code>enum class CharachterClass : short;</code></pre><p>전방선언이 가능한데, 전방선언시 컴파일러가 미리 메모리를 잡아놓을 수 있도록 데이터 타입을 꼭 지정해주어야 한다.</p>
]]></description>
        </item>
    </channel>
</rss>