Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
빅데이터
실전기술
IT가맹점개발팀
이태영
2014.12.16
8번째 스터디
유사도 및 군집화
빅데이터 분석 기술
이미지 출처 : http://www.saltlux.com/bigdata-analysis-overview/
빅데이터 분석 기술
이번 시간에 살짝 다룰 기술 도메인
이미지 출처 : http://www.saltlux.com/bigdata-analysis-overview/
빅데이터 분석 기술
유사도 매칭과 군집화
1. 유사도 매칭 (Similarity Matching)
• 알려진 데이터에 기반해 비슷한 개체를 찾아냄
• 유사도 매칭은 고객에게 제품을 추천할 때 사용하는 가장 인기 있는 방...
유사도 매칭
유클리디안 거리(Euclidean distance)
(𝑥 𝐴, 𝑦 𝐴)
(𝑥 𝐵, 𝑦 𝐵)
𝑥 𝐵 − 𝑥 𝐴
𝑦 𝐵 − 𝑦 𝐴
distance(A,B) =
(𝑥 𝐵 − 𝑥 𝐴)2+(𝑦 𝐵 − 𝑦 𝐴)2
B
...
유사도 매칭
K-NN(Nearest neighbor) 알고리즘
• 가장 가까운 k개의 객체들 중 가장 많은 특징으로 판단
• k = 3의 경우, 타겟 객체는 녹색으로 판단
• k = 7의 경우, 타겟 객체는 파랑으로 판...
유사도 매칭
K-NN(Nearest neighbor) 알고리즘
• 노찬*은 타켓마케팅을 통해 모바일쿠폰 발급에 참여할 고객인가?
이름 나이 소득 카드수 참여
노찬* 27 300 2 ?
김진* 27 300 3 X
최진* ...
유사도 매칭
K-NN(Nearest neighbor) 알고리즘
• 노찬*은 타켓마케팅을 통해 모바일쿠폰 발급에 참여할 고객인가?
참고 : http://www.highcharts.com/
구현 : http://jsfidd...
유사도 매칭
K-NN(Nearest neighbor) 알고리즘
목표 객체
참여
불참
𝑑 𝐴, 𝐵 = (𝑥 𝐵 − 𝑥 𝐴)2+(𝑦 𝐵 − 𝑦 𝐴)2+(𝑧 𝐵 − 𝑧 𝐴)2
유사도 매칭
K-NN(Nearest neighbor) 알고리즘
이름 나이 소득 카드수 참여 유클리디안 거리
노찬* 27 300 2 O
김진* 27 300 3 X 1.00
최진* 28 300 2 O 1.00
박동* 35 ...
𝑠𝑐𝑜𝑟𝑒 𝑐, 𝑁 = ෍
𝑦∈𝑁
𝑤 𝑥, 𝑦 × [𝑐𝑙𝑎𝑠𝑠 𝑦 = 𝑐 ]
유사도 매칭
K-NN(Nearest neighbor) 알고리즘
• 다수결 투표
𝑤 𝑥, 𝑦 =
1
𝑑𝑖𝑠𝑡(𝑥, 𝑦)2
• 유사도 반영 투표 ...
유사도 매칭
K-NN(Nearest neighbor) 알고리즘
• 거리에 따라 미치는 영향이 다르다.
이름 나이 소득 카드수 이벤트 참여 거리 유사도 비중(w) 기여도
노찬* 27 300 2 ?
김진* 27 300 3 ...
유사도 매칭
K-NN(Nearest neighbor) 알고리즘
• 노찬* 고객이 7-NN에서 참여할 확률은 50.18%
이름 나이 소득 카드수 이벤트 참여 거리 유사도 비중(w) 기여도
노찬* 27 300 2 ?
김진*...
유사도 매칭
두 객체간 유사도 : Jaccard Similarity
1. Jaccard Similarity Coefficient
• JSim (𝐴, 𝐵) =
𝐴∩𝐵
𝐴∪𝐵
• 두 데이터의 교집합 크기를 합집합 크기로 나...
유사도 매칭
두 객체간 유사도 : Jaccard Similarity
• 내 컴퓨터에서 Jaccard 유사도를 이용한 mp3 노래 검색
1. 내 컴퓨터에서 mp3 파일 리스트 추출하여 mp3_list.txt 저장
2. 리...
유사도 매칭
두 객체간 유사도 : Jaccard Similarity
• 내 컴퓨터에서 Jaccard 유사도를 이용한 mp3 노래 검색
2. N-gram으로 2글자씩 분리(bigram)하여 mp3_ngram.txt에 저장...
유사도 매칭
두 객체간 유사도 : Jaccard Similarity
• 내 컴퓨터에서 Jaccard 유사도를 이용한 mp3 노래 검색
3. 사용자가 입력한 쿼리와 mp3_ngram.txt의 유사도를 계산하여 측정
4. ...
유사도 매칭
두 객체간 유사도 : Jaccard Similarity
• 내 컴퓨터에서 Jaccard 유사도를 이용한 mp3 노래 검색
4. Bigram 단어별 유사도가 높은 순으로 파일명을 정렬하여 보여준다.
publi...
유사도 매칭
두 객체간 유사도 : Jaccard Similarity
• 내 컴퓨터에서 Jaccard 유사도를 이용한 mp3 노래 검색
1. 내 컴퓨터에서 mp3 파일 리스트 추출하여 mp3_list.txt 저장
2. 리...
군집화(클러스터링)
K-Means 알고리즘
• K는 데이터들 중에서 찾아내려는 군집의 수
1. k개의 임의 위치에 클러스터 중심 할당
2. k개의 클러스터 중심이 바뀌지 않을 때까지 반복 :
① 모든 객체들은 k개 클러...
군집화(클러스터링)
K-Means 알고리즘
이름 나이 소득
노찬* 27 300
김진* 27 310
최진* 28 300
유진* 31 310
이태* 33 320
유용* 32 320
김성* 32 350
박동* 35 370
2...
군집화(클러스터링)
K-Means 알고리즘
class WorkerInfo{
Double age; // 나이
Double salary; // 급여
Integer k; // 해당 k 클러스터 번호
public WorkerI...
군집화(클러스터링)
K-Means 알고리즘
이름 나이 소득
노찬* 27 300
김진* 27 310
최진* 28 300
유진* 31 310
이태* 33 320
유용* 32 320
김성* 32 350
박동* 35 370
[...
군집화(클러스터링)
K-Means 알고리즘
280
290
300
310
320
330
340
350
360
370
380
25 26 27 28 29 30 31 32 33 34 35 36
나이/소득
[9]김진*과 2의 거...
군집화(클러스터링)
K-Means 알고리즘
280
290
300
310
320
330
340
350
360
370
380
25 26 27 28 29 30 31 32 33 34 35 36
나이/소득
[9]김진*과 1의 거...
군집화(클러스터링)
K-Means 알고리즘
280
290
300
310
320
330
340
350
360
370
380
25 26 27 28 29 30 31 32 33 34 35 36
• 새로운 객체는 가장 가까운 중...
군집화(클러스터링)
K-NN, K-Means 알고리즘 단점
1. K-NN, K-Means 단점
• In Memory-based 알고리즘
• 모든 객체들 간 거리 계산으로 인한 부하 발생
• 빅데이터 처리에 불리
2. K...
군집화(클러스터링)
빅데이터 추천 시스템에서는 MIN-HASH 알고리즘 대세
1. MIN-HASH 알고리즘
• Google News Personalization: Scalable Online Collaborative F...
군집화(클러스터링)
MIN-HASH 알고리즘
1. 클러스터 ID 생성 (p개 해쉬 함수 선정)
• 대상 객체가 가지는 요소들을 ℎ 𝑝(𝑥) 함수로 이용하여 계산
 이분법의 참(1)/거짓(0) 기록일 경우
 ℎ 𝑝 𝑥...
군집화(클러스터링)
MIN-HASH 알고리즘
1. 사용자들의 업종별 사용내역 MIN-HASH 클러스터링
• 해쉬 함수 선정 (p=2, q=2)
• [q=1, p=1] ℎ1 𝑥 = 3𝑥 + 5 mod 17
• [q=1, ...
군집화(클러스터링)
MIN-HASH 알고리즘
1. 사용자들의 업종별 사용내역 MIN-HASH 클러스터링
• [q=1, p=1] ℎ1 𝑥 = 3𝑥 + 5 mod 17
• [q=1, p=2] ℎ2 𝑥 = 5𝑥 + 2 mod...
군집화(클러스터링)
MIN-HASH 알고리즘
1. 사용자들의 업종별 사용내역 MIN-HASH 클러스터링
• [q=1, p=1] ℎ1 𝑥 = 3𝑥 + 5 mod 17
• [q=1, p=2] ℎ2 𝑥 = 5𝑥 + 2 mod...
군집화(클러스터링)
MIN-HASH 알고리즘
그룹ID 고객번호
00000002
1000001
1000003
00010002
1000001
1000008
1000005
00010004
1000002
1000006
0006...
Mahout 설치
1) Mahout 0.9 다운로드
http://mahout.apache.org 접속 후 다운로드
2) 계정 홈 디렉토리로 mv
$ mv mahout-distribution-0.9.tar.gz ~
3) ...
Q&A
Upcoming SlideShare
Loading in …5
×

20141214 빅데이터실전기술 - 유사도 및 군집화 방법 (Similarity&Clustering)

20141214 Big data analysis seminar

  • Be the first to comment

20141214 빅데이터실전기술 - 유사도 및 군집화 방법 (Similarity&Clustering)

  1. 1. 빅데이터 실전기술 IT가맹점개발팀 이태영 2014.12.16 8번째 스터디 유사도 및 군집화
  2. 2. 빅데이터 분석 기술 이미지 출처 : http://www.saltlux.com/bigdata-analysis-overview/
  3. 3. 빅데이터 분석 기술 이번 시간에 살짝 다룰 기술 도메인 이미지 출처 : http://www.saltlux.com/bigdata-analysis-overview/
  4. 4. 빅데이터 분석 기술 유사도 매칭과 군집화 1. 유사도 매칭 (Similarity Matching) • 알려진 데이터에 기반해 비슷한 개체를 찾아냄 • 유사도 매칭은 고객에게 제품을 추천할 때 사용하는 가장 인기 있는 방법 중 하나 • 선호하거나 구매한 제품의 관점에서 현재 고객과 유사한 사람을 찾아낼 수 있음 • 분류, 회귀 분석, 군집화와 같은 여러 데이터 마이닝 작업을 해결하기 위한 기반 2. 군집화 (Clustering) • “우리 고객들이 자연스럽게 그룹으로 묶이는가?” • 특정 목적이 없는 상태에서 유사도에 따라 개체를 묶는다. • 군집화는 문제 영역의 기초 조사를 수행할 때 어떤 그룹이 자연스럽게 만들어지는지 알림 • 그룹이 존재한다면 다른 데이터마이닝 작업을 해볼 필요가 있다는 것을 의미
  5. 5. 유사도 매칭 유클리디안 거리(Euclidean distance) (𝑥 𝐴, 𝑦 𝐴) (𝑥 𝐵, 𝑦 𝐵) 𝑥 𝐵 − 𝑥 𝐴 𝑦 𝐵 − 𝑦 𝐴 distance(A,B) = (𝑥 𝐵 − 𝑥 𝐴)2+(𝑦 𝐵 − 𝑦 𝐴)2 B A m차원 공간 distance(A,B) = (𝑑1,𝐴 − 𝑑1,𝐵)2+(𝑑2,𝐴 − 𝑑2,𝐵)2+(𝑑3,𝐴 − 𝑑3,𝐵)2+ ⋯ + (𝑑 𝑚,𝐴 − 𝑑 𝑚,𝐵)2
  6. 6. 유사도 매칭 K-NN(Nearest neighbor) 알고리즘 • 가장 가까운 k개의 객체들 중 가장 많은 특징으로 판단 • k = 3의 경우, 타겟 객체는 녹색으로 판단 • k = 7의 경우, 타겟 객체는 파랑으로 판단 Target Object K=3 K=7
  7. 7. 유사도 매칭 K-NN(Nearest neighbor) 알고리즘 • 노찬*은 타켓마케팅을 통해 모바일쿠폰 발급에 참여할 고객인가? 이름 나이 소득 카드수 참여 노찬* 27 300 2 ? 김진* 27 300 3 X 최진* 28 300 2 O 박동* 35 370 20 X 이태* 33 320 15 O 유진* 31 310 12 O 김성* 32 350 17 X 유용* 32 320 18 O
  8. 8. 유사도 매칭 K-NN(Nearest neighbor) 알고리즘 • 노찬*은 타켓마케팅을 통해 모바일쿠폰 발급에 참여할 고객인가? 참고 : http://www.highcharts.com/ 구현 : http://jsfiddle.net/seen/0602nb3a/ 목표 객체 참여 불참
  9. 9. 유사도 매칭 K-NN(Nearest neighbor) 알고리즘 목표 객체 참여 불참 𝑑 𝐴, 𝐵 = (𝑥 𝐵 − 𝑥 𝐴)2+(𝑦 𝐵 − 𝑦 𝐴)2+(𝑧 𝐵 − 𝑧 𝐴)2
  10. 10. 유사도 매칭 K-NN(Nearest neighbor) 알고리즘 이름 나이 소득 카드수 참여 유클리디안 거리 노찬* 27 300 2 O 김진* 27 300 3 X 1.00 최진* 28 300 2 O 1.00 박동* 35 370 20 X 72.72 이태* 33 320 15 O 24.60 유진* 31 310 12 O 14.70 김성* 32 350 17 X 52.44 유용* 32 320 18 O 26.10 • 3-NN 일 경우
  11. 11. 𝑠𝑐𝑜𝑟𝑒 𝑐, 𝑁 = ෍ 𝑦∈𝑁 𝑤 𝑥, 𝑦 × [𝑐𝑙𝑎𝑠𝑠 𝑦 = 𝑐 ] 유사도 매칭 K-NN(Nearest neighbor) 알고리즘 • 다수결 투표 𝑤 𝑥, 𝑦 = 1 𝑑𝑖𝑠𝑡(𝑥, 𝑦)2 • 유사도 반영 투표 (Similarity-Moderated Voting) 𝑐 𝑥 = arg max 𝑠𝑐𝑜𝑟𝑒(𝑐, 𝑛𝑒𝑖𝑔ℎ𝑏𝑜𝑟𝑠 𝑥 ) 𝒏𝒆𝒊𝒈𝒉𝒃𝒐𝒓𝒔 𝒙 는 x 객체의 최근접 이웃 k개 반환, 𝐚𝐫𝐠 𝒎𝒂𝒙 는 score의 최대값을 반환 w()는 x 와 y 간의 유사도에 기반한 가중치 함수이므로, 유클리디안 거리 제곱의 역수가 사용
  12. 12. 유사도 매칭 K-NN(Nearest neighbor) 알고리즘 • 거리에 따라 미치는 영향이 다르다. 이름 나이 소득 카드수 이벤트 참여 거리 유사도 비중(w) 기여도 노찬* 27 300 2 ? 김진* 27 300 3 X 1.00 1.000000 0.49793266 최진* 28 300 2 O 1.00 1.000000 0.49793266 박동* 35 370 20 X 72.72 0.000189 9.41628E-05 이태* 33 320 15 O 24.60 0.001653 0.000823029 유진* 31 310 12 O 14.70 0.004630 0.002305244 김성* 32 350 17 X 52.44 0.000364 0.000181066 유용* 32 320 18 O 26.10 0.001468 0.000731179 𝑤 𝑥, 𝑦 = 1 𝑑𝑖𝑠𝑡(𝑥, 𝑦)2 𝑎𝑙𝑙 𝑝𝑟𝑜𝑏. = 1
  13. 13. 유사도 매칭 K-NN(Nearest neighbor) 알고리즘 • 노찬* 고객이 7-NN에서 참여할 확률은 50.18% 이름 나이 소득 카드수 이벤트 참여 거리 유사도 비중(w) 기여도 노찬* 27 300 2 ? 김진* 27 300 3 X 1.00 1.000000 0.49793266 최진* 28 300 2 O 1.00 1.000000 0.49793266 유진* 31 310 12 O 14.70 0.004630 0.002305244 이태* 33 320 15 O 24.60 0.001653 0.000823029 유용* 32 320 18 O 26.10 0.001468 0.000731179 김성* 32 350 17 X 52.44 0.000364 0.000181066 박동* 35 370 20 X 72.72 0.000189 9.41628E-05
  14. 14. 유사도 매칭 두 객체간 유사도 : Jaccard Similarity 1. Jaccard Similarity Coefficient • JSim (𝐴, 𝐵) = 𝐴∩𝐵 𝐴∪𝐵 • 두 데이터의 교집합 크기를 합집합 크기로 나눈 것 ∴ JSim (𝐴직원, 𝐵직원) = 𝐴∩𝐵 𝐴∪𝐵 = 3 8 = 0.375 2. Jaccard Distance • Jaccard 𝛿 (𝐴, 𝐵) = 1- JSim (𝐴, 𝐵) = 𝐴∪𝐵 − 𝐴∩𝐵 𝐴∪𝐵 • 1에서 Jaccard 유사도를 뺀 값 ∴ J 𝛿 (𝐴직원, 𝐵직원) = 1- 3 8 = 0.625 이름 A직원 B직원 전산 전공 1 0 석사 학위 0 1 개발 가능 1 1 C언어 1 1 자바 1 0 파이썬 0 1 스칼라 1 0 하둡 1 1
  15. 15. 유사도 매칭 두 객체간 유사도 : Jaccard Similarity • 내 컴퓨터에서 Jaccard 유사도를 이용한 mp3 노래 검색 1. 내 컴퓨터에서 mp3 파일 리스트 추출하여 mp3_list.txt 저장 2. 리스트를 읽어 2글자씩 분리(bigram)하여 mp3_bigram.txt 저장 3. 사용자가 입력한 파일명과 유사도를 계산하여 측정 4. 객체간 Bigram 유사도가 높은 순으로 파일명을 정렬하여 보여준다. import os def search(dirname): flist = os.listdir(dirname) for f in flist: next = os.path.join(dirname, f) if os.path.isdir(next): search(next) else: process(next) def process(filename): ext = os.path.splitext(filename)[-1] if ext == '.mp3': music_name = filename.split("")[-1].replace(" ","")+"n" f.write(music_name ) print music_name f = open("mp3_list.txt","w") search("I:/MUSIC") f.close() mp3_list.txt 추출 스크립트
  16. 16. 유사도 매칭 두 객체간 유사도 : Jaccard Similarity • 내 컴퓨터에서 Jaccard 유사도를 이용한 mp3 노래 검색 2. N-gram으로 2글자씩 분리(bigram)하여 mp3_ngram.txt에 저장 3. 사용자가 입 력한 파일명과 mp3_ngram.txt의 유사도를 계산하여 측정 4. Bigram 단어별 유사도가 높은 순으로 파일명을 정렬하여 보여준다. //파일리스트를 받아서 bigram 파일로 출력 (컴파일) public void compile(String input, String output) throws Exception{ br=new BufferedReader(new FileReader(input)); bw=new BufferedWriter(new FileWriter(output)); String line=null; StringBuilder sb=new StringBuilder(); while( (line = br.readLine()) != null){ String musicName = line.split(".mp3")[0]; /* 앞으로 이동하면서 2개 문자를 출력 */ for(int i=0;i<musicName.length();i++){ if(i < musicName.length()-1){ sb.append(musicName.substring(i, i+2)); sb.append(","); } } sb.deleteCharAt(sb.length()-1);/* 마지막 , 는 제거 */ System.out.println(sb.toString()); bw.write(line+":"+sb.toString()+"n"); // [파일명:bigram결과] 출력 sb.setLength(0);// StringBuilder 초기화 } br.close(); bw.close(); }
  17. 17. 유사도 매칭 두 객체간 유사도 : Jaccard Similarity • 내 컴퓨터에서 Jaccard 유사도를 이용한 mp3 노래 검색 3. 사용자가 입력한 쿼리와 mp3_ngram.txt의 유사도를 계산하여 측정 4. Bigram 단어별 유사도가 높은 순으로 파일명을 정렬하여 보여준다. // Jaccard 유사도 public double getSimilarity(String query, String data){ query=query.replaceAll(“ “, “”); StringBuilder sb = new StringBuilder(); Set<String> querySet = new HashSet<String>(); Set<String> dataset = new HashSet<String>(); //query Set 구성 for(int i=0;i<query.length();i++){ if(I < query.length() -1){ querySet.add(query.subsequence(I, i+2).toString()); } } //music Set 구성 String musicBiGram[] = data.split(“,”); for(String word : musicBiGram){ dataSet.add(word); } // Guava 라이브러리 이용 Set<String> intersection = Sets.intersection(querySet, dataSet); Set<String> union = Sets.union(querySet, dataSet); return intersection.size() / (double)union.size(); }
  18. 18. 유사도 매칭 두 객체간 유사도 : Jaccard Similarity • 내 컴퓨터에서 Jaccard 유사도를 이용한 mp3 노래 검색 4. Bigram 단어별 유사도가 높은 순으로 파일명을 정렬하여 보여준다. public void search(String query) throws Exception{ BufferedReader br = new BufferedReader(new FileReader(bigramFile)); HashMap<String, Double> JaccardSim = new HashMap<String, Double>(); String music=null; while( (music=br.readLine()) != null ){ String filename= music.split(":")[0]; String title = music.split(":")[1]; double sim = this.getSimilarity(query, title); if(sim > 0){ JaccardSim.put(filename, sim); } } //sorting HashMap, Hashtable by values in Java Map<String, Double> sortedSim = sortByValues(JaccardSim); Set<String> keySet = sortedSim.keySet(); for(String key: keySet){ System.out.println("[유사도] "+sortedSim.get(key) +" [파일명]"+key); } br.close(); }
  19. 19. 유사도 매칭 두 객체간 유사도 : Jaccard Similarity • 내 컴퓨터에서 Jaccard 유사도를 이용한 mp3 노래 검색 1. 내 컴퓨터에서 mp3 파일 리스트 추출하여 mp3_list.txt 저장 2. 리스트를 읽어 2글자씩 분리(bigram)하여 mp3_bigram.txt 저장 3. 사용자가 입력한 파일명과 유사도를 계산하여 측정 4. 객체간 Bigram 유사도가 높은 순으로 파일명을 정렬하여 보여준다. public static void main(String args[]) throws Exception{ MP3Bigram bi=new MP3Bigram(); //bi.compile("mp3_list.txt", "mp3_bigram.txt"); bi.setBigramFile("mp3_bigram.txt"); bi.search("처음 사랑 타이밍"); } [유사도] 0.23076923076923078 [파일명]버스커버스커-사랑은타이밍.mp3 [유사도] 0.1875 [파일명]020버스커버스커-사랑은타이밍.mp3 [유사도] 0.17647058823529413 [파일명]016-버스커버스커-사랑은타이밍.mp3 [유사도] 0.125 [파일명]버스커버스커-처음엔사랑이란게.mp3 [유사도] 0.1111111111111111 [파일명]02첫사랑.mp3 [유사도] 0.10526315789473684 [파일명]008버스커버스커-처음엔사랑이란게.mp3 [유사도] 0.1 [파일명]004-버스커버스커-처음엔사랑이란게.mp3 [유사도] 0.1 [파일명]01-눈사랑.mp3 [유사도] 0.1 [파일명]20사랑이야.mp3 [유사도] 0.09090909090909091 [파일명]22전쟁의사랑.mp3 [유사도] 0.07142857142857142 [파일명]068.여행-타이푼.mp3
  20. 20. 군집화(클러스터링) K-Means 알고리즘 • K는 데이터들 중에서 찾아내려는 군집의 수 1. k개의 임의 위치에 클러스터 중심 할당 2. k개의 클러스터 중심이 바뀌지 않을 때까지 반복 : ① 모든 객체들은 k개 클러스터 중심과 거리 계산 ② 계산된 객체는 가장 가까운 k 클러스터로 포함 ③ 각각의 k 클러스터에 포함된 클러스터 중심을 재계산
  21. 21. 군집화(클러스터링) K-Means 알고리즘 이름 나이 소득 노찬* 27 300 김진* 27 310 최진* 28 300 유진* 31 310 이태* 33 320 유용* 32 320 김성* 32 350 박동* 35 370 280 290 300 310 320 330 340 350 360 370 380 25 27 29 31 33 35 37 나이/소득
  22. 22. 군집화(클러스터링) K-Means 알고리즘 class WorkerInfo{ Double age; // 나이 Double salary; // 급여 Integer k; // 해당 k 클러스터 번호 public WorkerInfo(){} public WorkerInfo(Double age, Double salary, Integer k) { this.age = age; this.salary = salary; this.k = k; } public WorkerInfo(Integer age, Integer salary, Integer k) { this.age = (double)age; this.salary = (double)salary; this.k = k; } public Double getAge() { return age; } public void setAge(Double age) { this.age = age; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } public Integer getK() { return k; } public void setK(Integer k) { this.k = k; } } 이래저래 구현하고 보니 약 180 줄의 자바코드 소스 : https://drive.google.com/folderview?id=0B-3PNr5L- _VhNWxwODZ0Tko5aGs&usp=sharing
  23. 23. 군집화(클러스터링) K-Means 알고리즘 이름 나이 소득 노찬* 27 300 김진* 27 310 최진* 28 300 유진* 31 310 이태* 33 320 유용* 32 320 김성* 32 350 박동* 35 370 [9]김진*과 1의 거리 : 5.153882032022076 [9]박동*과 2의 거리 : 10.111874208078342 [9]유용*과 0의 거리 : 0.5 [9]노찬*과 1의 거리 : 5.153882032022076 [9]이태*과 0의 거리 : 0.5 [9]유진*과 1의 거리 : 5.706356105256663 [9]최진*과 1의 거리 : 5.006246098625197 [9]김성*과 2의 거리 : 10.111874208078342 0, <32.5,320.0> 1, <28.25,305.0> 2, <33.5,360.0> [9]김진*과 2의 거리 : 6.25 [9]박동*과 0의 거리 : 10.111874208078342 [9]유용*과 2의 거리 : 5.153882032022076 [9]노찬*과 1의 거리 : 0.5 [9]이태*과 2의 거리 : 5.482928049865327 [9]유진*과 2의 거리 : 5.006246098625197 [9]최진*과 1의 거리 : 0.5 [9]김성*과 0의 거리 : 10.111874208078342 0, <33.5,360.0> 1, <27.5,300.0> 2, <30.75,315.0>
  24. 24. 군집화(클러스터링) K-Means 알고리즘 280 290 300 310 320 330 340 350 360 370 380 25 26 27 28 29 30 31 32 33 34 35 36 나이/소득 [9]김진*과 2의 거리 : 6.25 [9]박동*과 0의 거리 : 10.111874208078342 [9]유용*과 2의 거리 : 5.153882032022076 [9]노찬*과 1의 거리 : 0.5 [9]이태*과 2의 거리 : 5.482928049865327 [9]유진*과 2의 거리 : 5.006246098625197 [9]최진*과 1의 거리 : 0.5 [9]김성*과 0의 거리 : 10.111874208078342 0, <33.5,360.0> 1, <27.5,300.0> 2, <30.75,315.0> [9]김진*과 1의 거리 : 5.153882032022076 [9]박동*과 2의 거리 : 10.111874208078342 [9]유용*과 0의 거리 : 0.5 [9]노찬*과 1의 거리 : 5.153882032022076 [9]이태*과 0의 거리 : 0.5 [9]유진*과 1의 거리 : 5.706356105256663 [9]최진*과 1의 거리 : 5.006246098625197 [9]김성*과 2의 거리 : 10.111874208078342 0, <32.5,320.0> 1, <28.25,305.0> 2, <33.5,360.0> 280 290 300 310 320 330 340 350 360 370 380 25 26 27 28 29 30 31 32 33 34 35 36 나이/소득
  25. 25. 군집화(클러스터링) K-Means 알고리즘 280 290 300 310 320 330 340 350 360 370 380 25 26 27 28 29 30 31 32 33 34 35 36 나이/소득 [9]김진*과 1의 거리 : 5.153882032022076 [9]박동*과 2의 거리 : 10.111874208078342 [9]유용*과 0의 거리 : 0.5 [9]노찬*과 1의 거리 : 5.153882032022076 [9]이태*과 0의 거리 : 0.5 [9]유진*과 1의 거리 : 5.706356105256663 [9]최진*과 1의 거리 : 5.006246098625197 [9]김성*과 2의 거리 : 10.111874208078342 0, <32.5,320.0> 1, <28.25,305.0> 2, <33.5,360.0> 얘는 왜 빨간 것이 아닌 파란 것에 속하는 걸까? X, Y 값들의 단위 차이로 인한 착시 현상 X (나이) – 28, 29, 30, … , n Y (급여) – 280, 290, 310, … , n*10
  26. 26. 군집화(클러스터링) K-Means 알고리즘 280 290 300 310 320 330 340 350 360 370 380 25 26 27 28 29 30 31 32 33 34 35 36 • 새로운 객체는 가장 가까운 중심점을 가진 클러스터 K로 분류 • 새로운 객체을 포함된 클러스터의 중심은 변경 되므로 재계산 <끝>
  27. 27. 군집화(클러스터링) K-NN, K-Means 알고리즘 단점 1. K-NN, K-Means 단점 • In Memory-based 알고리즘 • 모든 객체들 간 거리 계산으로 인한 부하 발생 • 빅데이터 처리에 불리 2. K-Means 단점 • K-Means는 초기 중심점 설정이 최종 분류에 큰 영향을 끼침 • 평균값 계산시 이상치(Outlier) 데이터가 미치는 영향이 크다. • 클러스터링 단위로 거리값을 이용하여 군집 형태가 ‘원‘ 형태로 원에 속하지 못하는 데이터는 외면 받음
  28. 28. 군집화(클러스터링) 빅데이터 추천 시스템에서는 MIN-HASH 알고리즘 대세 1. MIN-HASH 알고리즘 • Google News Personalization: Scalable Online Collaborative Filtering (2007) • 다른 데이터라도 동일한 해쉬 값이 발생 (충돌) 고의적으로 발생시킨다면? • 두 객체가 가까운 거리에 있을 수록 해쉬 값 충돌 확률을 높이자! • 차원이 축약된 자카드 거리와 원 객체들의 자카드 거리는 확률적 비슷 • ℎ_𝑚𝑖𝑛 𝐴 : A 집합의 요소들을 해쉬 함수로 축약한 뒤 가장 작은 값을 추출 ·Jaccard Similarity (𝐴, 𝐵) = 𝐴∩𝐵 𝐴∪𝐵 · P ℎ_𝑚𝑖𝑛 𝐴 = ℎ_𝑚𝑖𝑛(𝐵) = P ℎ 𝐴 ∪ 𝐵 in ℎ 𝐴 ∩ 𝐵 ) = 𝐴∩𝐵 𝐴∪𝐵 ∵ P ℎ_𝑚𝑖𝑛 𝐴 = ℎ_𝑚𝑖𝑛(𝐵) = Jarcard Similarity (𝐴, 𝐵) 출처 : http://robertheaton.com/2014/05/02/jaccard- similarity-and-minhash-for-winners/
  29. 29. 군집화(클러스터링) MIN-HASH 알고리즘 1. 클러스터 ID 생성 (p개 해쉬 함수 선정) • 대상 객체가 가지는 요소들을 ℎ 𝑝(𝑥) 함수로 이용하여 계산  이분법의 참(1)/거짓(0) 기록일 경우  ℎ 𝑝 𝑥 = 𝑎𝑥 + 𝑏 mod 𝑁 • ℎ 𝑝(𝑥) 로 계산된 요소들의 해쉬값들 중 가장 작은 값이 min ℎ𝑎𝑠ℎ 𝑝(𝐴) • p번 min ℎ𝑎𝑠ℎ 𝑝(𝐴) 계산의 결과 값들을 이어 붙이면 GROUP ID 생성 • p 개수가 커질 수록 정확도(precision)는 커지나 재현률(recall)은 떨어짐 2. 위 과정을 q번을 반복하면, 클러스터 ID는 최대 q개가 생성 • 한 명의 사용자가 최대 q개의 다른 그룹에 속할 수 있음 • 각각의 사용자들이 확률적으로 유사한 그룹에 묶이게 됨
  30. 30. 군집화(클러스터링) MIN-HASH 알고리즘 1. 사용자들의 업종별 사용내역 MIN-HASH 클러스터링 • 해쉬 함수 선정 (p=2, q=2) • [q=1, p=1] ℎ1 𝑥 = 3𝑥 + 5 mod 17 • [q=1, p=2] ℎ2 𝑥 = 5𝑥 + 2 mod 23 • [q=2, p=1] ℎ3 𝑥 = 𝑥 + 7 mod 11 • [q=2, p=2] ℎ4 𝑥 = 7𝑥 + 3 mod 13 • 사용자 업종별 사용 내역 고객번호 업종코드 사용내역 1000001 4005 4096 4097 4098 4099 7061 7062 8200 8500 9000 1000002 4096 4097 4098 7062 8200 9000 1000003 4098 4099 7061 7062 8200 8500 1000004 4048 4049 4098 4099 1000005 4005 4096 8500 9000 1000006 4501 7061 7062 8200 9999 1000007 4056 4096 4100 4200 4300 4500 1000008 4500 4501 4502 4600 4700 4800 1000009 4910 7062 8200 9999
  31. 31. 군집화(클러스터링) MIN-HASH 알고리즘 1. 사용자들의 업종별 사용내역 MIN-HASH 클러스터링 • [q=1, p=1] ℎ1 𝑥 = 3𝑥 + 5 mod 17 • [q=1, p=2] ℎ2 𝑥 = 5𝑥 + 2 mod 23 고객번호 업종코드 사용내역 1000001 1 2 5 8 11 6 9 6 5 9 1000002 2 5 8 9 6 9 1000003 8 11 6 9 6 1000004 11 14 8 11 1000005 1 2 5 9 1000006 10 6 9 6 14 1000007 1 2 14 8 2 7 1000008 7 10 13 1 12 6 1000009 13 9 6 14 고객번호 업종코드 사용내역 1000001 17 12 17 22 4 2 7 16 21 14 1000002 12 17 22 7 16 14 1000003 22 4 2 7 16 21 1000004 2 7 22 4 1000005 17 12 21 14 1000006 13 2 7 16 18 1000007 19 12 9 3 20 8 1000008 8 13 18 2 19 13 1000009 11 7 16 18 0002 0001 고객번호 1000001의 GROUP ID 00010002
  32. 32. 군집화(클러스터링) MIN-HASH 알고리즘 1. 사용자들의 업종별 사용내역 MIN-HASH 클러스터링 • [q=1, p=1] ℎ1 𝑥 = 3𝑥 + 5 mod 17 • [q=1, p=2] ℎ2 𝑥 = 5𝑥 + 2 mod 23 • [q=2, p=1] ℎ3 𝑥 = 2𝑥 + 8 mod 11 • [q=2, p=2] ℎ4 𝑥 = 7𝑥 + 3 mod 13 고객번호 q=1 그룹 ID 1000001 00010002 1000002 00020007 1000003 00060002 1000004 00080002 1000005 00010012 1000006 00060002 1000007 00010003 1000008 00010002 1000009 00060007 고객번호 q=2 그룹 ID 1000001 00000002 1000002 00010004 1000003 00000002 1000004 00000005 1000005 00010002 1000006 00010004 1000007 00020003 1000008 00010000 1000009 00050001 그룹ID 고객번호 00000002 1000001 1000003 00000005 1000004 00010000 1000008 00010002 1000001 1000008 1000005 00010003 1000007 00010004 1000002 1000006 00010012 1000005 00020003 1000007 00020007 1000002 00050001 1000009 00060002 1000003 1000006 00060007 1000009 00080002 1000004
  33. 33. 군집화(클러스터링) MIN-HASH 알고리즘 그룹ID 고객번호 00000002 1000001 1000003 00010002 1000001 1000008 1000005 00010004 1000002 1000006 00060002 1000003 1000006 고객번호 업종코드 사용내역 1000001 4005 4096 4097 4098 4099 7061 7062 8200 8500 9000 1000002 4096 4097 4098 7062 8200 9000 1000003 4098 4099 7061 7062 8200 8500 1000004 4048 4049 4098 4099 1000005 4005 4096 8500 9000 1000006 4501 7061 7062 8200 9999 1000007 4056 4096 4100 4200 4300 4500 1000008 4500 4501 4502 4600 4700 4800 1000009 4910 7062 8200 9999 • MIN-HASH 클러스터링 특징 1. 확률 기반한 군집이므로 정확률보다 재현률에 더 의존 2. 군집 이후 각 고객간의 유사도 계산이 포함된다면 정확률 향상 3. 하둡을 이용한 빅데이터를 분류할 때 • Mapper에게 각 객체들의 q번의 클러스터 ID 계산 • Reducer에게 클러스터 ID별로 정렬 후 저장
  34. 34. Mahout 설치 1) Mahout 0.9 다운로드 http://mahout.apache.org 접속 후 다운로드 2) 계정 홈 디렉토리로 mv $ mv mahout-distribution-0.9.tar.gz ~ 3) 압축을 풀고 mahout 심볼릭 링크를 생성 $ ln -s mahout-distribution-0.9 mahout 4) .bash_profile에 MAHOUT_HOME과 PATH 추가 1 # .bash_profile 2 3 # Get the aliases and functions 4 if [ -f ~/.bashrc ]; then 5 . ~/.bashrc 6 fi 7 8 # User specific environment and startup programs 9 10 export JAVA_HOME=$HOME/java 11 export HADOOP_HOME=$HOME/hadoop 12 export PYTHON_HOME=$HOME/python 13 export MAHOUT_HOME=$HOME/mahout 14 15 PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PYTHON_HOME/:$MAHOUT_HOME/bin 16 17 export PATH
  35. 35. Q&A

×