python 및 머신러닝/집단지성 프로그래밍

[Programming Collective Intelligence] - 집단지성 프로그래밍 2,3,4장 정리

java개발자 2015. 9. 1. 09:28

새로운 것을 배울때마다 끊임없이 이전에 배운 것을 곱씹자.. 안그럼 잊어버린다...

새로운 것을 배우는 것이 중요한 것이 아니다. 배운 것을 잊어버리지 않는 것이 중요하다.

 

간단요약

 

2. 추천시스템 만들기

2-1. 협업 필터링

많은 사람들(큰 무리)의 생각들을 기준으로, 특정 사람의 생각을 추천해 나가는 과정

2-2. 선호 정보 수집

데이터를 딕셔너리로 보관

2-3. 유사 사용자 찾기(사람에게 사람을 추천)

유사도를 측정하기 - 유클리디안 거리점수, 피어슨 상관계수 이용

나와 비슷한 생각을 가진 사람 찾기

2-4. 항목 추천(사람에게 물건을 추천)

나에게 없는 항목을 추천하기

> 나와 비슷한(유사도) 생각을 가진 사람의 항목에 더 가중치를 두어서 판단

2-5. 제품 매칭

사람과 물건을 바꿈(대칭행렬)

물건에게 사람을 추천, 물건에게 물건을 추천

2-6. 딜리셔스 링크 추천 기능 만들기

생략(사이트 접속 불가)

2-7. 항목 기반 필터링

항목간의 유사도를 미리 계산해서 딕셔너리로 보관

사람에게 물건을 추천(미기 계산한 딕셔너리 이용)

2-8. 무비렌즈 데이터 세트 이용하기

데이터가 많다... 시간이 오래걸린다... 분산처리 방식이 필요하다...

사용자 기반 추천 기법 이용

항목 기반 추천 기법 이용

2-9. 사용자 기반 필터링과 항목 기반 필터링

데이터의 희박 정도 : 1- (각 사람들과 관련된 항목 개수 / 전체 항목 개수)

항목 기반 필터링 :

장점 : 큰 데이터 세트인 경우 사기필보다 유리, 희박한 데이터세트인 경우 사기필보다 유리 (조밀한 경우 둘다 유리)

단점 : 항목 유사도 테이블의 최신 유지에 추가부담

사용자 기반 필터링(사기필) : 

장점 : 구현 용이, 추가 단계 없음, 자주 변경되고, 데이터 세트가 적은 경우

2-10. 함께 풀어보기

 

*사용된 라이브러리

from math import sqrt                # 제곱근

from operator import itemgetter    # sort 할때

 

3.군집 발견

3-1. 감독 대 무감독 학습

감독 학습(지도 학습) : 신경망, 결정트리, SVM, 베이지안 필터링

무감독 학습(비지도 학습) : NMF, SOM

3-2. 단어 벡터

RSS 접속해서 단어의 출현 빈도 측정

3-3. 계층적 군집화

블로그이름과 단어들의 출현빈도(0,1,1,1,0,0,1,1,1,,,)를 하나의 데이터로 간주하고, 데이터간의 유사도를 이용해서 군집한다.

군집화 : 초기 가장 유사도가 높은 2개를 찾아서 묶어서 합치고 새로운 가상 데이터를 만든다. 초기 real 데이터가 없어질 때까지 반복한다.

각 개별 데이터를 클래스로 관리(bicluster), 클래스안에 클래스가 존재하는 tree 형태로 구성. 1클래스를 left, right 두개의 클래스만 보유 가능

3-4. 계통도 출력

PIL 을 이용해 화면에 tree 형태로 출력

3-5. 세로줄 군집화

블로그명과 단어사이의 관계를 뒤집음(대칭행렬)

3-6. K평균 군집화

K개의 중심점 주변으로 군집을 생성하기 - 자리찾기

계층적 군집화 기법보다 매우 빠름

3-7. 선호도 군집

수집 및 파싱 생략(사이트 접속 불가)

단어 출현 빈도를 0과 1로 표현 -> 타니모토 계수 이용

3-8. 2차원으로 데이터 보기

다차원비례축소법 - 여러 차원의 속성들을 2차원으로 나타내기

여러 차원의 속성으로 항목간의 거리를 측정 -> 2차원으로 나타내기 위해 최적의 자리 찾기 경쟁!!!!

3-9. 군집 가능한 다른 것들

3-10. 함께 풀어보기

 

*사용된 라이브러리

import feedparser                        # rss 접속

import re                                    # 정규식

from math import sqrt                    # 제곱근

from PIL import Image, ImageDraw    # 그림 그리기(직선, 텍스트)

import random                            # the semi-open range [0.0, 1.0)

 

 

4. 검색과 랭킹

4-1. 검색엔진이란?
        문서 수집->색인->랭킹으로 조회

4-2. 단순 크롤러
        urllib3를 이용해서 HTML 얻기
        BeautifulSoup을 이용한 HTML 파싱
        특정 URL에 접속해서 HTML을 얻는다. HTML에서 단어 모음을 얻는다. 그리고 HTML내의 a태그로 URL 리스트를 만들고 접속을 반복한다.

4-3. 색인하기
        sqlite3를 이용한 DB CRUD
        5개 테이블을 이용한 인덱싱 기능(URL, 단어, URL-단어, 링크:URL시작-URL종료, 링크-단어)

4-4. 검색하기
        1개 이상의 단어가 속한 URL을 찾기 (select sql 이용)
        > 동적으로 sql 만들기(inner join)

4-5. 내용 기반 랭킹

위 방법대로 일단 검색. 그리고 여러 가중치를 부여해서 순위를 변경한다.

> 가중치 :

1.단어 빈도 : 검색어들이 가장 많이 나온 페이지를 선순위

2.문서 내 위치 : 검색어들의 페이지내 위치값들의 합이 작은 페이지를 선순위

3.단어 거리 : 2개 이상의 검색어가 있을 때, 검색어 사이의 거리(위치값)가 작은 페이지가 선순위

4.페이지랭크 : (다른 페이지에 의해) 많이 인용(링크)된 페이지를 선순위

5.링크텍스트 : 해당 URL을 링크하고 있는 페이지중에서 a태그의 텍스트가 검색어 안에 있고 경우 선순위

4-6. 유입 링크 사용하기

해당 URL페이지가 얼마나 많이 인용(링크)되었는가?

> 해당 URL페이지가 (다른 페이지에 의해서) 링크된 횟수를 이용해서 순위를 결정

페이지랭크pr 알고리즘 : 페이지의 pr 점수 / 페이지 안의 링크 총개수

> 각 페이지의 pr 점수를 일단 초기값으로 설정하고, loop를 많이 돌려서 일정한 값에 수렴되면 중단...

링크텍스트 : a태그의 텍스트가 검색어 안에 있는 경우 선순위

4-7. 클릭 학습

다음 세가지를 이용해서 인공신경망(MLP, 다중층 인식망)을 만든다.

사용자의 검색어

검색 결과 url모음

사용자가 클릭한 url

단어층-은닉층-출력층

 

 

*사용된 라이브러리

import urllib3                                # HTTP 접속

from bs4 import BeautifulSoup        # HTML 파싱
from urllib.parse import urljoin        # 상대주소 URL을 절대주소 URL로 만들기
import sqlite3 as sqlite                    # 내장DB CRUD
import sys                                   #except 에러 메시지 확인
import re                                    # 정규식

 

from math import tanh                # 각 노드가 입력에 반응하는 정도를 변환