Growth Hoon

20231202_TIL_{ 추천 시스템 : [ feature 유사도 평가 metric, KNN], 코딩 테스트 : [프로그래머스 -다트게임] } 본문

TIL_Today I Learned

20231202_TIL_{ 추천 시스템 : [ feature 유사도 평가 metric, KNN], 코딩 테스트 : [프로그래머스 -다트게임] }

sayhoon 2023. 12. 2. 18:22

Feature들 간의 유사도 평가 Metric

1. 유클리드 거리 (Euclidean Distance)

- 거리 기반 유사도 측정 방법

- 여러 차원을 갖는 점과 점 사이의 거리를 계산 할 수 있다.

 

2. 코사인 유사도 (Cosine Similarity)

- 각도 기반 유사도 측정

- Vector 비교시 가장 많이 사용되는 평가 metric

- Text 데이터가 얼마나 유사한지 많이 사용함

 

** 두 Metric 비교

- 비교하고자 하는 Data(=Vector)간의 Scale간의 차이가 

  크게 날 경우 = Cosine Similarity

  크지 않을 경우 = Euclidean Distance

 

그 외 평가 Metric : 멘하탄 거리, 피어슨 상관계수, 민코스키 거리, 자카드 유사도, Mean squared difference 유사도


근접 이웃 추천 알고리즘 ( K - Nearest Neightbor )

- 거리가 가까운 K개의 다른 데이터를 선택하는 알고리즘

- Data와 Data사이에 Euclidean distance와 같은 거리 측정 metric을 활용한다.

 

해당 알고리즘에서 가장 중요한 점은 K값과 거리를 측정하는 metric

K값에 따라 overfitting or underfitting이 될 수 있다.

-> K값은 홀수로 두는 것이 좋다. (과반수를 선택하기 위함 !)

 

고려사항

- 변수간의 분포가 다르기 때문에 Data를 정규화 해주어야 한다. ( z-score, min-max scaler ... )

- Data간 거리 측정을 효율화 해야함. (계속해서 계산하는 것은 비효율적)

    > Local sensitive hashing, Network based indexer

- 공간상 Data representation 상태를 확인해야함.

    > 다른 model에 비해서 outliner에 강건한 편, Data 특성에 따라 위치와 거리가 적절히 분포 되어있어야 함.

 


프로그래머스 문제 - [1차] 다트게임

github link

def solution(dartResult):
    
    score_list = []
    # 10을 구별하기 위한 변수
    num = ''
    for dart in dartResult:
        # 점수 데이터 넣기 
        if (num != '') and (not dart.isdigit()):
            score_list.append(int(num))
            num = ''
            
        # 점수 데이터 뽑기
        if dart.isdigit():
            num += dart
            
        # S, D, T 구분하여 점수 추가
        elif dart in ['S','D','T']:
            if dart == 'D':
                score_list[-1] = score_list[-1] ** 2
            elif dart == 'T':
                score_list[-1] = score_list[-1] ** 3
        # 옵션에 따른 점수 부여
        elif dart in ['*', '#']:
            if dart == '*':
                if len(score_list) == 1:
                    score_list[0] = score_list[0] * 2
                else:
                    for index in range(1,3):
                        score_list[-index] = score_list[-index] * 2
            elif dart == '#':
                score_list[-1] = score_list[-1] * -1
            
    return sum(score_list)

print(solution("1S2D*3T"))
print(solution("1D#2S*3S"))
print(solution("1D2S#10S"))
print(solution("1T2D3D#"))

좀 더 효율적인 코드가 있을 것 같은데 !...
우선 스스로 풀었다는 것에 성취감이 느껴진다 !