SlideShare ist ein Scribd-Unternehmen logo
1 von 35
Downloaden Sie, um offline zu lesen
빅데이터
실전기술
IT가맹점개발팀
이태영
2014.12.16
8번째 스터디
유사도 및 군집화
빅데이터 분석 기술
이미지 출처 : http://www.saltlux.com/bigdata-analysis-overview/
빅데이터 분석 기술
이번 시간에 살짝 다룰 기술 도메인
이미지 출처 : http://www.saltlux.com/bigdata-analysis-overview/
빅데이터 분석 기술
유사도 매칭과 군집화
1. 유사도 매칭 (Similarity Matching)
• 알려진 데이터에 기반해 비슷한 개체를 찾아냄
• 유사도 매칭은 고객에게 제품을 추천할 때 사용하는 가장 인기 있는 방법 중 하나
• 선호하거나 구매한 제품의 관점에서 현재 고객과 유사한 사람을 찾아낼 수 있음
• 분류, 회귀 분석, 군집화와 같은 여러 데이터 마이닝 작업을 해결하기 위한 기반
2. 군집화 (Clustering)
• “우리 고객들이 자연스럽게 그룹으로 묶이는가?”
• 특정 목적이 없는 상태에서 유사도에 따라 개체를 묶는다.
• 군집화는 문제 영역의 기초 조사를 수행할 때 어떤 그룹이 자연스럽게 만들어지는지 알림
• 그룹이 존재한다면 다른 데이터마이닝 작업을 해볼 필요가 있다는 것을 의미
유사도 매칭
유클리디안 거리(Euclidean distance)
(𝑥 𝐴, 𝑦 𝐴)
(𝑥 𝐵, 𝑦 𝐵)
𝑥 𝐵 − 𝑥 𝐴
𝑦 𝐵 − 𝑦 𝐴
distance(A,B) =
(𝑥 𝐵 − 𝑥 𝐴)2+(𝑦 𝐵 − 𝑦 𝐴)2
B
A
m차원 공간
distance(A,B) = (𝑑1,𝐴 − 𝑑1,𝐵)2+(𝑑2,𝐴 − 𝑑2,𝐵)2+(𝑑3,𝐴 − 𝑑3,𝐵)2+ ⋯ + (𝑑 𝑚,𝐴 − 𝑑 𝑚,𝐵)2
유사도 매칭
K-NN(Nearest neighbor) 알고리즘
• 가장 가까운 k개의 객체들 중 가장 많은 특징으로 판단
• k = 3의 경우, 타겟 객체는 녹색으로 판단
• k = 7의 경우, 타겟 객체는 파랑으로 판단
Target Object
K=3
K=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
유사도 매칭
K-NN(Nearest neighbor) 알고리즘
• 노찬*은 타켓마케팅을 통해 모바일쿠폰 발급에 참여할 고객인가?
참고 : http://www.highcharts.com/
구현 : http://jsfiddle.net/seen/0602nb3a/
목표 객체 참여 불참
유사도 매칭
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 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 일 경우
𝑠𝑐𝑜𝑟𝑒 𝑐, 𝑁 = ෍
𝑦∈𝑁
𝑤 𝑥, 𝑦 × [𝑐𝑙𝑎𝑠𝑠 𝑦 = 𝑐 ]
유사도 매칭
K-NN(Nearest neighbor) 알고리즘
• 다수결 투표
𝑤 𝑥, 𝑦 =
1
𝑑𝑖𝑠𝑡(𝑥, 𝑦)2
• 유사도 반영 투표 (Similarity-Moderated Voting)
𝑐 𝑥 = arg max 𝑠𝑐𝑜𝑟𝑒(𝑐, 𝑛𝑒𝑖𝑔ℎ𝑏𝑜𝑟𝑠 𝑥 )
𝒏𝒆𝒊𝒈𝒉𝒃𝒐𝒓𝒔 𝒙 는 x 객체의 최근접 이웃 k개 반환, 𝐚𝐫𝐠 𝒎𝒂𝒙 는 score의 최대값을 반환
w()는 x 와 y 간의 유사도에 기반한 가중치 함수이므로, 유클리디안 거리 제곱의 역수가 사용
유사도 매칭
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
유사도 매칭
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
유사도 매칭
두 객체간 유사도 : 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
유사도 매칭
두 객체간 유사도 : 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 추출 스크립트
유사도 매칭
두 객체간 유사도 : 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();
}
유사도 매칭
두 객체간 유사도 : 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();
}
유사도 매칭
두 객체간 유사도 : 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();
}
유사도 매칭
두 객체간 유사도 : 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
군집화(클러스터링)
K-Means 알고리즘
• K는 데이터들 중에서 찾아내려는 군집의 수
1. k개의 임의 위치에 클러스터 중심 할당
2. k개의 클러스터 중심이 바뀌지 않을 때까지 반복 :
① 모든 객체들은 k개 클러스터 중심과 거리 계산
② 계산된 객체는 가장 가까운 k 클러스터로 포함
③ 각각의 k 클러스터에 포함된 클러스터 중심을 재계산
군집화(클러스터링)
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
나이/소득
군집화(클러스터링)
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
군집화(클러스터링)
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>
군집화(클러스터링)
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
나이/소득
군집화(클러스터링)
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
군집화(클러스터링)
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로 분류
• 새로운 객체을 포함된 클러스터의 중심은 변경 되므로 재계산 <끝>
군집화(클러스터링)
K-NN, K-Means 알고리즘 단점
1. K-NN, K-Means 단점
• In Memory-based 알고리즘
• 모든 객체들 간 거리 계산으로 인한 부하 발생
• 빅데이터 처리에 불리
2. K-Means 단점
• K-Means는 초기 중심점 설정이 최종 분류에 큰 영향을 끼침
• 평균값 계산시 이상치(Outlier) 데이터가 미치는 영향이 크다.
• 클러스터링 단위로 거리값을 이용하여 군집 형태가 ‘원‘ 형태로
원에 속하지 못하는 데이터는 외면 받음
군집화(클러스터링)
빅데이터 추천 시스템에서는 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/
군집화(클러스터링)
MIN-HASH 알고리즘
1. 클러스터 ID 생성 (p개 해쉬 함수 선정)
• 대상 객체가 가지는 요소들을 ℎ 𝑝(𝑥) 함수로 이용하여 계산
 이분법의 참(1)/거짓(0) 기록일 경우
 ℎ 𝑝 𝑥 = 𝑎𝑥 + 𝑏 mod 𝑁
• ℎ 𝑝(𝑥) 로 계산된 요소들의 해쉬값들 중 가장 작은 값이 min ℎ𝑎𝑠ℎ 𝑝(𝐴)
• p번 min ℎ𝑎𝑠ℎ 𝑝(𝐴) 계산의 결과 값들을 이어 붙이면 GROUP ID 생성
• p 개수가 커질 수록 정확도(precision)는 커지나 재현률(recall)은 떨어짐
2. 위 과정을 q번을 반복하면, 클러스터 ID는 최대 q개가 생성
• 한 명의 사용자가 최대 q개의 다른 그룹에 속할 수 있음
• 각각의 사용자들이 확률적으로 유사한 그룹에 묶이게 됨
군집화(클러스터링)
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
군집화(클러스터링)
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
군집화(클러스터링)
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
군집화(클러스터링)
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별로 정렬 후 저장
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
Q&A

Weitere ähnliche Inhalte

Was ist angesagt?

Aho-Corasick Algorithm(아호 코라식 알고리즘)
Aho-Corasick Algorithm(아호 코라식 알고리즘)Aho-Corasick Algorithm(아호 코라식 알고리즘)
Aho-Corasick Algorithm(아호 코라식 알고리즘)Hongjun Jang
 
Memory efficient pytorch
Memory efficient pytorchMemory efficient pytorch
Memory efficient pytorchHyungjoo Cho
 
오토인코더의 모든 것
오토인코더의 모든 것오토인코더의 모든 것
오토인코더의 모든 것NAVER Engineering
 
책 읽어주는 딥러닝: 배우 유인나가 해리포터를 읽어준다면 DEVIEW 2017
책 읽어주는 딥러닝: 배우 유인나가 해리포터를 읽어준다면 DEVIEW 2017책 읽어주는 딥러닝: 배우 유인나가 해리포터를 읽어준다면 DEVIEW 2017
책 읽어주는 딥러닝: 배우 유인나가 해리포터를 읽어준다면 DEVIEW 2017Taehoon Kim
 
미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용
미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용
미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용NAVER Engineering
 
추천시스템 구축을 위한 빅데이터 분석기법과 사례
추천시스템 구축을 위한 빅데이터 분석기법과 사례추천시스템 구축을 위한 빅데이터 분석기법과 사례
추천시스템 구축을 위한 빅데이터 분석기법과 사례HELENA LEE
 
Pyqgis 기초편
Pyqgis 기초편Pyqgis 기초편
Pyqgis 기초편Jiyoon Kim
 
Network embedding
Network embeddingNetwork embedding
Network embeddingSOYEON KIM
 
상상을 현실로 만드는, 이미지 생성 모델을 위한 엔지니어링
상상을 현실로 만드는, 이미지 생성 모델을 위한 엔지니어링상상을 현실로 만드는, 이미지 생성 모델을 위한 엔지니어링
상상을 현실로 만드는, 이미지 생성 모델을 위한 엔지니어링Taehoon Kim
 
파이썬을 활용한 웹 크롤링
파이썬을 활용한 웹 크롤링파이썬을 활용한 웹 크롤링
파이썬을 활용한 웹 크롤링HWANGTAEYONG
 
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기CONNECT FOUNDATION
 
[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
[Pgday.Seoul 2018]  이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG[Pgday.Seoul 2018]  이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PGPgDay.Seoul
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성NAVER D2
 
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019Kenneth Ceyer
 
인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템NAVER D2
 
[Pgday.Seoul 2017] 6. GIN vs GiST 인덱스 이야기 - 박진우
[Pgday.Seoul 2017] 6. GIN vs GiST 인덱스 이야기 - 박진우[Pgday.Seoul 2017] 6. GIN vs GiST 인덱스 이야기 - 박진우
[Pgday.Seoul 2017] 6. GIN vs GiST 인덱스 이야기 - 박진우PgDay.Seoul
 
딥러닝 기반 자연어 언어모델 BERT
딥러닝 기반 자연어 언어모델 BERT딥러닝 기반 자연어 언어모델 BERT
딥러닝 기반 자연어 언어모델 BERTSeonghyun Kim
 
[226]대용량 텍스트마이닝 기술 하정우
[226]대용량 텍스트마이닝 기술 하정우[226]대용량 텍스트마이닝 기술 하정우
[226]대용량 텍스트마이닝 기술 하정우NAVER D2
 

Was ist angesagt? (20)

Aho-Corasick Algorithm(아호 코라식 알고리즘)
Aho-Corasick Algorithm(아호 코라식 알고리즘)Aho-Corasick Algorithm(아호 코라식 알고리즘)
Aho-Corasick Algorithm(아호 코라식 알고리즘)
 
Memory efficient pytorch
Memory efficient pytorchMemory efficient pytorch
Memory efficient pytorch
 
오토인코더의 모든 것
오토인코더의 모든 것오토인코더의 모든 것
오토인코더의 모든 것
 
책 읽어주는 딥러닝: 배우 유인나가 해리포터를 읽어준다면 DEVIEW 2017
책 읽어주는 딥러닝: 배우 유인나가 해리포터를 읽어준다면 DEVIEW 2017책 읽어주는 딥러닝: 배우 유인나가 해리포터를 읽어준다면 DEVIEW 2017
책 읽어주는 딥러닝: 배우 유인나가 해리포터를 읽어준다면 DEVIEW 2017
 
미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용
미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용
미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용
 
추천시스템 구축을 위한 빅데이터 분석기법과 사례
추천시스템 구축을 위한 빅데이터 분석기법과 사례추천시스템 구축을 위한 빅데이터 분석기법과 사례
추천시스템 구축을 위한 빅데이터 분석기법과 사례
 
Pyqgis 기초편
Pyqgis 기초편Pyqgis 기초편
Pyqgis 기초편
 
Network embedding
Network embeddingNetwork embedding
Network embedding
 
상상을 현실로 만드는, 이미지 생성 모델을 위한 엔지니어링
상상을 현실로 만드는, 이미지 생성 모델을 위한 엔지니어링상상을 현실로 만드는, 이미지 생성 모델을 위한 엔지니어링
상상을 현실로 만드는, 이미지 생성 모델을 위한 엔지니어링
 
파이썬을 활용한 웹 크롤링
파이썬을 활용한 웹 크롤링파이썬을 활용한 웹 크롤링
파이썬을 활용한 웹 크롤링
 
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
 
WEB Scraping.pptx
WEB Scraping.pptxWEB Scraping.pptx
WEB Scraping.pptx
 
PostGIS 시작하기
PostGIS 시작하기PostGIS 시작하기
PostGIS 시작하기
 
[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
[Pgday.Seoul 2018]  이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG[Pgday.Seoul 2018]  이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성
 
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
 
인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템
 
[Pgday.Seoul 2017] 6. GIN vs GiST 인덱스 이야기 - 박진우
[Pgday.Seoul 2017] 6. GIN vs GiST 인덱스 이야기 - 박진우[Pgday.Seoul 2017] 6. GIN vs GiST 인덱스 이야기 - 박진우
[Pgday.Seoul 2017] 6. GIN vs GiST 인덱스 이야기 - 박진우
 
딥러닝 기반 자연어 언어모델 BERT
딥러닝 기반 자연어 언어모델 BERT딥러닝 기반 자연어 언어모델 BERT
딥러닝 기반 자연어 언어모델 BERT
 
[226]대용량 텍스트마이닝 기술 하정우
[226]대용량 텍스트마이닝 기술 하정우[226]대용량 텍스트마이닝 기술 하정우
[226]대용량 텍스트마이닝 기술 하정우
 

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

대학원생 소셜 네트워크 & 통계 분석 서비스
대학원생 소셜 네트워크 & 통계 분석 서비스 대학원생 소셜 네트워크 & 통계 분석 서비스
대학원생 소셜 네트워크 & 통계 분석 서비스 NSGroup
 
2시간만에 자바 데이터처리를 쉽게 배우고 싶어요.
2시간만에  자바 데이터처리를 쉽게 배우고 싶어요.2시간만에  자바 데이터처리를 쉽게 배우고 싶어요.
2시간만에 자바 데이터처리를 쉽게 배우고 싶어요.Kenu, GwangNam Heo
 
[20150829, PyCon2015] NetworkX를 이용한 네트워크 링크 예측
[20150829, PyCon2015] NetworkX를 이용한 네트워크 링크 예측[20150829, PyCon2015] NetworkX를 이용한 네트워크 링크 예측
[20150829, PyCon2015] NetworkX를 이용한 네트워크 링크 예측Kyunghoon Kim
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기Jongwook Choi
 
Fraud Detection - online game 과 결제를 중심으로
Fraud Detection - online game 과 결제를 중심으로Fraud Detection - online game 과 결제를 중심으로
Fraud Detection - online game 과 결제를 중심으로NAVER Engineering
 
생체 광학 데이터 분석 AI 경진대회 3위 수상작
생체 광학 데이터 분석 AI 경진대회 3위 수상작생체 광학 데이터 분석 AI 경진대회 3위 수상작
생체 광학 데이터 분석 AI 경진대회 3위 수상작DACON AI 데이콘
 
알파고 풀어보기 / Alpha Technical Review
알파고 풀어보기 / Alpha Technical Review알파고 풀어보기 / Alpha Technical Review
알파고 풀어보기 / Alpha Technical Review상은 박
 
Clustering for graduate course in Sogang university
Clustering for graduate course in Sogang universityClustering for graduate course in Sogang university
Clustering for graduate course in Sogang universityHoSung Park
 
데이터분석의 길 5: “고수는 큰자료를 두려워하지 않는다” (클릭확률예측 상편)
데이터분석의 길 5:  “고수는 큰자료를 두려워하지 않는다” (클릭확률예측 상편)데이터분석의 길 5:  “고수는 큰자료를 두려워하지 않는다” (클릭확률예측 상편)
데이터분석의 길 5: “고수는 큰자료를 두려워하지 않는다” (클릭확률예측 상편)Jaimie Kwon (권재명)
 
[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기NAVER D2
 
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH, 케이티하이텔
 
Workshop 210417 dhlee
Workshop 210417 dhleeWorkshop 210417 dhlee
Workshop 210417 dhleeDongheon Lee
 
R 스터디 세번째
R 스터디 세번째R 스터디 세번째
R 스터디 세번째Jaeseok Park
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기OnGameServer
 
3ds maxscript 튜토리얼_20151206_서진택
3ds maxscript 튜토리얼_20151206_서진택3ds maxscript 튜토리얼_20151206_서진택
3ds maxscript 튜토리얼_20151206_서진택JinTaek Seo
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀beom kyun choi
 
[RLPR] Mastering the game of go with deep neural networks and tree search
[RLPR] Mastering the game of go with deep neural networks and tree search[RLPR] Mastering the game of go with deep neural networks and tree search
[RLPR] Mastering the game of go with deep neural networks and tree searchKorea University
 
MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)
MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)
MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)주영 송
 
제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [#인스타툰 팀] : 해시태그 기반 인스타툰 추천 챗봇
제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [#인스타툰 팀] : 해시태그 기반 인스타툰 추천 챗봇제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [#인스타툰 팀] : 해시태그 기반 인스타툰 추천 챗봇
제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [#인스타툰 팀] : 해시태그 기반 인스타툰 추천 챗봇BOAZ Bigdata
 

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

대학원생 소셜 네트워크 & 통계 분석 서비스
대학원생 소셜 네트워크 & 통계 분석 서비스 대학원생 소셜 네트워크 & 통계 분석 서비스
대학원생 소셜 네트워크 & 통계 분석 서비스
 
2시간만에 자바 데이터처리를 쉽게 배우고 싶어요.
2시간만에  자바 데이터처리를 쉽게 배우고 싶어요.2시간만에  자바 데이터처리를 쉽게 배우고 싶어요.
2시간만에 자바 데이터처리를 쉽게 배우고 싶어요.
 
[20150829, PyCon2015] NetworkX를 이용한 네트워크 링크 예측
[20150829, PyCon2015] NetworkX를 이용한 네트워크 링크 예측[20150829, PyCon2015] NetworkX를 이용한 네트워크 링크 예측
[20150829, PyCon2015] NetworkX를 이용한 네트워크 링크 예측
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
Fraud Detection - online game 과 결제를 중심으로
Fraud Detection - online game 과 결제를 중심으로Fraud Detection - online game 과 결제를 중심으로
Fraud Detection - online game 과 결제를 중심으로
 
생체 광학 데이터 분석 AI 경진대회 3위 수상작
생체 광학 데이터 분석 AI 경진대회 3위 수상작생체 광학 데이터 분석 AI 경진대회 3위 수상작
생체 광학 데이터 분석 AI 경진대회 3위 수상작
 
알파고 풀어보기 / Alpha Technical Review
알파고 풀어보기 / Alpha Technical Review알파고 풀어보기 / Alpha Technical Review
알파고 풀어보기 / Alpha Technical Review
 
Clustering for graduate course in Sogang university
Clustering for graduate course in Sogang universityClustering for graduate course in Sogang university
Clustering for graduate course in Sogang university
 
데이터분석의 길 5: “고수는 큰자료를 두려워하지 않는다” (클릭확률예측 상편)
데이터분석의 길 5:  “고수는 큰자료를 두려워하지 않는다” (클릭확률예측 상편)데이터분석의 길 5:  “고수는 큰자료를 두려워하지 않는다” (클릭확률예측 상편)
데이터분석의 길 5: “고수는 큰자료를 두려워하지 않는다” (클릭확률예측 상편)
 
[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기
 
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
 
Workshop 210417 dhlee
Workshop 210417 dhleeWorkshop 210417 dhlee
Workshop 210417 dhlee
 
R 스터디 세번째
R 스터디 세번째R 스터디 세번째
R 스터디 세번째
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
 
3ds maxscript 튜토리얼_20151206_서진택
3ds maxscript 튜토리얼_20151206_서진택3ds maxscript 튜토리얼_20151206_서진택
3ds maxscript 튜토리얼_20151206_서진택
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
 
[RLPR] Mastering the game of go with deep neural networks and tree search
[RLPR] Mastering the game of go with deep neural networks and tree search[RLPR] Mastering the game of go with deep neural networks and tree search
[RLPR] Mastering the game of go with deep neural networks and tree search
 
분석6기 4조
분석6기 4조분석6기 4조
분석6기 4조
 
MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)
MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)
MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)
 
제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [#인스타툰 팀] : 해시태그 기반 인스타툰 추천 챗봇
제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [#인스타툰 팀] : 해시태그 기반 인스타툰 추천 챗봇제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [#인스타툰 팀] : 해시태그 기반 인스타툰 추천 챗봇
제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [#인스타툰 팀] : 해시태그 기반 인스타툰 추천 챗봇
 

Mehr von Tae Young Lee

파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)Tae Young Lee
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) Tae Young Lee
 
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)Tae Young Lee
 
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영Tae Young Lee
 
20150306 파이썬기초 IPython을이용한프로그래밍_이태영
20150306 파이썬기초 IPython을이용한프로그래밍_이태영20150306 파이썬기초 IPython을이용한프로그래밍_이태영
20150306 파이썬기초 IPython을이용한프로그래밍_이태영Tae Young Lee
 
20141223 머하웃(mahout) 협업필터링_추천시스템구현
20141223 머하웃(mahout) 협업필터링_추천시스템구현20141223 머하웃(mahout) 협업필터링_추천시스템구현
20141223 머하웃(mahout) 협업필터링_추천시스템구현Tae Young Lee
 
20141111 파이썬으로 Hadoop MR프로그래밍
20141111 파이썬으로 Hadoop MR프로그래밍20141111 파이썬으로 Hadoop MR프로그래밍
20141111 파이썬으로 Hadoop MR프로그래밍Tae Young Lee
 
20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제Tae Young Lee
 

Mehr von Tae Young Lee (8)

파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
 
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
 
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
 
20150306 파이썬기초 IPython을이용한프로그래밍_이태영
20150306 파이썬기초 IPython을이용한프로그래밍_이태영20150306 파이썬기초 IPython을이용한프로그래밍_이태영
20150306 파이썬기초 IPython을이용한프로그래밍_이태영
 
20141223 머하웃(mahout) 협업필터링_추천시스템구현
20141223 머하웃(mahout) 협업필터링_추천시스템구현20141223 머하웃(mahout) 협업필터링_추천시스템구현
20141223 머하웃(mahout) 협업필터링_추천시스템구현
 
20141111 파이썬으로 Hadoop MR프로그래밍
20141111 파이썬으로 Hadoop MR프로그래밍20141111 파이썬으로 Hadoop MR프로그래밍
20141111 파이썬으로 Hadoop MR프로그래밍
 
20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제
 

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

  • 2. 빅데이터 분석 기술 이미지 출처 : http://www.saltlux.com/bigdata-analysis-overview/
  • 3. 빅데이터 분석 기술 이번 시간에 살짝 다룰 기술 도메인 이미지 출처 : http://www.saltlux.com/bigdata-analysis-overview/
  • 4. 빅데이터 분석 기술 유사도 매칭과 군집화 1. 유사도 매칭 (Similarity Matching) • 알려진 데이터에 기반해 비슷한 개체를 찾아냄 • 유사도 매칭은 고객에게 제품을 추천할 때 사용하는 가장 인기 있는 방법 중 하나 • 선호하거나 구매한 제품의 관점에서 현재 고객과 유사한 사람을 찾아낼 수 있음 • 분류, 회귀 분석, 군집화와 같은 여러 데이터 마이닝 작업을 해결하기 위한 기반 2. 군집화 (Clustering) • “우리 고객들이 자연스럽게 그룹으로 묶이는가?” • 특정 목적이 없는 상태에서 유사도에 따라 개체를 묶는다. • 군집화는 문제 영역의 기초 조사를 수행할 때 어떤 그룹이 자연스럽게 만들어지는지 알림 • 그룹이 존재한다면 다른 데이터마이닝 작업을 해볼 필요가 있다는 것을 의미
  • 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. 유사도 매칭 K-NN(Nearest neighbor) 알고리즘 • 가장 가까운 k개의 객체들 중 가장 많은 특징으로 판단 • k = 3의 경우, 타겟 객체는 녹색으로 판단 • k = 7의 경우, 타겟 객체는 파랑으로 판단 Target Object K=3 K=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. 유사도 매칭 K-NN(Nearest neighbor) 알고리즘 • 노찬*은 타켓마케팅을 통해 모바일쿠폰 발급에 참여할 고객인가? 참고 : http://www.highcharts.com/ 구현 : http://jsfiddle.net/seen/0602nb3a/ 목표 객체 참여 불참
  • 9. 유사도 매칭 K-NN(Nearest neighbor) 알고리즘 목표 객체 참여 불참 𝑑 𝐴, 𝐵 = (𝑥 𝐵 − 𝑥 𝐴)2+(𝑦 𝐵 − 𝑦 𝐴)2+(𝑧 𝐵 − 𝑧 𝐴)2
  • 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. 𝑠𝑐𝑜𝑟𝑒 𝑐, 𝑁 = ෍ 𝑦∈𝑁 𝑤 𝑥, 𝑦 × [𝑐𝑙𝑎𝑠𝑠 𝑦 = 𝑐 ] 유사도 매칭 K-NN(Nearest neighbor) 알고리즘 • 다수결 투표 𝑤 𝑥, 𝑦 = 1 𝑑𝑖𝑠𝑡(𝑥, 𝑦)2 • 유사도 반영 투표 (Similarity-Moderated Voting) 𝑐 𝑥 = arg max 𝑠𝑐𝑜𝑟𝑒(𝑐, 𝑛𝑒𝑖𝑔ℎ𝑏𝑜𝑟𝑠 𝑥 ) 𝒏𝒆𝒊𝒈𝒉𝒃𝒐𝒓𝒔 𝒙 는 x 객체의 최근접 이웃 k개 반환, 𝐚𝐫𝐠 𝒎𝒂𝒙 는 score의 최대값을 반환 w()는 x 와 y 간의 유사도에 기반한 가중치 함수이므로, 유클리디안 거리 제곱의 역수가 사용
  • 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. 유사도 매칭 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. 유사도 매칭 두 객체간 유사도 : 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. 유사도 매칭 두 객체간 유사도 : 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. 유사도 매칭 두 객체간 유사도 : 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. 유사도 매칭 두 객체간 유사도 : 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. 유사도 매칭 두 객체간 유사도 : 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. 유사도 매칭 두 객체간 유사도 : 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. 군집화(클러스터링) K-Means 알고리즘 • K는 데이터들 중에서 찾아내려는 군집의 수 1. k개의 임의 위치에 클러스터 중심 할당 2. k개의 클러스터 중심이 바뀌지 않을 때까지 반복 : ① 모든 객체들은 k개 클러스터 중심과 거리 계산 ② 계산된 객체는 가장 가까운 k 클러스터로 포함 ③ 각각의 k 클러스터에 포함된 클러스터 중심을 재계산
  • 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. 군집화(클러스터링) 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. 군집화(클러스터링) 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. 군집화(클러스터링) 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. 군집화(클러스터링) 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. 군집화(클러스터링) 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. 군집화(클러스터링) K-NN, K-Means 알고리즘 단점 1. K-NN, K-Means 단점 • In Memory-based 알고리즘 • 모든 객체들 간 거리 계산으로 인한 부하 발생 • 빅데이터 처리에 불리 2. K-Means 단점 • K-Means는 초기 중심점 설정이 최종 분류에 큰 영향을 끼침 • 평균값 계산시 이상치(Outlier) 데이터가 미치는 영향이 크다. • 클러스터링 단위로 거리값을 이용하여 군집 형태가 ‘원‘ 형태로 원에 속하지 못하는 데이터는 외면 받음
  • 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. 군집화(클러스터링) MIN-HASH 알고리즘 1. 클러스터 ID 생성 (p개 해쉬 함수 선정) • 대상 객체가 가지는 요소들을 ℎ 𝑝(𝑥) 함수로 이용하여 계산  이분법의 참(1)/거짓(0) 기록일 경우  ℎ 𝑝 𝑥 = 𝑎𝑥 + 𝑏 mod 𝑁 • ℎ 𝑝(𝑥) 로 계산된 요소들의 해쉬값들 중 가장 작은 값이 min ℎ𝑎𝑠ℎ 𝑝(𝐴) • p번 min ℎ𝑎𝑠ℎ 𝑝(𝐴) 계산의 결과 값들을 이어 붙이면 GROUP ID 생성 • p 개수가 커질 수록 정확도(precision)는 커지나 재현률(recall)은 떨어짐 2. 위 과정을 q번을 반복하면, 클러스터 ID는 최대 q개가 생성 • 한 명의 사용자가 최대 q개의 다른 그룹에 속할 수 있음 • 각각의 사용자들이 확률적으로 유사한 그룹에 묶이게 됨
  • 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. 군집화(클러스터링) 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. 군집화(클러스터링) 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. 군집화(클러스터링) 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. 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. Q&A