디자인 패턴 UML 모음(Headfirst 디자인 패턴 책 발췌)

|

어댑터(Adapter) 패턴

image


옵저버(Observer) 패턴

image

image


스트래티지(Strategy) 패턴

image

image


스테이트(State) 패턴

image


템플릿 메소드(Template Method) 패턴

image


데코레이터(Decorator) 패턴

데코레이터 패턴을 써야 하는 이유입니다.

image

image

image


커맨드(Command) 패턴

image


컴포지트(Composite) 패턴

image


팩토리(Factory) 패턴

image

image


추상 팩토리 메소드(Abstract Factory Method) 패턴

image


퍼샤드(Facade) 패턴

image


이터레이터(Iterator) 패턴

image

프록시(Proxy) 패턴

image

디자인 패턴 특성별 분류

|

디자인 패턴을 Creational/Structural/Behavioral 특성으로 분류하면 다음과 같습니다.


image


Organizing Design Patterns by Purpose

Creation Patterns

  • Deal with initializing and configuring classes and objects
Structural Patterns
  • Deal with decoupling interface and implementation of classes and objects

Behavioral Patterns

  • Deal with dynamic interactions among societies of classes and objects


Organizing Design Patterns by Scope

Class Patterns

  • Deal with relatinships between classes and their subclasses
  • Relationships established through inheritance, so they are fixed at compile time(static)
  • inheritance : white-box reuse

Object Patterns

  • Deal with object relatinships
  • Relationships can be changed at runtime(dynamic)
  • Composition : Black-box reuse, to avoid reaking encapsulation, and implementation dependency

머신 러닝(Machine Learning) 알고리즘들

|

Machine Learning 알고리즘들에 대해서 알아보도록 하겠습니다.

여기서는 몇 가지 대표적인 알고리즘들의 간단한 소개만 포스팅하도록 하겠습니다. 좀 더 자세한 정보를 원하시는 분들은

와 같은 사이트를 참조하시면 좀 더 다양하고 자세하게 알 수 있습니다.


Linear Regression

Image

선형 회귀라고도 불리는 Linear Regression은 위의 그림과 같이 모든 데이터들이 선형적인 분포 형태를 갖고 있다는 가정으로부터 시작하는 알고리즘입니다. 자주 사용되고, 비교적 간단한 구조로 되어 있어 속도도 빠르지만 데이터들이 선형 분포를 이루는 경우가 그리 많지 않기에 정확도면에서는 떨어질 수 밖에 없는 형태입니다.


Logistic Regression

Image

Logistic Regression는 위에서 언급한 Linear Regression이 가진 문제 때문에 나타난 알고리즘입니다. 모든 데이터가 선형 특성을 가지는게 아니기 때문에 여러 개의 클래스를 가진 Logistic Regression이 등장하게 되었고, 위 이미지는 2개의 클래스를 가진 Logistic Regression 알고리즘 예시입니다.


Trees, forests, and jungles

Image

‘결정 트리’라고 해서 많이 알려진 Decision Tree나, Decision Forest, Decision Jungle이다. 전체 영역을 같은 레이블(label)을 갖는 데이터들의 영역들로 나누어 관리하는 알고리즘입니다.

  • Decision Forests는 많은 양의 메모리를 필요로 합니다.
  • Decision Jungle은 메모리 소모는 줄어들지만, 학습 시간이 오래 걸립니다.


Neural Networks

Image

사람의 두뇌 구조에서 영감을 얻어서 만들어진 학습 기술입니다. 무제한적인 다양성을 갖게 해주지만, 상당히 복잡하고 필요로 하는 Cost 또한 높은 단점이 있습니다. 학습 시간도 오래 걸리며, 다른 알고리즘들에 비해 필요로 하는 파라메터(parameter)도 많아서 사용하기 어려운 점이 있지만, 잠재력은 무궁무진하다고 볼 수 있습니다.


Support Vector Machine

Image

각 데이터를 구분하는 경계를 찾는 방식입니다. 경계는 위의 그림과 같이 선형으로 구할 수도 있고, 비선형으로 구할 수도 있습니다.


K-means Algorithm

Image

주어진 데이터들을 K 개의 클러스터(Cluster)로 나누는 알고리즘입니다. 데이터들의 거리를 기반으로 가까운 데이터들끼리 군집(Group)화 하면서 클러스터를 나눕니다. 간단히 사용하기에 괜찮은 알고리즘이긴 하지만 다음과 같은 한계점을 있습니다.

  • 파라메터 K 값에 따라 그 결과가 완전히 달라집니다.
  • 이상값(outlier)에 따라 중심값이 크게 왜곡될 수 있습니다.
  • 구형(spherical) 데이터가 아닌 경우 적절하지 않은 상황이 발생할 수 있습니다.

머신 러닝(Machine Learning)

|
'머신 러닝(Machine Learning)'은 사람이 컴퓨터에게 직접 명령을 내리는 것이 아니라 컴퓨터가 스스로 다수의 데이터를 이용하여 학습을 하고, 자동으로 문제를 풀어나가는 기술을 말합니다.

Machine Learning는 구글의 알파고 로 인해서 갑자기 더 유명해졌습니다.

Machine Learning에 대해서 구체적인 예를 들어보도록 하겠습니다.

메일에서 스팸(Spam) 메일을 구분하는 방법입니다.

  • 제일 쉬운 방법은 블랙 리스트를 관리하는 방법입니다.
  • 하지만 메일을 보낸 사람의 이름을 바꿔버리면 ?
  • 그 다음으로 쉬운 방법은 제목에서 특정 단어들을 찾는 방법입니다.
  • 하지만 메일 제목을 ‘광.고*‘와 같은 식으로 바꿔버리면 ?

이제부터는 단순히 룰(Rule)기반 알고리즘만으로는 스팸 메일을 구분하기 힘들어집니다. 하지만, Machine Learning을 적용해서 좀 더 효율적으로 처리할 수 있습니다.

먼저 컴퓨터에게 정상 메일과 스팸 메일들을 잔뜩 주고나서, 학습을 하도록 합니다. 그러면 컴퓨터가 스스로 메일들을 분류하고 학습해가며 스팸 메일을 찾아낼 수 있게 됩니다.
(물론 100% 정답을 찾아내는 것은 어렵습니다. 대신 데이터가 많으면 많을 수록, 학습을 많이 하면 할 수록 정답에 가까운 확률로 스팸 메일을 찾아낼 수 있게 될 것입니다.)

위의 예제와 같이 Machine Learning은 Rule 기반의 동작과는 거리가 좀 있습니다.

보통 Machine Learning과 데이터 마이닝(Data Mining)이 같은 개념으로 사용되기도 하는데, 사실은 조금 다른 특징이 있습니다.

  • Machine Learning는 대규모의 Training Data를 기반으로 학습을 하여 예측에 중점을 두고 있습니다.
  • Data Mining는 이름 그대로 Data를 발굴하는 것입니다. 미처 몰랐던 정보를 찾아내는 것에 중점을 두고 있습니다.

Machine Learning은 다양한 알고리즘들이 쓰이며, 최고의 알고리즘은 없습니다. 다만, 용도에 따라 더 효율적인 알고리즘은 존재할 수 있습니다.

Machine Learning를 간단한게 분류지어보면 다음과 같습니다.


Taxonomy of Machine Learning

Image

다음 번에는 Machine Learning에 대한 대표적인 알고리즘들에 대해서 간단히 포스팅 하도록 하겠습니다.

Shared Preference 사용하기

|

보통 데이터를 저장할 때는 데이터베이스를 이용하는 경우가 많은데, 간단한 데이터만 저장하기 위해서 데이터베이스를 사용하는 것은 불필요한 작업일 경우가 많습니다. 이런 경우는 Shared Preference를 이용하면 간단하게 구현할 수 있습니다.

Shared Preference는 key-value 방식으로 데이터를 저장합니다. 그래서 원하는 데이터들을 쉽게 저장하고 불러올 수 있습니다.

다음은 Shared Preference를 사용하는 예제 코드입니다.


SnowPreferenceManager.java

package com.lnc.cuppadata.gui.renewal.main;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;


public class SnowPreferenceManager {

  public static final int VIEWMODE_DAY = 0;
  public static final int VIEWMODE_WEEK = 1;
  public static final int VIEWMODE_MONTH = 2;

  private static final String PREFERENCE_VIEW_MODE = "pref_view_mode";
  private static final String PREFERENCE_USER_ID = "pref_user_id";

  public static void setViewMode(Context context, int viewMode) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putInt(PREFERENCE_VIEW_MODE, viewMode);
    editor.commit();
  }

  public static int getViewMode(Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    return prefs.getInt(PREFERENCE_VIEW_MODE, VIEWMODE_DAY);
  }

  public static void setUserId(Context context, String userId) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(PREFERENCE_USER_ID, userId);
    editor.commit();
  }

  public static String getUserId(Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    return prefs.getString(PREFERENCE_USER_ID, "");
  }
}