추천 시스템(Recommendation System)

이번 소프트웨어 마에스트로 과정 1차 프로젝트에서 가장 중요한 건 추천 시스템이다. 추천 시스템은 본 과정 뿐만 아니라 수많은 스타트업들의 핵심 컨텐츠로 자리하고 있으며, 미래에는 ‘추천’이라는 개념 자체가 모든 컨텐츠에 있어서 기본으로 깔릴 것으로 예상한다.

대표적으로 ‘세이렌’을 들 수 있겠다. 세이렌은 음악 플레이어에서 ‘다음 곡’ 이 단순히 다음 곡이 아니라 ‘내게 다음 곡을 추천해봐’ 라고 주장한다(물론 셔플일 때 얘기다). 이와 같이 지금은 평범한 ‘다음’에, ‘추천’이 녹아들 수 있는 것이다.

이번 기회에 추천 시스템에 대해 자세히 공부하고 정리하도록 한다.

Recommendation System

추천 시스템에는 크게 두가지 접근이 있다. 아이템의 내용을 분석하여 추천하는 Content-based Approach와 사용자의 평가 내역을 분석하여 추천하는 Collaborative Filtering Approach.

  • Collaborative Filtering
    좋은 성능. 사용자의 행동 패턴에 따라 적절한 추천.
    그러나 수집된 정보의 양이 많아야 좋은 결과가 나온다. 이를 cold start라 한다.
  • Content-based
    적은 정보만으로도 좋은 추천 가능.
    그러나 모델링 방식에 따라 정확도가 많이 달라지고, 비슷한 아이템 끼리만 추천이 가능하여 추천 범위가 제한된다.

Collaborative Filtering

Collaborative Filtering은 아이템을 분석하지 않고 유저의 평가 내역을 이용한다. 이러한 방식의 가장 큰 장점은 복잡한 아이템을 어렵게 분석하지 않아도 된다는 것.

예를 들어 음악 추천 시스템을 위해 음원 분석 알고리즘을 만든다고 해도, 이 음원 분석 엔진의 정확도는 좋아야 60%를 넘기지 못한다. 당연히 영화나 드라마 따위의 동영상 분석은 훨씬 어렵다.

대신, 아이템이나 유저의 유사도(similarity)를 모델링하고 측정하여 추천한다.

굉장히 널리 쓰이는 CF 시스템이지만 단점도 있는데

  1. Cold start
    유저의 평가 내역이 필요하다. 즉 이러한 데이터가 없는 서비스 초기에는 추천이 부정확함.
  2. Scalability
  3. Sparsity (희소성)

데이터마이닝 시간에 배웠던 Association Rule(연관 규칙) 또한 이 CF 분석에 적용할 수 있겠다.

User-based

유저 기반 CF는 유저의 행위를 측정 및 분석하고 이를 기반으로 유저간 유사도를 측정한다. 그러면 유사도가 높은, 즉 유사한 유저끼리 해당 유저의 선호 아이템들을 기반으로 추천이 가능하다.

기본적이고 고전적인 방법이다.

Item-based

그러나 이러한 User-based 방법은 몇가지 문제점이 있다. 먼저 새로운 유저에 대해서는 제대로 된 추천이 불가능하며, 반대로 오랫동안 사용한 유저의 경우 선호도가 분산되기 마련이다. 이러한 문제에 대응하고자 아마존이 사용한 추천 시스템이 바로 이 Item-based CF이다.

아이템 기반 CF는 아이템간의 유사도를 측정하며, 유저가 어떤 아이템을 선호하면 유사한 다른 아이템을 추천할 수 있다.

아마존닷컴의 개인화 추천

Content-based

Content-based는 아이템이나 유저를 분석하여 비슷한 아이템을 추천한다. 아이템과 유저간의 액션을 분석하는 것이 아니라 컨텐츠 자체를 분석하기 때문에 많은 양의 유저의 액션을 요구하지 않는다는 것이 장점. 즉 CF의 문제점인 cold start가 없다.

예를 들어 삼성과 갤럭시에 대한 뉴스를 보았다고 하면, 이 기사를 분석하여 이 기사의 핵심 엔티티가 ‘삼성’과 ‘갤럭시’라는 것을 분석해내고, 이 엔티티를 기반으로 새로운 뉴스를 추천한다.

TF-IDF

Term Frequency - Inverse Document Frequency. Content-based 분석을 위한 대표적인 방법이다.
문서에서 어떤 단어가 얼마나 자주 등장하는가(TF), 그 단어가 다른 문서에서도 자주 등장하는가(IDF). TF-IDF 를 이용하여 문서를 수치화 할 수 있다.

Inverse DF인 것은 다른 문서에서도 자주 등장하는 단어라면 중요도가 떨어지기 때문이다. 영어로 따지면 The, That 같은 단어들은 어디에나 등장하기 마련. 물론 이러한 단어는 stopword로서 따로 처리해 줘야 할 필요도 있다.

RaaS

Recommendation-as-a-Service. Recom.io에서 만든 말인듯?
Recom.io
Prediction.io

둘다 완전 무료. 특히 Prediction.io는 오픈소스다. Recom.io는 한국사람들이 만든 서비스인 듯. 물론 회사는 미국에 있다. 한국에서 이렇게 진보적인 서비스를 하다니! 하고 놀랐는데 역시 미국물 먹은 사람들이 만든 거였다.

참고

Recommendation System : 협업 필터링을 중심으로 : 카이스트 알고리즘 연구실 자료. 좋은 자료이므로 꼭 읽어보길 추천.

추천 시스템(Recommender System)
협응적 추천 시스템(Collaborative Recommender System)
내용 기반 추천 시스템(Content-based Recommender System)
개괄적인 개념 잡기에 좋다. 다 같은 블로그.

MapReduce 기반 대용량 추천 알고리즘 개발 : SK플래닛 기술 블로그. SPADE에서 사용하는 개인화/추천 User-based CF 알고리즘에 대해 살펴보았다. 분산 처리에 대한 설명도 있음.

Collaborative Filtering : 협업 필터링 추천 방식에 대한 정리 : slideshare. CF의 간략한 개념과 유사도(Distance) 측정 알고리즘에 대한 설명.

'DataScience' 카테고리의 다른 글

Bayesian probability  (0) 2015.07.01
머신러닝 알고리즘 선택 Cheat Sheet  (0) 2015.06.07
Semi-supervised, Weakly-supervised  (0) 2015.03.25
Measuring similarity and distance function  (0) 2014.10.16
Distance Metric Learning  (0) 2014.10.16
추천 시스템(Recommendation System)  (0) 2014.08.30

검색엔진 (1) - 검색엔진의 이해

검색엔진의 이해

소프트웨어 마에스트로 오우택 멘토님 수업
디테일한 내용들은 따로 검색하도록 하자.

용어

  • 쿼리 Q(“”)
  • Document : 하나의 (웹)페이지.
  • Collection : 도큐먼트의 집합
  • IR : Information Retrieval, 정보 검색.
  • Terms : 단어
  • Index
  • Log : 수학의 로그. 로그의 특성을 검색엔진에서 활용한다 (노멀라이징)
  • Measure
  • Word Count : 검색엔진에서 가장 많이 하는 작업. 가장 쉬운 문서 계량화 방법.

일반적인 검색 과정

  • Web Spidering : 웹 스파이더를 돌려서 컬랙션을 만든다
  • Indexing : 검색을 위한 인덱싱
  • Searching : 쿼리가 들어오면 쿼리 엔진을 돌려서 결과를 리턴.

Web Spidering

웹 크롤러

크롤링 - 파싱 - 저장
큐 / 스케줄러

크롤러의 고민들

  • 최신성 유지, Deadlink 검출
  • 복잡한 html 문서에서 컨텐츠 찾기 : 휴리스틱 + 머신 러닝
    • 해당 사이트에서 보일러플레이트1가 아닌 계속 바뀌는 부분을 학습 -> 컨텐츠!
      컨텐츠 내에서 타이틀/본문 등의 구분은 길이로 한다.
      방법중 하나!
  • 우선순위 정하기
  • 트래픽 관리 - 중복 URL 피하기. 네트워크 이용이 곧 돈이므로 줄여야 한다!
  • Robots.txt2 규약 지키기
  • 효율적 분산 저장
  • 문서 형식 변환 : 크롤링 하는 웹 문서들의 형식이 다양하다. pdf, 워드, 한글 등등…

Text Extraction

  • 문서 구조 분석
  • 문장 부호 및 공백 등 불필요한 문자 제거
  • 문장 및 형태소 분석 : 문장의 조사, 품사 등을 분석한다. 컬랙션에 따라 형태소 분석도 조금씩 달라짐.
  • stopword 제거 : stopword란 전치사, 관사, 조사 등 주제색인어로서 의미가 없는 단어들이다. 즉 검색할 때 무시함.
  • stemming : 어간3 추출
    • 보다, 보니 보고 -> 보-
    • 먹다 먹니 먹고 -> 먹-
    • stemmer, stemming, stemmed -> stem
    • fishing, fished, fisher -> fish
    • argue, argued, arguing, argus -> argu(단어의 원형과 일치하지 않는 경우)
  • 동의어 처리 : 오토 + 수작업. 사전 구축을 해야한다. 램프, 렘프, lamp 뭐 이런것들.
  • 색인 생성

Indexing

Inverted Index

TF-IDF. 텀 프리퀀시와 도큐먼트 프리퀀시.

인덱싱 과정의 어려움

  • 컬렉션이 너무 큼
    • 클라우드 컴퓨팅 -> 참조하는 값들이 여기저기 퍼져있다
    • 스케줄링
    • etc…
  • 형태소 분석기 : 신조어가 자꾸 나온다
  • 인덱스 업데이트는 얼마나 자주 해야 하는가?

Searching

Matching Process

Q(“blue sky”) : 인버티드 인덱스를 활용, 각 워드가 어느 도큐먼트에서 나왔는지 찾는다.
-> 그럼으로써 쿼리-도큐먼트간 연관성을 계산할 수 있다.
매칭!

Retrieval Model

매칭과 비슷하지만 이건 연관도가 높은 걸 찾는 작업

  • Boolean Model
  • Vector Space Model
  • Vector Model
  • Probability Model
  • Language Model

Ranking

Relevance Score로 정렬.

  • Relevance Score = {Similarity, Quality, Recency …}
  • Recency : 시간에 따라 점수가 낮아져야 한다. 감쇄 곡선 사용. 서비스, 컬렉션에 따라 감쇄 곡선이 달라진다.
  • Champion List : 명확한 답을 제시하는 term.

Result Display

검색엔진을 써 보면 타이틀도 뽑아서 보여주고, 검색한 키워드도 하이라이팅 해서 보여주고, 관련된 부분도 보여준다. 이러한 작업.

  • Passage 추출
  • Keyword Highlighting
  • Collection Ranking : 네이버에서 검색해 보면 검색어에 따라 노출되는 컬랙션이 다름.
  • Preview & Thumbnails : UX. 유저의 불필요한 클릭을 줄여준다.

Query

모든 유저가 훌륭한 쿼리를 날리는 것은 아니다. 훌륭하지 않은 쿼리에 대해서도 훌륭한 검색결과를 제공해야 한다.

  • 자동완성
  • 연관검색어
  • 실시간 인기검색어
  • 오탈자 교정
  • 질의 확장 : 한글검색 -> 영어 등 입력하지 않은 결과도 찾아준다
  • Query Reformulation

User Feedback

검색엔진을 개선하기 위해서 하는 작업들

  • Champion List 구축
  • User Behavior & Action
  • Clickstream Mining

=> 사용자들이 어떤 페이지를 선택하고, 어떤 페이지를 오래 보고. 또는 어떤건 잘 안누르고. 이런걸 분석한다.

Ranking

랭킹에 대해 좀 더 자세히 살펴보자.

PageRank

구글을 처음 만들 때 링크로 페이지의 점수를 계산했다. 지금은 링크가 많지 않지만 예전에는 검색엔진이 없어서 페이지끼리 전부 링크가 되어 있어서 매우 많았다.

P : 나를 링크하는 페이지 수
R : 나를 링크하는 페이지의 점수
L : 나를 링크하는 페이지의 외부링크 수
내 점수 = PR/L

즉 나를 링크하는 페이지가 많을수록, 그 페이지의 점수가 높을수록 점수가 올라가고 반대로 그 페이지의 외부링크가 많을수록 점수가 떨어진다.

Ranking Features

컨텐츠 퀄리티를 계산.

  • 소셜에서는 외부에서 링크한 사람들이 얼마나 영향력이 있는가
  • 이 페이지가 얼마나 오래 운영되었는가

등등을 참조.

SEO

Search Engine Optimization : 좋게 말하면 검색엔진 최적화.
정확하게는 검색 순위를 올려주고 돈을 받는 회사들. 즉, 어떻게 하면 검색엔진 상위에 랭크되는가를 분석한다.
랭킹 알고리즘의 품질이란 올바른 내용이 올바른 순위에 나오도록 하는 일. 즉 SEO는 랭킹 알고리즘의 품질에 반하는 일이다. 랭킹 알고리즘은 끝없는 품질과의 싸움.

Edge Rank

이러한 랭킹 알고리즘들은 검색 밖에서도 ‘평가’를 위해 사용한다. 그중에서도 대표적인게 페이스북에서 사용하는 Edge Rank다.

  • User Action
    • Share, Comment, Likes, Clicks
  • Edge Rank
    • Affinity : 관계 점수. 교류가 없는 친구는 점점 안보인다.
    • Weight : 글의 종류나 유저 액션. 즉 내가 평소에 이미지만 보는가. 어떤 종류의 글을 좋아하는가.
    • Time : Decay Function (감쇄곡선)
  • Story Bumping
    • 사용자가 미처 확인하지 못한 친구글 Boost UP!
  • Last Actor
    • 최근 친구글 중 인기글 Boost UP!

Evaluation

그럼 검색결과를 어떻게 평가할까? 정답이 없는 문제.

Measure
  • Recall & Precision
    • Recall : 나와야 할 문서가 얼마나 나왔는가.
    • Precision : 나온 문서들 중 정확한 문서는 얼마나인가.
      둘다 높은 게 이상적이지만, 현실적으론 Recall이 올라갈수록 Precision이 떨어진다.
  • F Measure
TREC

Text REtrieval Conference. 정부 문서 따위의 공식 문서들을 활용한 정답 셋이다. 이걸 활용해서 Measure한다. 문제는 한국어 자료는 없어서 직접 만들어야 한다.

내부 아키텍쳐는?

  • B+트리 등을 사용해서 최선의 인덱싱을 한다.
  • 서버와 프로그램을 거의 일치시킨다. 즉 하이퍼바이저-OS-프로그램 등의 이런 레이어를 최대한 제거.

  1. boilerplate. 재사용 가능한 부분을 의미. 일종의 템플릿이라고 생각할 수 있다.

  2. 사이트 제작자가 사이트 내에서 어떤 URL은 접근해도 되고 어떤 URL은 접근하면 안 되는지 적어 놓은 문서. 강제성은 없지만 지키는게 매너.

  3. 동사, 형용사, 서술격 주사 등에서 변하지 않는 줄기 부분


'그 외/Tech' 카테고리의 다른 글

Git!  (0) 2014.10.03
cURL!  (0) 2014.09.22
검색엔진 (2) - 라이브러리: Lucene, Solr, Elasticsearch  (1) 2014.08.26
검색엔진 (1) - 검색엔진의 이해  (2) 2014.08.26
인터프리터와 바이트코드  (0) 2014.08.19
공인 IP와 사설 IP 그리고 고정/유동 IP  (0) 2014.08.13

Ubuntu에 개발환경 셋팅하기 (2)

Ubuntu에 개발환경 셋팅하기 (2)

Redis

레디스를 깔자.

$ apt-get install redis-server

이것만 하면 깔린다.

cp /etc/redis/redis.conf /etc/redis/redis.conf.default

환경설정은 미리미리 백업해 두도록 하자.

redis-server /etc/redis/redis.conf

레디스 서버를 실행시켜 보면 아무 반응도 없는 것 같지만 ps aux로 프로세스를 확인해보면

$ ps aux | grep redis
redis    12649  0.0  0.0  10680  1420 ?        Ss   17:28   0:00 /usr/bin/redis-server /etc/redis/redis.conf

레디스가 동작하고 있는 것을 확인할 수 있다.

redis-cli로 레디스 클라이언트도 정상 작동한다.

$ redis-cli
redis 127.0.0.1:6379>

위에 링크로 걸어둔 문서는 내용이 알찬 것 같으니 읽어보자.

Flask

플라스크 한글 문서
플라스크든 뭐든, 파이썬 환경설정은 virtualenv를 추천하지만 우리는 하나의 프로젝트를 진행할 뿐이므로 System-wide로 설치한다.

$ sudo pip install Flask

그냥 이러면 설치 끝!

SSH

설치 하는데 자꾸 접속이 끊겨서 불편했다. 그래서 타임아웃 시간을 늘려주기로 함.
타임아웃 시간을 컨트롤하는건 크게 두가지 방법이 있는데, 서버에서 타임아웃 시간을 늘려주는 방법과 클라이언트에서 ssh가 알아서 주기적으로 서버에 ack을 보내 스스로가 살아있음을 알리는 방법이다.

우리 팀원들도 분명 긴걸 좋아하리라 굳게 믿고 서버의 타임아웃 시간을 수정하였다.

$ cd /etc/ssh/
$ sudo vim sshd_config

ssh와 sshd가 있는데 ssh는 ssh-client고 sshd는 ssh daemon1으로 ssh-server역할을 하는 것 같다.

ClientAliveInterval 600
ClientAliveCountMax 3

그리고 sshd_config에 이 내용을 추가. 이렇게 설정해 두면 반응이 없는 클라이언트가 살아있는지 600초마다 한번씩 최대 3번 클라이언트에게 데이터 전송을 요청한다.

$ sudo service ssh restart

로 마무리. /etc/init.d/ssh restart도 가능하지만 써보니까 service를 사용하라고 권고하더라.

클라이언트에서 타임아웃 시간을 늘리는 방법은 위 링크를 참조하자.

참고

ps aux

리눅스에서 프로세스들을 보여주는 명령어
http://superuser.com/questions/117913/ps-aux-output-meaning

$ ps aux  
USER       PID  %CPU %MEM  VSZ RSS     TTY   STAT START   TIME COMMAND
timothy  29217  0.0  0.0 11916 4560 pts/21   S+   08:15   0:00 pine  
root     29505  0.0  0.0 38196 2728 ?        Ss   Mar07   0:00 sshd: can [priv]   
can      29529  0.0  0.0 38332 1904 ?        S    Mar07   0:00 sshd: can@notty

USER = user owning the process
PID = process ID of the process
%CPU = It is the CPU time used divided by the time the process has been running.
%MEM = ratio of the process’s resident set size to the physical memory on the machine
VSZ = virtual memory usage of entire process
RSS = resident set size, the non-swapped physical memory that a task has used
TTY = controlling tty (terminal)
STAT = multi-character process state
START = starting time or date of the process
TIME = cumulative CPU time
COMMAND = command with all its arguments

특정 프로세스를 찾을 때에는 ps aux | grep <string> 보다는 pgrep <string> | xargs ps 을 활용하자.

kill

kill PIDkill -9 ProcessName 으로 프로세스를 죽일 수 있다.


  1. 멀티태스킹 운영 체제에서 데몬은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다. 원래 데몬이란 도깨비나 유령을 의미함.

Ubuntu에 개발환경 셋팅하기 (1)

Ubuntu에 개발환경 셋팅하기

소프트웨어 마에스트로 프로젝트 서버를 셋팅한다. 서버는 uCloud에서 구매하였다. 서버 스펙은 나중에 추가.

Server spec

Ubuntu 12.04

Setting

  • Python
    • pip
    • virtualenv
  • Python libs
    • numpy
    • scipy
    • scikit-learn
    • matplotlib
    • nltk
    • newspaper
    • goose
    • boilerpipe
    • feedparser
  • Flask
  • Redis

libs는 개발하면서 그때그때 설치하는게 맞다고 생각하나, 몇가지는 미리 깔아둠.

Python

기본적으로 2.7.3이 깔려 있다.

$ python -V
Python 2.7.3

파이썬 최신버전은 2.7.8.

맥이나 리눅스에는 기본적으로 파이썬이 설치되어 있는데, 그건 OS에서 파이썬을 쓰기 때문이다. 많은 부분들이 파이썬으로 코딩되어 있음. 따라서 이 시스템에 설치되어있는 파이썬(이하 시스템 파이썬)을 함부로 건드렸다간 시스템이 망가진다.

특히, 파이썬의 경우 메이저 버전이 다르면 호환이 안되기 때문에 함부로 업그레이드 해서는 안된다. 여기서 말하는 메이저 버전이란 소수점 둘째자리를 의미. 즉 2.6과 2.7은 호환이 안된다.

그러나 나는 최신버전을 쓰고 싶었고 현재 깔려있는 파이썬은 2.7.3으로 메이저 버전은 같았기에 업그레이드를 시도해 보기로 했다.

1차 시도

$ apt-get update
$ apt-get upgrade
$ apt-get install python2.7

실패. 이미 python2.7이 설치되어 있다고 나온다.

2차 시도

리눅스 Python 2.7 컴파일 설치
이걸 시도해보자. 이건 2.4 -> 2.7이므로 이것보다 수월하게 되리라 기대한다.

다운로드 및 설치

처음부터 막힘. 서버 세팅 문젠지는 몰라도 그냥 wget으로 받아오려면 에러가 난다. 아래처럼 —no-check-certificate 옵션을 추가해 줘야 함. 참고로 -N은 로컬에 있는 파일보다 최신버전만 받는 옵션이다.

$ cd /usr/local/src
$ wget -N --no-check-certificate https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz
$ sudo tar xzf Python-2.7.8.tgz
$ cd Python-2.7.8/
$ sudo ./configure
$ sudo make
$ sudo make altinstall

그러고 나면

$ python -V
Python 2.7.3
$ /usr/bin/python -V
Python 2.7.3
$ /usr/local/bin/python2.7 -V
Python 2.7.8

이렇게 된다.

바꿔치기

자 그럼 대망의 바꿔치기!

$ mv /usr/bin/python /usr/bin/python_old
$ cp /usr/local/bin/python2.7 /usr/bin/python
$ python -V
Python 2.7.8

잘 되긴 하는데 yum이 안 됨(yum도 파이썬 스크립트임) -> yum이 안 되는줄 알았는데 알고보니 yum은 안 깔려있었다. 기존의 시스템 파이썬 일때는 yum을 깔라고 나오는데 2.7.8에서는 뭐라뭐라 파이썬 에러가 남. 암튼 이것도 뭔가 안된다는거니 문제다. 고치는 방법이 나와있긴 한데 저렇게 다 고칠수는 없는 노릇… 나 혼자 하는 프로젝트도 아니고 팀플젝이니 여기까지만 하도록 한다 -_-

pip, virtualenv

자 그럼 필요한거나 하자.
How to install pip on Ubuntu

$ sudo apt-get install python-pip python-dev build-essential 
$ sudo pip install --upgrade pip 
$ sudo pip install --upgrade virtualenv

virtualenv는 우리 프로젝트에서 안 쓸 것 같지만 필수적인 패키지 중 하나니 설치해 둔다.

python libs

numpy, scipy, scikit-learn

$ sudo pip install -U numpy scipy scikit-learn

에러 -_-

Command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip_build_root/scipy/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-XQ2E58-record/install-record.txt --single-version-externally-managed --compile failed with error code 1 in /tmp/pip_build_root/scipy
Traceback (most recent call last):
  File "/usr/local/bin/pip", line 9, in <module>
    load_entry_point('pip==1.5.6', 'console_scripts', 'pip')()
  File "/usr/local/lib/python2.7/dist-packages/pip/__init__.py", line 185, in main
    return command.main(cmd_args)
  File "/usr/local/lib/python2.7/dist-packages/pip/basecommand.py", line 161, in main
    text = '\n'.join(complete_log)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 72: ordinal not in range(128)

scipy를 설치하다 에러가 난 듯.

한참 삽질하다 보니 이것보다 윗단에 걸 봐야되는거 같다. 저 에러 위에 이게 있었음

numpy.distutils.system_info.BlasNotFoundError:
    Blas (http://www.netlib.org/blas/) libraries not found.
    Directories to search for the libraries can be specified in the
    numpy/distutils/site.cfg file (section [blas]) or by setting
    the BLAS environment variable.

즉 blas라이브러리를 깔아야 한댄다. 이거 깔고 나면 lapack 도 깔라고 함.

$ sudo apt-get install libblas-dev
$ sudo apt-get install liblapack-dev

로 해결. apt-get python-numpy python-scipy 로 하면 쉽게 된다는 거 같은데 여기까지 한 이상 pip로 해보기로 결심함. pip가 더 좋다는 소리도 있다. 왠진 모름 -_-

building 'dfftpack' library
error: library dfftpack has Fortran sources but no Fortran compiler found

이젠 별별 에러가 다 난다. 포트란 컴파일러를 깔아주자.

$ sudo apt-get install libamd2.2.0 libblas3gf libc6 libgcc1 \
libgfortran3 liblapack3gf libumfpack5.4.0 libstdc++6 \
build-essential gfortran python-all-dev \
libatlas-base-dev

뭘 이렇게 많이 설치해야 되는지…

감동. 이러고 설치하면 다 깔린다. 한참 걸리니 터미널을 쳐다보고 있지 말 것을 추천한다. import해서 정상적으로 임포트되는것도 확인.


오늘의 교훈 : 에러메시지를 꼼꼼히 읽자.

오늘의 과제 : pip와 apt-get의 차이는 무엇인가. apt-get은 리눅스 패키지 관리 툴 아닌가? 그렇다면 왜 pip, 즉 파이썬 패키지까지 얘가 관리하는것인가. 만약 둘다 특정 패키지를 설치할 수 있다면, numpy나 scipy같이, 둘중 아무거나로 깔아도 상관 없는 것인가. 상관 있다면 왜 그런가.