Category Archives: 배우기

Machine Learning/ 신경망

주의) 이 페이지에서는 공식의 유도 과정 같은 것은 정리하지 않는다. 공식의 유도 과정은 <코세라 강의> 참조.

신경망(Neural Network)

http://www.opennn.net/

  • 인간의 뉴런 네트워크를 모사하여 데이터를 분류하는 방법.
    • 이전 노드들의 결과에 영향을 받아 현재 노드가 활성화가 될지 비활성화가 될지가 결정되고 최종적으로 output이 결정된다.
    • 결국 노드는 활성화/비활성화로 결정되기 때문에 신경망은 로지스틱 회귀의 복잡한 버전이라고 생각하면 된다.
    • 신경망으로 예측문제를 풀 수 있는지는 모르겠다. 코세라 강의에서는 분류 문제만 푸는데, 최종 output node가 각각의 분류에 해당하기 때문에 모델 자체가 분류 문제에 적합한 모양으로 보임
  • 맨 앞의 입력과 맨 뒤의 출력 사이에 있는 레이어는 히든 레이어(hidden layer)라 불리며, 각 히든 레이어의 각 노드들은 하나의 로지스틱 회귀에 해당한다.
  • 신경망을 단순화 하여 논리게이트 (AND, OR, XOR) 연산을 할 수도 있지만 그 내용에 대해서는 생략.

Continue reading

Machine Learning/ 로지스틱 회귀

주의) 이 페이지에서는 공식의 유도 과정 같은 것은 정리하지 않는다. 공식의 유도 과정은 <코세라 강의> 참조.

로지스틱 회귀 (Logistic Regression)

http://www.puzzlr.org/write-your-own-logistic-regression-function-in-r/

  • 데이터를 분류하기 위한 방법
    • 메일이 스팸인지 아닌지, 종양이 양성인지 음성인지를 구분한다.
  • 특정 데이터를 분류하는 기준(threshold)을 바탕으로 기준을 넘어서면 분류에 속하고 아니면 분류에 속하지 않는 것으로 판별한다.
    • 분류에 속하느냐 아니냐이기 때문에 값은 0이냐 1이냐로 나온다. 보다 정확히 말하면 결과값이 0에 가까우냐 1에 가까우냐를 가지고 0 또는 1로 값을 매긴다.
    • 분류의 종류가 여러개일 경우 각각의 분류 마다 분류에 속하는지 아닌지를 판별한다.
  • 분류 문제에 선형회귀를 쓰는 것은 좋은 방법이 아닌데, outlier 값이 선의 기울기를 크게 바꾸기 때문.

Continue reading

Machine Learning/ 선형 회귀

주의) 이 페이지에서는 공식의 유도 과정 같은 것은 정리하지 않는다. 공식의 유도 과정은 <코세라 강의> 참조.

선형 회귀 (Linear Regression)

https://en.wikipedia.org/wiki/Linear_regression

  • 연속적인 속성의 값을 예측하기 위한 방법.
    • 집의 크기가 얼마이고 위치가 어디일 때 집값을 얼마일 것인가에 대한 예측한다.
  • 분포된 데이터의 결과값을 표현하는 선을 긋고 –위 이미지의 빨간색 선– 그 선을 통해 새로운 데이터가 입력 되었을 때 그 결과값을 예측한다.

Continue reading

Machine Learning/ 개요

개요

  • 지도 학습 & 비지도 학습
    • 지도 학습(Supervised Learning)
      • 답이 있는 것을 학습 시키는 것 ex) 고양이 사진을 학습 시켜서 새로운 사진을 보고 고양이인지 아닌지를 판별하는 것
    • 비지도 학습(Unsupervised)
      • 답이 없는 것에서 패턴을 찾아 분류하는 것
  • 회귀 & 분류
    • 회귀 (Regression)
      • 연속적인 속성의 값을 예측하는 것으로 선형 회귀가 대표적. ex) 집 값이 얼마냐
    • 분류 (Classification)
      • 이산적인 속성의 값을 예측 하는 것으로 로지스틱 회귀가 대표적. ex) 양성이냐 음성이냐, 해킹을 당했느냐 안 당했느냐
      • 사실 이산적인 속성도 양이 많아지면 연속적인 것으로 보이기 때문에 이 둘 사이에는 모호한 지점이 있다.
  • Clustering & Non-Clustering
    • Clustering
      • 비지도 학습 중에서 비슷한 분류가 될 수 있는 것 –거리가 가깝거나 비슷한 의미거나 등– 끼리 묶는 것
    • Non-Clustrering
      • 비지도 학습 중에서 혼돈 속에서 패턴을 찾아내는 것. 강의의 예에서는 소음 속에서 개별 목소리를 뽑아내는 예가 있다.
  • 머신러닝에서 사용하는 개념들
    • 가설 함수(Hypothesis)
      • 선형 회귀나 로지스틱 회귀, 인공신경망에서 사용하는 모델 자체를 의미.
    • 비용 함수(Cost Function)
      • 가설함수와 실제 데이터의 차이 값을 의미.
      • 비용함수의 값이 0이라는 것은 모델로 세운 가설함수가 실제 데이터와 정확히 일치한다는 것을 의미한다.
      • 머신러닝은 결국 최저의 비용을 갖도록 가설함수를 만드는 과정이다.
    • Gradient Descent
      • 가설함수의 비용을 줄이는 알고리즘.
      • 가설함수의 각 파라미터 별로 비용함수를 편미분한 후 이전 파라미터 값에서 빼는 식으로 가설함수의 파라미터 값을 조절하면서 가설함수의 비용을 줄이는 방식을 사용한다.
      • 각 파라미터의 크기에 차이가 있기 때문에 그것을 보정하는 Feature Scaling과 파라미터의 값을 추가로 조절하는 Regularization 가 추가로 사용된다.
    • 과소적합(Underfitting) vs 과적합(Overfitting)
      • 가설함수가 실제 데이터의 값을 제대로 반영하지 못하는 경우 과소적합(Underfitting) 편향이 높다(High Bias)고 하며, 가설함수가 시험용 데이터에는 부합하지만, 다른 데이터 셋에는 부합하지 못하는 경우 과적합(Overfitting) 분산이 높다(High Variance)고 한다.
  • 위 내용은 사실 머신러닝 이전에 이미 각 분야에서 사용되던 통계적인 분석 방법이다. 머신러닝은 통계적인 분석 방법을 기계에 학습 시켜서 사용하는 것.
    • 물론 인공신경망 같은 것은 컴퓨터의 등장으로 가능해진 방법.

C# 6.0 완벽 가이드/ 고급 C#

대리자

  • 대리자(delegate)는 어떤 메서드를 호출하는 방법을 담은 객체
  • 대리자 형식은 그 형식의 인스턴스, 즉 대리자 인스턴스가 호출할 수 있는 종류의 메서드를 정의한다.
  • 메서드를 대리자 변수에 배정하면 대리자 인스턴스가 생성된다.
  • 대리자 인스턴스는 이름 그대로 호출자의 대리자 역할을 한다. 즉, 호출자가 대리자를 호출하면 대리자가 대상 메서드를 대신 호출해 준다. 이러한 간접 호출에 의해, 호출자와 대상 메서드 사이의 결합(coupling)이 끊어진다.
// 다음과 같은 문장은
Transformer t = Square;

// 다음 문장을 줄여 쓴 것이다.
Transformer t = new Transformer(Square);

// 한편 다음과 같은 표현식은
t(3);

// 다음을 줄여 쓴 것이다.
t.Invoke(3);

Continue reading

C# 6.0 완벽 가이드/ C#의 사용자 정의 형식

클래스

메서드

메서드에 적용할 수 있는 수정자들

정적 수정자 static
접근 수정자 public, internal, private, protected
상속 수정자 new, virtual, abstract, override, sealed
부분 메서드 수정자 partial
비관리 코드 수정자 unsafe, extern
비동기 코드 수정자 async

식 본문 메서드 (C# 6)

int Foo (int x) { return x * 2; }

int Foo (int x) => x * 2; // 위 코드와 동일

void Foo (int x) => Console.WriteLine(x); // 반환형이 void인 함수도 이런 식으로 사용할 수 있다.
  • 위의 코드와 같이 표현식이 본문인 메서드(expression-bodied method)를 줄여서 식본문 메서드라고 부른다. 중괄호와 return 키워드 대신 ‘이중 화살표’가 쓰였다.

Continue reading

C# 6.0 완벽 가이드/ C# 언어의 기초

첫 번째 C# 프로그램

컴파일

  • C# 컴파일러는 확장자가 .cs인 일단의 소스코드 파일들을 컴파일해서 하나의 어셈블리를 생성한다. 어셈블리는 .NET 프로그램 패키징 및 배포 단위이다. 어셈블리는 응용 프로그램(application)일 수도 있고 라이브러리(library)일 수도 있다.
  • 보통의 콘솔 또는 Windows 응용 프로그램은 진입점 Main 메서드를 가지고 있으며 파일 확장자는 .exe이다. 라이브러리의 확장자는 .dll이며, .exe와는 달리 진입점이 없다. 라이브러리의 주된 용도는 라이브러리 안의 코드를 다른 응용 프로그램이나 다른 라이브러리가 호출 또는 참조하는 것이다. .NET Framework는 라이브러리들의 집합이다.
  • C# 컴파일러 프로그램의 이름은 csc.exe이다. C# 프로그램은 Visual Studio 같은 IDE로 컴파일 할 수도 있고, 명령줄에서 csc를 직접 실행해서 컴파일 할 수도 있다.
csc MyFirstProgram.cs // 응용 프로그램 컴파일
csc /target:library MyFirstProgram.cs // 라이브러리 컴파일

구문

키워드와의 충돌 피하기

  • 예약된 키워드에 해당하는 식별자를 꼭 사용해야 한다면 식별자 앞에 접두사 @를 붙이면 된다.
    • @ 기호는 식별자 자체의 일부로 간주되지 않는다. 즉, @myVariable은 myVariable과 같다.
    • 접두사 @는 C#과는 다른 키워드들을 가진 다른 .NET 언어로 작성된 라이브러리를 C# 프로그램에서 사용할 때 유용할 수 있다.

Continue reading

C# 6.0 완벽 가이드/ C#과 .NET Framework 소개

(필요한 부분만 정리)

C#과 CLR의 관계

  • C#은 자동 메모리 관리와 예외 처리 같은 다양한 기능을 갖춘 런타임에 의존한다. C#의 설계는 해당 실행시점 기능들을 제공하는 Microsoft CLR의 설계와 밀접하게 대응된다.(비록 기술적으로는 C#이 CLR과 독립적이지만) 게다가 C#의 형식 체계는 CLR의 형식 체계와 밀접하게 대응된다.

CLR과 .NET Framework

  • .NET Framework는 CLR과 아주 다양한 라이브러리들의 집합으로 구성되어 있다. 그 라이브러리 집합에는 핵심 라이브러리들과 그 핵심 라이브러리들에 의존하는 응용 라이브러리들이 있다.
  • CLR은 관리되는 코드(managed code)를 실행하기 위한 런타임이다. C#은 여러 관리되는 언어(managed language) 중 하나인데, 관리되는 언어로 작성한 소스 코드를 컴파일하면 관리되는 코드가 생성된다. 관리되는 코드를 실행 파일(.exe) 또는 라이브러리(.dll) 형태로 만들고 그것을 형식 정보, 즉 메타자료(metadata)와 함께 하나의 패키지로 묶은 것을 어셈블리(assembly)라고 부른다.
  • 관리되는 코드는 중간 언어(intermediate language, IL)로 표현된다. 어셈블리를 적제(load)할 때 CLR은 어셈블리에 담긴 IL 코드를 해당 컴퓨터(x86 등) 고유의 기계어 코드로 변환한다. 이러한 변환을 담당하는 것이 CLR의 JIT(just-in-time) 컴파일러이다. 어셈블리는 원래의 원본 언어의 구성을 거의 그대로 유지하기 때문에 코드를 조사하기 쉽고 심지어 동적으로 생성하기도 쉽다.
    • ILSpy나 dotPeek, Reflector 같은 도구를 이용하면 IL 어셈블리의 내용을 조사하고 역컴파일 할 수 있다.
  • CLR은 여러 실행시점 서비스들의 호스트 역할을 한다. 그런 서시브들로는 이를테면 메모리 관리, 라이브러리 적재, 보안 서비스 등이 있다. CLR은 언어 중립적이므로 여러 언어(C#, F#, Visual Basic, .NET, Managed C++ 등)로 응용 프로그램을 개발하는 것이 가능하다.

Continue reading

C++로 쉽게 풀어쓴 자료구조/ 탐색

탐색이란?

컴퓨터 프로그램에서 탐색은 하나 이상의 필드(field)로 구성되는 레코드(record)의 집합에서 원하는 레코드를 찾아내는 작업이다. 보통 이러한 레코드들의 집합을 테이블(table)이라 부른다. 레코드들은 서로 중복되지 않고 고유한 값을 가지는 키를 가지는데, 이것을 탐색키(search key)라 부른다.

맵이란?

맵은 탐색을 위한 자료구조이다. 맵(map) 또는 사전(dictionary)은 자료를 저장하고 키를 이용해 원하는 자료를 빠르게 찾을 수 있도록 하는 자료구조를 말한다. 맵은 키를 가진 레코드(keyed record) 또는 엔트리(entry)라 불리는 키-값 쌍(key, value)을 테이블에 저장한다. 이때 각 키는 유일하고 맵에 저장되는 키와 값은 어떠한 자료형도 가능하다.

키를 가진 레코드의 추상 자료형은 다음과 같다.

  • 객체
    • 키(key)와 값(value)을 가진 요소 (key, value)의 집합
  • 연산
    • create(key, value): 주어진 key와 value를 각각 키와 값으로 갖는 레코드를 생성한다.
    • getKey(): 레코드의 키를 반환한다.
    • getValue(): 레코드의 값을 반환한다.
    • update(value): 레코드의 값을 value로 변경한다.

맵의 추상 자료형은 다음과 같다.

  • 객체
    • 유일한 키를 가진 엔트리(키를 가진 레코드)의 집합
  • 연산
    • create(): 공백 상태의 맵을 생성한다.
    • search(key): 테이블에서 주어진 탐색키 key를 가진 레코드를 찾아 반환한다.
    • insert(entry): 테이블에서 주어진 entry를 삽입한다.
    • delete(key): 테이블에서 주어진 탐색키 key를 가진 레코드를 찾아 삭제한다.
    • count(): 테이블의 모든 레코드 수를 반환한다.

맵을 구현하는 가장 간단한 방법은 배열일 것이다. 그러나 맵의 탐색 성능을 향상하고자 한다면 이진 탐색 트리와 같은 보다 효율적인 자료구조를 사용해야 한다.

Continue reading

C++로 쉽게 풀어쓴 자료구조/ 정렬

정렬이란?

정렬(sorting)은 물건을 크기순으로 오름차순(ascending order)이나 내림차순(descending order)으로 나열하는 것을 말한다.

일반적으로 정렬시켜야 될 대상은 레코드(record)라고 불린다. 레코드는 다시 필드(field)라고 하는 보다 작은 단위로 나누어진다. 예컨대 학생들의 레코드에는 이름, 학번, 주소, 전화번호 등이 필드가 될 것이다. 여러 필드 중에서 특별히 레코드와 레코드를 식별해주는 역할을 하는 필드를 키(key)라고 한다. 학생들의 레코드의 경우에는 학번이 키가 될 수 있다.

정렬 알고리즘의 분류

정렬 알고리즘은 다음의 2가지 그룹으로 나눌 수 있다.

  • 단순하지만 비효율적인 방법 – 삽입 정렬, 선택 정렬, 버블 정렬 등
  • 복잡하지만 효율적인 방법 – 퀵 정렬, 힙 정렬, 합병 정렬, 기수 정렬 등

정렬 알고리즘을 내부 정렬(internal sorting)과 외부 정렬(external sorting)으로 구분할 수도 있다. 내부 정렬은 정렬하기 전에 모든 데이터가 메인 메모리에 올라와 있는 정렬을 의미한다. 반면 외부 정렬은 외부 기억장치에 대부분의 데이터가 있고 일부만 메모리에 올려놓은 상태에서 정렬하는 방법이다. 여기서는 내부 정렬만을 다루기로 한다.

Continue reading