디자인 패턴 UML 모음(Headfirst 디자인 패턴 책 발췌)
21 Sep 2016 | 디자인패턴어댑터(Adapter) 패턴
옵저버(Observer) 패턴
스트래티지(Strategy) 패턴
스테이트(State) 패턴
템플릿 메소드(Template Method) 패턴
데코레이터(Decorator) 패턴
데코레이터 패턴을 써야 하는 이유입니다.
데코레이터 패턴을 써야 하는 이유입니다.
디자인 패턴을 Creational/Structural/Behavioral 특성으로 분류하면 다음과 같습니다.
Machine Learning 알고리즘들에 대해서 알아보도록 하겠습니다.
여기서는 몇 가지 대표적인 알고리즘들의 간단한 소개만 포스팅하도록 하겠습니다. 좀 더 자세한 정보를 원하시는 분들은
와 같은 사이트를 참조하시면 좀 더 다양하고 자세하게 알 수 있습니다.
선형 회귀라고도 불리는 Linear Regression은 위의 그림과 같이 모든 데이터들이 선형적인 분포 형태를 갖고 있다는 가정으로부터 시작하는 알고리즘입니다. 자주 사용되고, 비교적 간단한 구조로 되어 있어 속도도 빠르지만 데이터들이 선형 분포를 이루는 경우가 그리 많지 않기에 정확도면에서는 떨어질 수 밖에 없는 형태입니다.
Logistic Regression는 위에서 언급한 Linear Regression이 가진 문제 때문에 나타난 알고리즘입니다. 모든 데이터가 선형 특성을 가지는게 아니기 때문에 여러 개의 클래스를 가진 Logistic Regression이 등장하게 되었고, 위 이미지는 2개의 클래스를 가진 Logistic Regression 알고리즘 예시입니다.
‘결정 트리’라고 해서 많이 알려진 Decision Tree나, Decision Forest, Decision Jungle이다. 전체 영역을 같은 레이블(label)을 갖는 데이터들의 영역들로 나누어 관리하는 알고리즘입니다.
사람의 두뇌 구조에서 영감을 얻어서 만들어진 학습 기술입니다. 무제한적인 다양성을 갖게 해주지만, 상당히 복잡하고 필요로 하는 Cost 또한 높은 단점이 있습니다. 학습 시간도 오래 걸리며, 다른 알고리즘들에 비해 필요로 하는 파라메터(parameter)도 많아서 사용하기 어려운 점이 있지만, 잠재력은 무궁무진하다고 볼 수 있습니다.
각 데이터를 구분하는 경계를 찾는 방식입니다. 경계는 위의 그림과 같이 선형으로 구할 수도 있고, 비선형으로 구할 수도 있습니다.
주어진 데이터들을 K 개의 클러스터(Cluster)로 나누는 알고리즘입니다. 데이터들의 거리를 기반으로 가까운 데이터들끼리 군집(Group)화 하면서 클러스터를 나눕니다. 간단히 사용하기에 괜찮은 알고리즘이긴 하지만 다음과 같은 한계점을 있습니다.
'머신 러닝(Machine Learning)'은 사람이 컴퓨터에게 직접 명령을 내리는 것이 아니라 컴퓨터가 스스로 다수의 데이터를 이용하여 학습을 하고, 자동으로 문제를 풀어나가는 기술을 말합니다.
Machine Learning는 구글의 알파고 로 인해서 갑자기 더 유명해졌습니다.
Machine Learning에 대해서 구체적인 예를 들어보도록 하겠습니다.
메일에서 스팸(Spam) 메일을 구분하는 방법입니다.
이제부터는 단순히 룰(Rule)기반 알고리즘만으로는 스팸 메일을 구분하기 힘들어집니다. 하지만, Machine Learning을 적용해서 좀 더 효율적으로 처리할 수 있습니다.
먼저 컴퓨터에게 정상 메일과 스팸 메일들을 잔뜩 주고나서, 학습을 하도록 합니다. 그러면 컴퓨터가 스스로 메일들을 분류하고 학습해가며 스팸 메일을 찾아낼 수 있게 됩니다.
(물론 100% 정답을 찾아내는 것은 어렵습니다. 대신 데이터가 많으면 많을 수록, 학습을 많이 하면 할 수록 정답에 가까운 확률로 스팸 메일을 찾아낼 수 있게 될 것입니다.)
위의 예제와 같이 Machine Learning은 Rule 기반의 동작과는 거리가 좀 있습니다.
보통 Machine Learning과 데이터 마이닝(Data Mining)이 같은 개념으로 사용되기도 하는데, 사실은 조금 다른 특징이 있습니다.
Machine Learning은 다양한 알고리즘들이 쓰이며, 최고의 알고리즘은 없습니다. 다만, 용도에 따라 더 효율적인 알고리즘은 존재할 수 있습니다.
Machine Learning를 간단한게 분류지어보면 다음과 같습니다.
다음 번에는 Machine Learning에 대한 대표적인 알고리즘들에 대해서 간단히 포스팅 하도록 하겠습니다.
보통 데이터를 저장할 때는 데이터베이스를 이용하는 경우가 많은데, 간단한 데이터만 저장하기 위해서 데이터베이스를 사용하는 것은 불필요한 작업일 경우가 많습니다. 이런 경우는 Shared Preference를 이용하면 간단하게 구현할 수 있습니다.
Shared Preference는 key-value 방식으로 데이터를 저장합니다. 그래서 원하는 데이터들을 쉽게 저장하고 불러올 수 있습니다.
다음은 Shared Preference를 사용하는 예제 코드입니다.
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, ""); } }