728x90
시계열 데이터에서 정상 패턴 구간만 추출 하기 위해 특정 패턴과 유사한 구간의 index를 찾는 방법을
알아보고자 합니다.
아래 그림은 타겟 라벨 값이 정상 구간의 데이터이나 후반부에 일정한 연속값이 들어오고 있는 등 정상적인 형태가
아닌 데이터가 들어오고 있는 것을 알 수 있습니다.
정상적인 패턴의 형태만 학습하기 위해서 정상 패턴을 정의하고 해당하는 데이터만 추출하고자 합니다.
1. 기준이 되는 특정 패턴 설정
base = tmp[360:550]
base = (base - base.min()) / (base.max() - base.min())
fig = plt.figure(figsize=(4, 4))
base.plot()
plt.show()
위의 그림과 같은 형태를 기준 패턴(base)으로 잡고
다른 구간에서 유사한 패턴을 보이는 곳을 탐지하도록 할 것입니다.
base 데이터와 유사하게 오르고 내리는 패턴을 파악하기 위해 데이터 정규화를 하도록 하겠습니다.
2. 유사패턴을 찾을 범위 설정(window_size)
base로 잡은 기준 패턴의 데이터 개수만큼 window_size를 설정합니다.
# 윈도우 사이즈
window_size = len(base)
데이터 처음부터 끝까지 윈도우 사이즈만큼 이동하면서 패턴을 찾을 반복 횟수를 구합니다.
moving_cnt = len(tmp) - window_size - 1
3. 코사인 유사도 계산 함수 구현
각 구간에 대해 코사인 유사도를 계산하는 함수를 구현합니다.
def cosine_similarity(x, y):
return np.dot(x, y)/(np.sqrt(np.dot(x, x))*np.sqrt(np.dot(y, y)))
4. 유사도 계산
이제 각 구간과 base 패턴과 유사도를 계산하여 sim_list 리스트에 추가하고 내림차순 정렬하여
유사도가 높은 순서대로 출력해보겠습니다.
# 코사인 유사도를 계산하여 저장해줄 리스트를 생성합니다
sim_list = []
for i in range(moving_cnt):
# i 번째 인덱스 부터 i+window_size 만큼의 범위를 가져와 target 변수에 대입합니다
target = tmp.iloc[i:i+window_size]
# base와 마찬가지로 정규화를 적용하여 스케일을 맞춰 줍니다
target = (target - target.min()) / (target.max() - target.min())
# 코사인 유사도를 계산합니다
cos_similarity = cosine_similarity(base, target)
# 계산된 코사인 유사도를 추가합니다
sim_list.append(cos_similarity)
pd.Series(sim_list).sort_values(ascending=False).head(20)
index 360은 base라인 index이므로 1로 가장 높고 그 다음 높은 index로는 169, 170, 361번 순입니다.
높은 인덱스로 뽑힌 10개 정도를 tmp 데이터에서 뽑아서 연달아 이어보겠습니다.
sim_list = pd.Series(sim_list).sort_values(ascending=False).index
target_ = pd.Series()
for i in range(10):# sim_list
idx = sim_list[i]
target = tmp.iloc[idx:idx+window_size]
target_ = pd.concat([target_, target])
fig = plt.figure(figsize=(20, 4))
plt.plot(target_.values)
plt.show()
감사합니다 :)
참고자료
728x90
'머신러닝&딥러닝 > Python' 카테고리의 다른 글
연산자 종류와 의미 (0) | 2022.11.21 |
---|---|
tqdm을 사용하여 처리 진행상황 확인하는 방법(for문, apply문) (0) | 2022.09.14 |
[scikit-learn] 다항회귀 PolynomialFeatures (0) | 2022.08.01 |
[R과 Python 비교] 데이터 프레임 병합하는 다양한 방법 (0) | 2022.05.24 |
[scikit-learn] PCA 기능 (0) | 2022.05.18 |