1만 시간 법칙

어느 분야에서든 세계수준의 전문가, 마스터가 되려면 1만 시간의 연습이 필요하다.
작곡가, 야구선수, 소설과, 스케이트 선수, 피아니스트, 체스선수, 숙달된 범죄자,
그밖의 어떤 분야에서든 연구를 거듭하면 할수록 이 수치를 확인할 수 있다.
1만 시간은 대략 하루 세시간, 일주일에 스무시간씩 10년간 연습한 것과 같다.

어느 분야에서든 이보다 적은 시간을 연습해
세계 수준의 전문가가 탄생한 경우를 발견하지는 못했다.
                                                                       - 아웃라이어 중에서 -

Collective Intelligence - Making Recommendations

Chapter 2 : Making Recommendations

다른사람들이 좋아하는 취향을 분석해서 내 취향에 맞게 자동적으로
추천되는 시스템을 만들것입니다. 물론 Python을 이용해서 만들겠습니다.

추천사이트라는 것은 쉽게 도서 구매 사이트에 가서 책을 검색해보면 이책을 구매한 사람이
구매한 다른 책들 목록이 나오는 것과 비슷한 기능을 합니다. 
즉 내가 사려는 책의 취향에 맞게 다른 책들을 추천하는 것입니다.

여기서는 Collaborative Filtering 기법을 사용할 것입니다.
Collaborative Filtering 기법은 협력적 필터링 이라고도 합니다.
이제 사용하려는 것과 같은 고객의 관심을 분석한후 비슷한 취향의 사람들에게 상품을 추천하도록 할때
주로 사용됩니다.

이것을 하기 위해서는 기존의 고객들이 어느정도 예측가능한 고객들과 비슷한 패턴을 가진 고객에게만
추천할 수 있을것이며, 추천을 위해서는 기존의 고객들에 대한 정보를 수치화 할 필요가 있습니다.

그렇다면 왜 Collaborative 즉 협력적 방법을 사용하는 것일까요?
다른 많은 방법이 있겠지만, 제 생각에는 한사람만의 고객을 분석해서 다른 사람에게 그 자료를 바탕으로
추천하는 것보다는 여러사람, 가급적이면 많은 사람들의 취향을 분석해서 새로운 사람에게 추천하는것이
조금이라도 더 정확하기때문이라고 생각합니다. 

그럼 이제 추천을 할 수 있는 시스템을 만들어봐야겠습니다.

우선 위에서도 설명했듯이 새로운 고객에게 기존의 고객정보를 기반으로 취향에 맞게 추천을 하기 위해서는
기존 정보에 대한 데이터와 그것을 데이터화하는 기준이 필요할 것입니다.
기존정보에 대한 데이터는 Python의 Dictionary 구조로 만들겠습니다.
그리고 데이터화하는 기준, 즉 기존의 사람들이 나와 얼마나 비슷한지에 대한 것을 측정하는 기준으로는
두가지의 방법을 설명하겠습니다.

일단, 파이썬으로 만드는 사전(Dictionary)식 구조를 말하자면
critics={'Word':'mean','word2':'mean2'} 
형식으로 되어있습니다. critics라는 변수에 저장을 하는데 그 구조는 사전과 비슷하게
word - mean 
word2 - mean2 
라고 입력하는것과 같습니다. 구분은 : (콜론)으로 합니다.

실행화면을 보는것과 같이 사전처럼 word를 물으면 그뜻인 mean을 출력해줍니다.

그럼 이제 데이터를 저장해보면

critics={'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5,
 'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5, 
 'The Night Listener': 3.0},
'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5, 
 'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0, 
 'You, Me and Dupree': 3.5}, 
'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0,
 'Superman Returns': 3.5, 'The Night Listener': 4.0},
'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0,
 'The Night Listener': 4.5, 'Superman Returns': 4.0, 
 'You, Me and Dupree': 2.5},
'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 
 'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0,
 'You, Me and Dupree': 2.0}, 
'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
 'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5},
'Toby': {'Snakes on a Plane':4.5,'You, Me and Dupree':1.0,'Superman Returns':4.0}}

이렇게 입력합니다. 사전 구조가 중복 되어서도 똑같이 적용됨을 알수있을것입니다.
그럼 파이썬에서 입력한후 값을 확인해보겠습니다.

그림에서 보는것과 같이 Toby에 대한 정보를 얻기위해서  
  >>> critics['Toby'] 라고 입력을 했더니 Toby에 대한 정보가 제대로 들어가있음을 볼수있습니다.

그럼 이제 데이터를 얻었으니 사람들 사이에 얼마나 비슷한 관계가 있는지를 찾아보겠습니다.
그것을 찾기위해서는 앞서 말했듯이 사람들 사이의 관계를 측정해야 하는데 우리는 두가지 방법을 사용합니다.

Euclidean Distance 방법
Pearsion Correlation 방법 입니다.

유클리드 방법을 말하자면
사람들이 측정한 영화에 대한 평면을 만든후 사람들이 그것에 대하여 측정한 점을 찍고 그 점들간의 거리를
두점간의 거리 구하는 공식과 비슷하게 측정하는 것입니다.

그림처럼 Snakes와 Dupre라는 영화에 대하여 사람들이 준 점수에 따라 점을 찍습니다.

두점사이 거리 구하는 공식이라고 하면 다들 잘 알고있을 것입니다.
P=(p1,p2)와 Q=(q1,q2) 라고 주어졌다면.
  sqrt(pow(p1-q1,2)+pow(p2-q2,2))  (sqrt는 루트를, pow는 제곱을 나타냅니다.)
이렇게 해서 구한 거래의 값이 클수록 비슷하다고 생각하겠지만 한계가 없다면
그것을 측정하기가 조금 힘이 들것입니다. 따라서 우리는 이 공식을 약간 변형을 해서
구해진 값의 범위를 0 부터 1까지로 오도록 합니다.
즉 아까구한값을 Ed 라고 한다면 1/(1+ed)를 하면 될것입니다. 1+ed를 하는 이유는 분모가 0이면 무한대로
원하지 않는 값이 나오니까 가장작은 ed값이 0이 나올때에도 구해지는 값은 1이 되도록 하기 위해서입니다.


파이썬으로 실행한 결과입니다. 변형전에는 3.1이라는 값이 나와서 이값이 큰값인지 작은 값인지를
정확히 알수 없었지만 변형된 공식으로 사용하니 0.24가 나와서 0에 가까운 값이라는 것을 쉽게 알수 있습니다.

그럼 이제 유클리드 거리를 측정하는 파이썬 함수를 구현하면

def sim_distance(prefs,person1,person2):
    si={}
    for item in prefs[person1]:
          if item in prefs[person2]:
               si[item]=1
    if len(si)==0: return 0
    sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
                          for item in prefs[person1] if item in prefs[person2]])
    return 1/(1+sum_of_squares)

        
코드에는 앞서 설명한 것들이 그대로 반영되어 있습니다.
파이썬에서는 다른 언와 달리  { } 함수 영역을 구분하지 않고 들여쓰기를 하기때문에 들여쓰기가 중요합니다.

위의 그림을 보면 알 수있듯이 들여쓰기는 굉장히 중요하다.
또한 값이 0.143으로 나온것으로 보니 그렇게 비슷한 취향을 아닌가 보다.
(측정하는 값은 Lisa와 Gene가 공통으로 점수를 매긴 영화들만 해당된다.)

그럼 이것으로 유클리드 측정법을 사용한 거리 측정은 마치겠습니다.
피어슨(Pearson) 방법으로의 측정은 다음에..

'프로그래밍' 카테고리의 다른 글

WinDbg 출력 결과를 파일로 보내자  (0) 2010.01.07
IME를 강제로 활성, 비활성 시키기  (0) 2009.12.24
C# - Property  (0) 2009.12.24
Python - Beautiful Soup  (2) 2009.12.24
SCJP 5.0 관련 자료 모음  (0) 2009.12.24

C# - Property

C#에는 프로퍼티라는 개념이 새로 생겼습니다.

C++에서는 private나 protected 상태인 멤버에 대한 접근을 위해서 Get/Set으로 시작하는 함수를 만들어
줬습니다.

class Test
{
public:
std::string GetName()
{
return _name;
}
void SetName( std::string name )
{
_name = name;
}
private:
std::string _name;
}
이렇게 메소드를 만들어 줘야지만 데이터에 접근해서 값을 저장하거나 값을 가져올 수 있습니다. 
c#도 똑같은 방법을 사용해서 멤버에 접근할 수 있습니다.
하지만, 좀더 진보된 언어 답계 컴파일러가 이런 일을 대신할 수 있습니다.
c#에서 지원하는 프로퍼티(Property)라는 멤버를 사용하면 컴파일러가 Get/Set 메서드의 쌍을 만들어 줍니다.
지정자 타입 이름
{
get { return 값; }
set { 값 변경; }
}
get 블록에서는 프로퍼티의 값을 읽어서 리턴하고, 
set 블록에서는 값을 변경하는 코드를 작성하면 됩니다. 

컴파일러는 프로퍼티 참조문에 대해 get,set 블록을 자동으로 호출하는데 프로퍼티를 읽으면 get 접근자를 호출하고, 프로퍼티에 값을 대입하면 set 접근자를 호출니다. 
프로퍼티에 대입되는 값은 value라는 암시적 인수로 set 접근자에게 전달됩니다.

class Test
{
public string Name
{
get { return _name; }
set { _name = value; }
}
private string _name;
}

class C_Sharp_Test
{
static void Main()
{
Test test = new Test();
test.Name = "Test_Name";
Console.WriteLine( "name = {0} ", test.Name );
}
}
프로퍼티를 이용하면 멤버에 대해 쉽게 접근을 할 수 있습니다. 또한, 간편한 연산을 할 수 있습니다.

int 형 변수의 값을 증가시키기 위해서는 값을 가져(get)와서 1을 증가 시킨후 값을 저장(set)해야 하는데,
프로퍼티를 이용하면 좀더 간단하게 계산을 할 수 있습니다. 
즉, 프로퍼티에 그냥 1을 증가 시켜서 저장하면 됩니다.
Time.Val = Time.Val + 1; 
이런 식으로 사용이 가능합니다.

'프로그래밍' 카테고리의 다른 글

IME를 강제로 활성, 비활성 시키기  (0) 2009.12.24
Collective Intelligence - Making Recommendations  (0) 2009.12.24
Python - Beautiful Soup  (2) 2009.12.24
SCJP 5.0 관련 자료 모음  (0) 2009.12.24
Compiler - Introduce  (0) 2009.12.24

Python - Beautiful Soup

BeautifulSoup은 웹페이지를 파싱(Parsing)즉 분석하는데 아주 훌륭한 라이브러리입니다.

BeautifulSoup은 페이지에있는 type 아니 ID 또는 각종 속성들을 가지고 그 내용을 추출해 낼수있습니다.
http://www.crummy.com/software/BeautifulSoup/ 이곳에서 다운을 받을 수 있습니다.

다운로드(Download)버튼을 누르면 밑에 그림나오는 곳으로 이동합니다.
Beautiful Soup version 3.0.6 이라고 되어있는 부분을 왼쪽 클릭하면 BeautifulSoup.py 파일이 열립니다.
그러니깐 왼쪽 클릭하지말고 오른쪽 클릭을 한후에 다른이름으로 저장을 하시면 됩니다.

파일을 저장할때는 다른곳에 하는곳보다는 Python 설치 폴더 밑에 있는  Lib 폴더에 넣어주면
간단하게 import 명령으로 쉽게 사용할 수 있습니다.

간단하게 사용법을 보면

'프로그래밍' 카테고리의 다른 글

Collective Intelligence - Making Recommendations  (0) 2009.12.24
C# - Property  (0) 2009.12.24
SCJP 5.0 관련 자료 모음  (0) 2009.12.24
Compiler - Introduce  (0) 2009.12.24
[C#] 소수구하기  (0) 2009.12.24

SCJP 5.0 관련 자료 모음

SCJP 5.0(310-055)

SCJP 5.0  시험을 보기 위해서 덤프들을 모아  

시험을 보고 나니 역시 페이퍼 자격증이란 이름에  난이도와 출제경향을 보여주더군요.

시험에서는 덤프에 없는 문제가 서너 문제 정도  

덤프의 답이 제대로 정확히 안나온것도 있었지만 공부  하고 덤프만 보아도 넉넉하게 합격합니다.

  • 310-055.exe , iPad_Viewer.pdf
    • 자바를 이용한 모의 테스트 프로그램, testsnow.com 에서 만든것으로  비슷한 환경입니다.
    • 320 문제로 실제 시험과 거의 같았습니다. pdf파일은  프로그램의 문제를 출력용으로 만든것입니다.
    • 테스트 프로그램의 드래그 앤 드랍  답은 절대로 믿지 마시길.
  • Drag_Drop.pdf
    • 드래그 앤 드랍 문제만 따로 추출해놓은 것, 답이 없는것도 있습니다.
  • 310-055.pdf

    •  Actualtest.com의 문제로 거의 모든 문제에 답과 설명이 
  • SCJP5.pdf

    • SUN의 SCJP 5.0 시험대비 설명서  시험 설명 및 출제 범위를 나타내고 있습니다.
  • SCJP5_0덤프(20061216).doc

    • 한글로 만들어진 덤프입니다. 중요설명이 한글로 되어있기때문에 처음에 이걸 보고  수월합니다.
    • 224문제로 이것만 제대로 다 알면 붙습니다.

'프로그래밍' 카테고리의 다른 글

C# - Property  (0) 2009.12.24
Python - Beautiful Soup  (2) 2009.12.24
Compiler - Introduce  (0) 2009.12.24
[C#] 소수구하기  (0) 2009.12.24
코딩도장(CodingDojo)  (0) 2009.12.24