2. 빅데이터 분석 기술
이미지 출처 : http://www.saltlux.com/bigdata-analysis-overview/
3. 빅데이터 분석 기술
이번 시간에 살짝 다룰 기술 도메인
이미지 출처 : http://www.saltlux.com/bigdata-analysis-overview/
4. 빅데이터 분석 기술
유사도 매칭과 군집화
1. 유사도 매칭 (Similarity Matching)
• 알려진 데이터에 기반해 비슷한 개체를 찾아냄
• 유사도 매칭은 고객에게 제품을 추천할 때 사용하는 가장 인기 있는 방법 중 하나
• 선호하거나 구매한 제품의 관점에서 현재 고객과 유사한 사람을 찾아낼 수 있음
• 분류, 회귀 분석, 군집화와 같은 여러 데이터 마이닝 작업을 해결하기 위한 기반
2. 군집화 (Clustering)
• “우리 고객들이 자연스럽게 그룹으로 묶이는가?”
• 특정 목적이 없는 상태에서 유사도에 따라 개체를 묶는다.
• 군집화는 문제 영역의 기초 조사를 수행할 때 어떤 그룹이 자연스럽게 만들어지는지 알림
• 그룹이 존재한다면 다른 데이터마이닝 작업을 해볼 필요가 있다는 것을 의미
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/
목표 객체 참여 불참
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 클러스터에 포함된 클러스터 중심을 재계산
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
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개의 다른 그룹에 속할 수 있음
• 각각의 사용자들이 확률적으로 유사한 그룹에 묶이게 됨