본문 바로가기
python 및 머신러닝/집단지성 프로그래밍

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

by java개발자 2015. 9. 1.

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

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

 

간단요약

 

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                # 각 노드가 입력에 반응하는 정도를 변환