SlideShare a Scribd company logo
1 of 19
확률론적 자료구조들
Probabilistic data structures
스팍스 서울 티파티 2017-08
서상현
2017-08-27
웹 스팸 문제
 앞에서 꿋꿋이 걸어가던 엑셀핸드가
 난데없이 말한다 (드래곤 라자 7, 이영도)
 앞에서 꿋꿋이 걸어가던 엑셀핸드가
 강원랜드 난데없이 말한다 (어떤 스패머)
n-gram, k-mer, w-shingle
 SPARCS 3-gram
 SPA, PAR, ARC, RCS
 GAATTC 3-mer
 GAA, AAT, ATT, TTC
 2-shingle
 엑셀핸드가 난데없이 / 엑셀핸드가 강원랜드
 강원랜드 난데없이 / 난데없이 말한다
ngram
 def ngram(n, string):
 result = []
 for i in range(0, len(string) - n + 1):
 substring = string[i:i+n]
 result.append(substring)
 return result
IoU
 Intersection over Union
 | A ⋂ B | / | A ⋃ B |
 n(3, SPARCS) = SPA, PAR, ARC, RCS
 n(3, SUPARCS) = SUP, UPA, PAR, ARC, RCS
 ⋂ = ARC, PAR, RCS
 ⋃ = ARC, PAR, RCS, SPA, SUP, UPA
 IoU = 3 / 6 = 50%
iou
 def iou(n1, n2):
 s1 = set(n1)
 s2 = set(n2)
 intersection = s1 & s2
 union = s1 | s2
 return len(intersection) / len(union)
해시 함수
 h: X → [0, 2^32)
 x = y 이면 h(x) = h(y)
 x ≠ y 이면 h(x) ≠ h(y) (확률: 1 – 1/2^32)
hash
 def hash(string):
 result = 0
 for character in string:
 number = ord(character)
 result = result * 33 + number
 return result % 256
MinHash
 A와 B의 IoU를 구하는 대신
 s(X) = X의 모든 원소의 hash 중 가장 작은 k개
 s(X)는 X의 랜덤 샘플
 C = s(s(A) ⋃ s(B))는 A ⋃ B의 랜덤 샘플
 D = (A ⋂ B) ⋂ C = (s(A) ⋂ s(B)) ⋂ C
 IoU ~ |D| / |C|
minhash
 def minhash(k, seq):
 hashed = (hash(item) for item in seq)
 return nsmallest(k, hashed)
minhash_iou
 def minhash_iou(k, n1, n2):
 s1 = set(minhash(k, n1))
 s2 = set(minhash(k, n2))
 union = set(nsmallest(k, s1 | s2))
 intersection = s1 & s2 & union
 return len(intersection) / k
해 봅시다!
 n1 = ngram(3, SPARCS)
 SPA, PAR, ARC, RCS
 n2 = ngram(3, SUPARCS)
 SUP, UPA, PAR, ARC, RCS
 iou(n1, n2)
 3 / 6 = 0.5
해 봅시다!
 [hash(item) for item in n1]
 164, 3, 86, 200
 [hash(item) for item in n2]
 88, 38, 3, 86, 200
 minhash(2, n1) = 3, 86
 minhash(2, n2) = 3, 38
 minhash_iou(2, n1, n2) = 1 / 2 = 0.5
주작이 아닙니다!
KMV
 K-Minimum Values
 |A|를 구하는 대신
 s(A) = MinHash(k, A)를 구하면
 |A| ~ 2^32 / Max(s(A)) * k
 |A ⋃ B| ≠ |A| + |B|
 그러나 s(A ⋃ B) = s(s(A) ⋃ s(B))!
kmv
 def kmv(k, seq):
 s = minhash(k, seq)
 return 256 / max(s) * k
해 봅시다!
 s = sven, sanxiyn, daybreaker, nobell
 [hash(item) for item in s]
 252, 74, 122, 60
 kmv(1, s) = 256 / 60 * 1 = 4.27 ~ 4
 nobell을 빼면
 kmv(1, s) = 256 / 74 * 1 = 3.46 ~ 3
주작입니다!

More Related Content

Similar to Probabilistic data structures

퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 WinterSuhyun Park
 
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 WinterSuhyun Park
 
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석R 프로그래밍을 이용한 야생동물 행동권(HR) 분석
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석Byeong-Hyeok Yu
 
자료구조5보고서
자료구조5보고서자료구조5보고서
자료구조5보고서KimChangHoen
 
자료구조 프로젝트
자료구조 프로젝트자료구조 프로젝트
자료구조 프로젝트hyungoh kim
 
Project#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpProject#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpKimjeongmoo
 
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Ki-Hwan Kim
 
Adversarial Attack in Neural Machine Translation
Adversarial Attack in Neural Machine TranslationAdversarial Attack in Neural Machine Translation
Adversarial Attack in Neural Machine TranslationHyunKyu Jeon
 
R 스터디 첫번째
R 스터디 첫번째R 스터디 첫번째
R 스터디 첫번째Jaeseok Park
 

Similar to Probabilistic data structures (14)

퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
 
Rdatamining
Rdatamining Rdatamining
Rdatamining
 
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
 
2012 Dm 07
2012 Dm 072012 Dm 07
2012 Dm 07
 
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석R 프로그래밍을 이용한 야생동물 행동권(HR) 분석
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석
 
자료구조5보고서
자료구조5보고서자료구조5보고서
자료구조5보고서
 
자료구조 프로젝트
자료구조 프로젝트자료구조 프로젝트
자료구조 프로젝트
 
Project#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpProject#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 Hwp
 
Number theory
Number theoryNumber theory
Number theory
 
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
 
Adversarial Attack in Neural Machine Translation
Adversarial Attack in Neural Machine TranslationAdversarial Attack in Neural Machine Translation
Adversarial Attack in Neural Machine Translation
 
Variational AutoEncoder(VAE)
Variational AutoEncoder(VAE)Variational AutoEncoder(VAE)
Variational AutoEncoder(VAE)
 
R 스터디 첫번째
R 스터디 첫번째R 스터디 첫번째
R 스터디 첫번째
 
R_datamining
R_dataminingR_datamining
R_datamining
 

More from Sanghyeon Seo

More from Sanghyeon Seo (6)

AI value engineering
AI value engineeringAI value engineering
AI value engineering
 
심천 I/O와 조인 알고리즘
심천 I/O와 조인 알고리즘심천 I/O와 조인 알고리즘
심천 I/O와 조인 알고리즘
 
Tour of Rust
Tour of RustTour of Rust
Tour of Rust
 
How to Contribute to OSS
How to Contribute to OSSHow to Contribute to OSS
How to Contribute to OSS
 
PyCon Korea 2015
PyCon Korea 2015PyCon Korea 2015
PyCon Korea 2015
 
PyPy
PyPyPyPy
PyPy
 

Probabilistic data structures

  • 1. 확률론적 자료구조들 Probabilistic data structures 스팍스 서울 티파티 2017-08
  • 3. 웹 스팸 문제  앞에서 꿋꿋이 걸어가던 엑셀핸드가  난데없이 말한다 (드래곤 라자 7, 이영도)  앞에서 꿋꿋이 걸어가던 엑셀핸드가  강원랜드 난데없이 말한다 (어떤 스패머)
  • 4. n-gram, k-mer, w-shingle  SPARCS 3-gram  SPA, PAR, ARC, RCS  GAATTC 3-mer  GAA, AAT, ATT, TTC  2-shingle  엑셀핸드가 난데없이 / 엑셀핸드가 강원랜드  강원랜드 난데없이 / 난데없이 말한다
  • 5. ngram  def ngram(n, string):  result = []  for i in range(0, len(string) - n + 1):  substring = string[i:i+n]  result.append(substring)  return result
  • 6. IoU  Intersection over Union  | A ⋂ B | / | A ⋃ B |  n(3, SPARCS) = SPA, PAR, ARC, RCS  n(3, SUPARCS) = SUP, UPA, PAR, ARC, RCS  ⋂ = ARC, PAR, RCS  ⋃ = ARC, PAR, RCS, SPA, SUP, UPA  IoU = 3 / 6 = 50%
  • 7. iou  def iou(n1, n2):  s1 = set(n1)  s2 = set(n2)  intersection = s1 & s2  union = s1 | s2  return len(intersection) / len(union)
  • 8. 해시 함수  h: X → [0, 2^32)  x = y 이면 h(x) = h(y)  x ≠ y 이면 h(x) ≠ h(y) (확률: 1 – 1/2^32)
  • 9. hash  def hash(string):  result = 0  for character in string:  number = ord(character)  result = result * 33 + number  return result % 256
  • 10. MinHash  A와 B의 IoU를 구하는 대신  s(X) = X의 모든 원소의 hash 중 가장 작은 k개  s(X)는 X의 랜덤 샘플  C = s(s(A) ⋃ s(B))는 A ⋃ B의 랜덤 샘플  D = (A ⋂ B) ⋂ C = (s(A) ⋂ s(B)) ⋂ C  IoU ~ |D| / |C|
  • 11. minhash  def minhash(k, seq):  hashed = (hash(item) for item in seq)  return nsmallest(k, hashed)
  • 12. minhash_iou  def minhash_iou(k, n1, n2):  s1 = set(minhash(k, n1))  s2 = set(minhash(k, n2))  union = set(nsmallest(k, s1 | s2))  intersection = s1 & s2 & union  return len(intersection) / k
  • 13. 해 봅시다!  n1 = ngram(3, SPARCS)  SPA, PAR, ARC, RCS  n2 = ngram(3, SUPARCS)  SUP, UPA, PAR, ARC, RCS  iou(n1, n2)  3 / 6 = 0.5
  • 14. 해 봅시다!  [hash(item) for item in n1]  164, 3, 86, 200  [hash(item) for item in n2]  88, 38, 3, 86, 200  minhash(2, n1) = 3, 86  minhash(2, n2) = 3, 38  minhash_iou(2, n1, n2) = 1 / 2 = 0.5
  • 16. KMV  K-Minimum Values  |A|를 구하는 대신  s(A) = MinHash(k, A)를 구하면  |A| ~ 2^32 / Max(s(A)) * k  |A ⋃ B| ≠ |A| + |B|  그러나 s(A ⋃ B) = s(s(A) ⋃ s(B))!
  • 17. kmv  def kmv(k, seq):  s = minhash(k, seq)  return 256 / max(s) * k
  • 18. 해 봅시다!  s = sven, sanxiyn, daybreaker, nobell  [hash(item) for item in s]  252, 74, 122, 60  kmv(1, s) = 256 / 60 * 1 = 4.27 ~ 4  nobell을 빼면  kmv(1, s) = 256 / 74 * 1 = 3.46 ~ 3