쉬면서 엉덩이가 무거운 상태로 있더라도 언제나 문제를 풀 방법을 찾았을땐 힘이난다. 카페에서 스트리머의 프로핏을 개선하려면 어떻게 해야할지 고민하면서 <오십에 읽는 장자> 책을 읽고있다가 뜬금없이 얼마전에 봤던 슬라이딩 윈도우(Sliding Window) 알고리즘을 이용한 이상현상 감지법이 생각났다. (글로 적고나니까 진짜 ADHD 미쳤다...ㅋㅋㅋㅋㅋ)
즉시 책을 덮고 카페를 떠나 컴퓨터를 켜서 작업을 시작했다.
방송을 보다보면 웃긴 장면에는 "ㅋㅋㅋㅋ"가 도배되면서 채팅이 단시간에 폭발한다. 채팅이 버스트하는 구간들을 슬라이딩 윈도우를 이용해 잡아내면 유튜브 편집 영상 당 투입되는 시간을 줄여서 영상 단가를 줄여버릴 수 있을 것 같다는 생각. 편집점을 찾는데 뿐만 아니라 다시보기를 보는 시청자도 놓쳐버린 방송에서 어느 부분이 재미있는 사건이 있었던 부분인지 빠르게 알 수 있다.
슬라이딩 윈도우 알고리즘(Sliding Window Algorithm)
건물이 아무리 크더라도 창문이 조그만하면 바깥 사람들은 창문이 뚫린 부분밖에 볼 수 없다. 건물 전체를 보려면 창문을 밀어가면서 옮겨가면서 볼 수도 있겠다. 슬라이딩 윈도우 알고리즘은 연속된 배열에서 윈도우 사이즈라고하는 고정된 크기(Window size)의 하위 배열의 데이터만을 처리한다. 이를 이용하면 메모리 효율적으로 배열의 최대 부분 배열 합, 평균 등을 계산할 수 있다.
그러면 어떻게 그게 가능한지 아주 간단하게만 살펴보겠다.
길이가 6인 다음과 같은 정수 배열이있다. 이 배열에서 3 연속 부분 배열의 최대 합을 구해보자.
[2, 1, 5, 1, 3, 2]
처음에는 부분 배열 [2, 1, 5]를 본다.
2 + 1 + 5 = 8 임을 계산한다.
윈도우를 한칸 옮겨서 [1, 5, 1]을 본다.
이전 윈도우에서 2가 빠졌고, 1이 더해진 형태다.
8 - 2 + 1 = 7 임을 계산한다. 이전에 계산한 8보다 큰가? 아니다.
윈도우를 또 옮기고 끝까지 반복하며 연속된 부분 배열의 최대 합을 구한다.
슬라이딩 윈도우 알고리즘의 활용
최근 추세, 동향, 이상을 파악하는 문제에서 주로 이용된다.
1. 네트워크 모니터링 및 트래픽 분석: 일정 시간 내 비정상적인 트래픽 급증등을 감지하거나 평균 부하를 계산하는데 사용한다.
2. 이미지 처리: 컴퓨터 비전 영역에서 특징을 추출하거나 노이즈를 필터링하는데 사용한다.
3. 광고 노출 및 클릭 분석: 광고 노출 및 클릭 데이터를 실시간으로 분석하여 CTR 또는 참여율과 같은 지표를 계산하는데 사용한다.
4. 콘텐츠 추천 시스템: 짧은 기간동안 사용자의 시청 콘텐츠를 주적하여 실시간으로 다음 콘텐츠를 추천할 수 있다.
DASHI에서는?
DASHI에서는 일정 기간동안의 채팅 수를 분석하면서 이동 평균과 이동 표준 편차를 구하고, 이동 평균 + k * 이동 표준편차(k는 임의의 수)를 임계점으로 두고 그 값을 벗어나는 구간을 뜨거운 순간으로 감지한다. 사진에서 윗쪽의 분홍색 부분이 그 임계점들이 형성하는 밴드에 해당한다고 보면된다. 슬라이딩 윈도우 알고리즘 덕분에 8시간의 방송이 있더라도 모든 구간의 채팅 수를 메모리에 올려놓지 않아도 된다. 내가 보고자하는 최근 동향 정도만 파악하면 되는 것! DASHI는 파이썬 기반이라 pandas를 사용할 수 있어서 이동 평균과 표편 구하기도 아주 편하다.
아 그리고...고등학교때 성적표를 받아들면서 표준 편차가 뭔지 친구들한테 엄청 물어봤는데 들을 때마다 까먹었다. 이번에 그래서 정의를 다시봤다. 표준 편차가 크면 표본 간의 점수차이가 크다는 뜻이다. 누구는 20점 받고, 누구는 100점 받았았던 시험. 표준 편차가 작다면 다들 비슷비슷한 점수를 받았구나~ 생각하면 된다.
아직은 이 수치를 바꾸며 적당한 분량의 편집점이 나오도록 조정해야하는 기간이다.
DASHI의 뜨거운 순간 기능
DASHI에서 뜨거운 순간은 버블 차트로 시각화되어 표현된다. 차트를 그리는데는 Chart.js를 사용했다.
임계치를 넘어서면, 역으로 어느정도의 임계치까지 넘어설 수 있는지를 계산해서 점수로 반영한다. 이 점수는 Hover를 하면 보여지고, 점수가 높을 수록 원이 커지며, 더 선명해진다. 이런 임의의 값들을 alpha 값으로 사용할 수 있는 0.0-1.0 사이의 숫자로 바꾸기 위해 시그모이드 함수를 사용했다. 원을 클릭하게 되면 해당 순간으로 이동한다.
관련 자료
https://medium.com/@krzysztofdrelczuk/time-series-anomaly-detection-with-python-example-a92ef262f09a
'프로그래밍 > 회고' 카테고리의 다른 글
DASHI - 챕터와 속도 개선 업데이트 (2) | 2024.03.31 |
---|---|
DASHI - 트위치 다시보기 부활 (29) | 2023.11.19 |
[Python] 국내 주요 음원차트 API (0) | 2023.04.10 |
김래일의 애니캐 테스트 - 첫 React 프로젝트 회고 (1) | 2022.09.11 |
TinyDoge - 하루만에 만든 PNG 손실압축 프로그램 회고 (1) | 2022.09.04 |