기본적인 개념이지만 자꾸 해깔리기에 이곳에 정리해 둔다.

precision 과 recall 은 정확도를 측정하는데 자주 사용되는 2가지 기본 지표이다.

precision = 찾은 문서 중 연관된 문서 개수 / 찾은 문서 총 개수
recall = 찾은 문서 중 연관된 문서 개수 / 연관된 문서 총 개수

presicion -> 예측 -> 찾은것 중에 얼마나 관련된걸 찾았냐?
recall -> 기억 -> 실제 연관된 것 중에 얼마나 기억하는가? ( 두번째 것은 좀 억지인가? ㅎ ) 재현율 (Po깜소wer)
  1. Favicon of http://blog.ggamsso.wo.tc BlogIcon 깜쏘 2010.11.30 14:28 신고

    precision이야 정확도라는 의미가 확실해서 외우기 쉬운 단어죠.
    하지만 recall 인 경우 한글로 바꿔 쓰면 재현률로 보통 쓰는데, "재현", 즉 "얼마나 많은 정답들을 안 틀리고 재현했느냐"라고 저는 머리속에 넣어 놨어요^^;;
    여기 말로 바꿔 쓰면, A란 연관된 문서 셋을 얼마나 가깝게 재현했는가 정도?

  2. 2013.08.26 22:34

    비밀댓글입니다

    • Favicon of http://finsternis.tistory.com BlogIcon leanu 2013.09.26 15:10 신고

      대상이 되는 모델의 성능 측정 기준중의 하나입니다. 이 수치를 이용하여 어떤게 더 나은지를 판단하게 됩니다. f1 score 를 참조해보시기 바랍니다.

      http://en.wikipedia.org/wiki/F1_score

True / False 만으로 결론을 내야 하는 문제에서

답이 No 인데 Yes 로 잘못 대답한 경우 false positive이고
답이 Yes 인데 No 로 잘못 대답한 경우 false negative이다.

근데 이것이 도대체 어디에 쓰일까?

2분법을 결과로 사용하는 특정 모듈에서는,
틀린걸 맞았다고 했을때와 맞은걸 틀렸다고 했을 때의 오류 가중치가 다를 수 있다.
이런 경우 성능 지표로 (맞은 횟수 / 총횟수)로 정하면 가중치가 성능평가에서 무시되므로
좀 더 정확한 성능지표를 도출하기 위해 사용되기도 한다. 
아래의 성능지표 예제는 맞은걸 틀렸다고 했을 때가 좀 더 심각한 오류라고 보고
반영한 가중치이다.

성능 지표 예 = ( 총횟수 - ( F.P. * 0.2 + F.N. * 0.8 ) ) / 총 횟수


This course introduces core statistical machine learning algorithms in a (relatively) non-mathmatical way, emphasizing applied problem-solving. The prerequisites are light; some prior exposure to basic probability and to linear algebra will suffice.

  • Jan 22: Tutorial [Ariel Kleiner]
  • Jan 29: Classification [Simon Lacoste-Julien]
  • Feb 5: Regression [Romain Thibaux]
  • Feb 12: Clustering [Sriram Sankararaman]
  • Feb 19: Dimensionality reduction [Percy Liang]
  • Feb 26: Feature selection [Alex Bouchard]
  • Mar 4: Cross-validation, bootstrap, ROC plots [Gad Kimmel]
  • Mar 11: Hidden Markov models, graphical models [Erik Sudderth]
  • Mar 18: Visualization and nonlinear dimensionality reduction [Fei Sha]
  • Apr 1: Collaborative filtering [Alex Simma]
  • Apr 8: Reinforcement learning [Peter Bodik]
  • Apr 15: Time series, sequential hypothesis testing, anomaly detection [Charles Sutton]
  • Apr 22: Nonparametric Bayesian methods (Dirichlet processes) [Kurt Miller]
  • Apr 29: Active learning, experimental design [Alex Shyr]
  • May 6: Multi-class classification, structured classification [Guillaume Obozinski]
    • 큰 헤드라인에 오는 글자 줄은 가지런히 맞추어 쓴다. 표제어는 가장 왼쪽에 쓰고, 그 밑에 소단원이나 내용들은 3~4칸 띄우고 쓴다.
    • 필기할 필요가 없으면 카피한다. 무작정 필기하지 말고 별로 중요하지 않은 것은 카피하여 정리한다.
    • 대담하게 여백은 남긴다. 여백은 복습때 부족한 부분을 채워 쓸 수 있다.
    • 인덱스를 사용한다. 오른쪽이나 윗쪽에 타이틀은 붙인다. 첫페이지에 목차를 써두면 좋다.
    • 단락의 구분을 확실히 한다.
    • 자신만의 노트 서식을 가진다. 사용하기 편한 형식을 가지도록 하자.
    • 깔끔하게 쓴다. 글씨의 굵기는 일정하게 글씨체도 동일하게 쓴다.

    요즘들어 부쩍이나 필기를 잘 안하게 되는데, 슬슬 개발노트도 컴퓨터가 아닌 수기로 해볼까나 ... ㅋ

    여백을 남기라고 하는데에 가장 많이 관심이 간다. 글을 쓰다보면 생각만큼 여백을 남기지 않는 습성이 있는데, 낭비라고 생각하는걸까? 그래서인지 다음에 볼때는 빡빡해서 보기가 싫어지더라. 여백을 남기자...

    출처 : 펀샵 동경대 합격생 노트
    프로그래밍은 한동안 일쪽에만 신경쓰다가
    블로그를 통해 좋은 논문자료를 하나 얻게 되었다.

    고감자님이 블로그에서 언급한 논문인데
    개념적으로만 생각했던 Map Reduce 기법을 
    조금 더 구체화 시킬 수 있는 논문이 되지 않을까 싶다.

    1. Favicon of http://blog.ggamsso.wo.tc BlogIcon 깜쏘 2009.05.22 08:11 신고

      전 기계 학습과 같은 리소스가 많이 필요한 분야에서 사용할려고 공부하고 싶었는데...
      이런 것도 세미나 주제로 선정되면 재미있겠어요^^
      PlatformDay 2009에 참석할 수 있을까 했는데, 신입교육과 겹쳐버려서 ㅠ.ㅠ
      http://www.platformday.com/2009/

      • Favicon of http://finsternis.tistory.com BlogIcon leanu 2009.05.22 14:52 신고

        신입교육이 이번부터 캠핑 분위기로 가는군요 ㅋㅋ

        잘 다녀오세요~!


    프로그래밍 뿐만 아니라 인생의 진리인 즉슨,

    범용적인 것은 특정 부분에서 약하기 마련이라는 것.

    해쉬와 관련해서 속도관련 고민해보다가

    문득 실험정신이 든다. 주말에 한번 종류별 테스트를 해볼까나...

    위키에 Hash 에 대한 설명이 잘 나와있다. 

    요기는 속도에 관해 비교해 놓은 것인데 참고가 될 만 하다.

    consensus : 일치, 합의
    occupy : 차지하다.

    분산 네트워크를 설계할때의 design pattern에 대한 언급이 담겨져 있다. 촘 유용하군!!

    요약하자면, 전체 시스템적 차원에서의 관리와 내부 노드간의 효율성을 동시에 고려한 디자인이 나와야 한다는 말. 

    굳이 구조를 따라할 필요는 없지만 왜 저런식의 패턴이 나오게 되었는지를 이해하는데 도움이 되는 듯 하다

    관련 문서는 background reading에 있다. (아래에도 있다. pdf)

    관련 Site : http://www.zeromq.org/




    String Matching 관련 좋은 책이 나와서 한번 소개해본다. 

    본문에서는 단순한 문자열 비교부터 시작해서, 

    어떤 문제점이 생겼고, 

    그것을 어떻게 해결해 나가는지에 대한 설명들을 순차적으로 잘 설명하고 있다.

    프로그램의 속도를 향상시키기 위해 갖은 노력을 많이 하는데,

    이 책으로 한가닥 아이디어를 얻길 바란다.



    1. Tarun 2009.03.16 03:46 신고

      Thank you!!!



    저자의 생각이 반영된 글이므로

    틀린 내용이나 다른 접근을 말씀해주시면
    적극 검토해 보겠습니다.



    What is Exception and why is Exception-safety guarantee needed?

    --------------------------------------------------------------------------------------------

      Exception이란 프로그래머가 디자인한 흐름대로 실행이 되지 않아 더이상 정상적인 진행이 불가능한 경우를 말한다. 예를들어 성적을 저장할 장소를 마련하기 위해 메모리를 할당해야 하는데 공간이 충분하지 않아 할당을 못한경우 그대로 성적을 저장할 수 없으므로 할당이 안된 경우도 하나의 Exception이다. 간단히 에러라고 생각해도 무방할듯 하다.

      Exception을 두는 이유가 무엇일까? 그 이유는 곰곰히 생각해보면 의외로 간단하다. 이해를 돕기 위해 윈도우를 잘 사용하다가 시스템 영역의 무언가를 잘못 건들여서 부팅이 안된다고 가정해보자(부팅오류Exception이 발생했다고 생각해보자). 억지로 윈도우를 돌아가게 만들어도 그것이 앞으로도 동작할지는 아무도 보장을 못할 뿐더러(불안한 PC에서 중요한 작업을 하고 싶은가?) 이런 경우에는 계속 진행하게 하고 싶어도 방법이 없다. 이경우 건들기 전의 상태로 돌아가게 하거나, 완전히 지우고 윈도우를 재설치 하는 방법을 생각해 볼 수 있는데 바로 이것이 우리가 Exception을 사용하는 궁극적인 이유이다. 즉 프로그램은 내부에서 Exception이 발생한 경우 Exception이 발생되기 전의 상태로 돌아가 다시 정상적인 프로세스를 진행할 수 있게 하는데 그 의의가 있다.





    What is Exception-safe guarantee?
    --------------------------------------------------------------------------------------------
      따라서 우리가 이 클래스(또는 함수 등등..)는 예외 안전성이 보장되어 있습니다 라고 말하는 것은 만약 이 함수를 쓰다가 Exception이 발생한 경우 그에 따른 대처가 포함되어 있다는 것을 말하고 있는 것이다. 어떤 함수가 예외 안전성을 보장한다고 하면 아래의 두 항목이 보장되어야 한다.
    • 자원 낭비가 없어야 한다 (즉 Memory Leak 이 없어야 한다)
    • Exception이 발생하기 전 상태의 값들을 보장해야 한다.
    두번째 항목에 좀 더 부연 설명을 하자면, 만약 내가 A 라는 변수의 메모리를 해지하고 나서 B의 메모리를 할당하는 순간 Exception이 발생하게 되면, 해제되어 있던 A변수는 메모리가 잡혀있던 이전 상태로 되돌려야 한다는 말이다. 이는 모든 변수에 해당하는것이 아니며, 프로세스를 돌릴때 필요한 것들만 복구가 되면 된다.

      이런 예외 안전성 보장은 크게 3종류로 볼수 있다.
    • Basic Guarantee (기본적인 보장) : 예외발생시 모든것들을 유효한 상태로 유지함을 보장한다. 유효한 상태로만 되돌리므로 프로그램은 그 이후로 진행이 가능하나 단지 임의의 유효한 상태로 바꾸어 둔 것이기 때문에 앞으로 어떻게 될지 예측할 수 없다.(예측하려면 현재의 값들을 읽고 판단하는 루틴을 따로 만들어야 겠다. 하나의 오버헤드가 될 수 있는 것)
    • Strong Guarantee (강력한 보장) : 예외발생시 프로그램 상태를 절대 변경하지 않는다는 것을 보장한다. 즉 예외가 발생하지 않으면 정상동작을 하는 것이고, 예외가 발생하면 호출이 없었던 것처럼 상태로 되돌아감을 의미.
    • Nothrow Guarantee (예외불가 보장) : 예외를 절대 발생시키지 않음을 보장한다. 즉 호출되면 무조건 동작하게 되어있음을 의미한다. 기본자료형(int등..)은 절대 예외를 발생시키지 않는다. 또한 특정 클래스에 맞게 customize한 swap이 이러한 예외불가를 보장한다면, 특정클래스의 exception발생시 이전값으로 되돌리는데 이 함수를 이용할 수 있는 이점이 있다.



    How can we guarantee Exception-safe?
    --------------------------------------------------------------------------------------------
      예외를 보장하려면 어떻게 해야 할까? 질문을 달리 해보자. 만약 Exception이 발생한경우 어떻게 이전 값으로 되돌릴 것인가? Effective C++에서 추천하는 방법중에 하나는 copy-and-swap 이다. 원래 오브젝트의 복사본으로 작업하다가 완료되는 시점에 값을 맞바꾼다는 전략이다.

      예를 들어보자. 만약 test.bmp 파일을 myObject안에 집어넣는 함수를 이용한다고 가정했을때 copy-and-swap을 적용한 경우 어떤 이점이 있는지 살펴보자. 우선 적용 전의 코드를 보자.

    int function1 (MyClass& myObject)
    {
       myObject.image.clear();
       myObject.image = new Image("test.bmp");
    }

    이 경우 new 연산에서 할당공간 부족으로 메모리를 할당하지 못한 경우 이전으로 되돌릴 수 없다. 왜냐하면 이미 clear연산을 통해 내부가 지워졌기 때문이다. 다음의 코드를 보자

    int function1 (MyClass& myObject)
    {
       std::tr1::shared_ptr<MyClass> myObjectCopy(new MyClass);  // Copy
       myObjectCopy->image = new Image("test.bmp");
       swap( myObject, *(myObjectCopy) );                                    // Swap
    }

    아직 exception 발생시 복구하는 루틴은 넣지 않았지만 만약 new에서 Exception이 발생할때 리턴을 한다면 수정 전 상태로 되돌아 갈 수 있다. 독자들 중에는 과연 이 방법이 좋은것인가에 의문을 품는 분들도 계실것이다. 그렇다. swap으로 두 객체를 맞바꾸게 되는부분에서 객체의 데이터 사이즈가 어마어마하게 큰 경우는 swap 자체로 굉장한 overhead가 될 수 있기 때문이다. 이때문에 프로그램의 성격이 중요하다. 느리더라도 안전하게 돌아가야 하는 것은 이와 같은 방법을 고수하여 사용해야 할 것이고, 그다지 안전성을 보장하지 않고 속도가 빨라야 한다는 것은 다른 방법을 쓰거나 Exception-safe를 보장하지 않으면 되는 것이다.



    Conclusion
    --------------------------------------------------------------------------------------------

     이왕이면 강력한 예외 안전성 보장인 예외불가를 보장하는 것이 바람직하나, 현실적으로 힘든 경우가 많이 있다. 앞의 예제에서 보았듯이 강력한 보장조차도 설계시 효율성이나 기타 다른 요인에 의해 할 수 없는 경우가 비일비재하다. 따라서... 프로그램의 성격을 잘 생각하고, 잘 설계하자. by Leanu


    Introduction
    ----------------------------------------------------------------------------------------------
      기존의 swap은 어떤 타입이든(대입 연산자 '=' 를 이용할 수 있다면) 가능한 std 범용 함수이다. 하지만 클래스 내부 멤버 변수가 엄청나게 큰 데이터를 가지고 있다면, 복사에 드는 비용은 실로 어마어마하다고 할 수 있다. 이런경우 두 객체의 멤버 변수 포인트만 바꿔주는, 기존의 동작과는 약간 다른 특화된 swap을 만들 필요가 있다. 지금부터 설명하고자 하는 특화된 swap에 대한 방법은 Effective c++에서 소개한 방법을 인용하기로 한다.

    Before implementing specialized swap function
    ----------------------------------------------------------------------------------------------

        1. 표준 제공 swap함수의 성능이 내가 만든 클래스에서 만족할 만한 성능을 지니면
           그냥 쓴다.

        2. 그렇지 않은 경우 클래스 내부에 swap 멤버 함수를 퍼블릭으로 선언하라. 그리고
           그 안에는 빠른 swap 알고리즘을 기술한다.

           (예) MyClass {
                public:
                    ...
                    swap(MyClass target) { // Write Fast swap algo }
                private:
                    ...
               };

        3. 내가 구현한 클래스를 둘러싸고 있는 네임스페이스 안에 swap 함수를 많들어 넣고
           이 함수 안에서 MyClass에서 만든 swap 멤버 함수를 호출하도록 만든다.

            namespace MyNamespace
            {
                 ...
                 MyClass {
                     ...
                 };
                 ...
                 void swap(MyClass& a, MyClass& b)
                 {
                      a.swap(b);
                 }
            } // end - MyNamespace
          
      < Suggestion > swap은 절대로 예외를 발생시키자 않도록 만들어라. swap은 예외 발생시 이전상태로 돌릴수 있게 응용할 수 있는 강력한 함수이기 때문에(strong- exception-safety guarantee) 예외를 던지지 않게 설계한다면 유용하게 이용할 수 있을 것이다.

    잼나네 ㅎㅎ








    동영상을 더 보고 싶다면...
    클릭
    UML

    http://cafe.naver.com/smartnet.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=124



    http://www.ibm.com/developerworks/kr/library/sep04/bell/index.html

    회사에서 매 분기마다 연구원들을 대상으로 프로그래밍 테스트를 본다.

    처음 치르는 만큼 긴장도 많이 했고,

    연봉과도 직결되는 것이 신경이 쓰이는지

    푸는 내내 신중에 신중을 거듭했다. (오히려 집중이 방해되었었나? ;;)

    시간은 9:30 ~ 7:30 까지 총 3문제를 푸는데 2개는 논문을 보고 C++ 로 구현하는 것이며

    나머지 한개는 ACM 비스무리한 문제를 JAVA로 푸는 것이었다.

    JAVA로 프로그램을 짜본적이 없어서

    한 2시간 정도를 문법에서 애먹었던거 같다.

    역시나 설계에 신경을 쏟게 되면 그만큼 완성하는데까지 걸리는 시간은 짧은것 같다.

    결과는 월요일에 나왔다.

    괴물같은 사람들의 존재감을 느낄 수 있었다. ㅎ

    본인은???? 낙제를 안한 정도? ㅎ

    위안으로 삼는 것은 (아이러니하게도)

    JAVA로 푸는 문제에 대한 속도가 제일 빨랐다.

    덕분에 다음주 목요일날 솔루션에 대한 발표를 해야한다. ㅎ

    관심있는 사람들은 한번쯤 풀어보기 바란다. (물론 uva 나 programming challenge 에

    더 좋은 문제들이 많겠지만...)

    참고로 문제와 더불어 테스트 데이터도 첨부한다.

    1. noaster 2008.04.19 20:10 신고

      오 시험을 보다니.. 머찐데

    2. Favicon of http://finsternis.tistory.com BlogIcon leanu 2008.04.21 08:56 신고

      음.. 그런가? ㅡ.ㅡ; 컨테스트였다면 더 좋았을텐데 ㅎ

    3. Favicon of http://usemagic.net/blog BlogIcon RYaN_MU 2008.04.21 18:49 신고

      으헐 회사에서도 이짓을 하고 있다니 ㅋㅋ

    4. Favicon of http://finsternis.tistory.com BlogIcon leanu 2008.04.21 23:10 신고

      ㅋ 너도 와

    단팥 캐스트~!

    http://kbs.danpod.com/
    1. noaster 2008.03.12 19:31 신고

      난 출근 준비할때 듣는다오 -ㅛ-
      다 못 듣고 출근 ㅠㅠ

    2. Favicon of http://finsternis.tistory.com BlogIcon leanu 2008.03.12 19:43 신고

      너도 30분에 나가지? ㅎ

      홧팅이다 ㅋ

    ACM 준비하면서 정리했던 자료들..

    ACM 준비하면서 정리했던 자료들..

    1. 2012.11.11 17:29

      비밀댓글입니다

    2. Kevin 2014.03.31 15:57 신고

      좋은 툴 잘 쓰겠습니다.. 복많이 받으세요

    그래프 그릴때 용이하겠지요?
    1. 2008.03.13 21:43

      비밀댓글입니다

    2. 진상혁 2009.08.22 02:44 신고

      감사합니다!!

    3. 공대 2012.10.19 17:18 신고

      정말 감사합니다
      전개도 그릴떄 유용하네요

    4. 2013.06.11 22:38

      비밀댓글입니다

    5. 나는 나 2013.09.01 18:08 신고

      정말 감사합니다.

    6. 나는 나 2013.09.01 18:08 신고

      정말 감사합니다.

    7. 이진경 2014.03.05 14:27 신고

      감사합니다.잘 쓰겠습니다.

    + Recent posts