어제 복습하면서 뺴먹은 부분 설명 다시 하겠습니다.
K-Means Clustering에 대해 조금 더 자세히 알아보겠습니다.
이것은 과정을 짧게 요약하겠습니다.
K-평균 클러스터링 과정 요약
1. K값 설정: 사용자가 클러스터의 수 𝑘를 선택합니다.
2. 초기 중심점 선택: 그러면 K값에 맞게 설정된 수 만큼 데이터 포인트에서 K개의 중심점이 랜덤으로 설정되게 됩니다.
3. 클러스터 할당: 이제 중심점으로 선택된 데이터 포인트들이 주변에 있는 여러 데이터 포인트들과의 유클리드 거리를 계산합니다. 그리고 각 데이터 포인트는 가장 가까운 중심점에 할당되어 해당 클러스터에 속하게 됩니다. 이 과정은 데이터 포인트의 수에 상관없이 모든 포인트에 대해 이루어집니다.
4. 중심점 업데이트: 그렇게 되면, 이제 군집 안에 있는 데이터 포인트들 간의 거리를 계산을 하는데, 이때 관성의 식이 사용이 되는겁니다. 그렇게 각 클러스터에 속한 데이터 포인트들의 평균 위치를 계산하여 새로운 중심점을 설정합니다. 이 단계에서 클러스터의 중심점은 다시 결정됩니다.
5. 반복: 여기서 엘보우 방식이 사용됩니다: 클러스터 할당 및 중심점 업데이트 과정을 반복합니다. 이 과정은 중심점이 더 이상 변하지 않거나, 클러스터 할당이 안정될 때까지 계속됩니다. 그러면 여러 가지 𝑘값을 시도하여 각 𝑘에 대한 관성을 계산합니다. 그러면 각 k값에 대한 관성 값들이 지표에 나오게 되는데, 관성이 더 이상 감소하지 않으면, 클러스터 할당이 더 이상 변경되지 않거나 중심점이 더 이상 이동하지 않는 상황이 발생합니다. 이는 최적의 클러스터링 결과를 나타내며, 모델이 안정성을 찾았다는 신호입니다. 모델이 안정성을 찾았다는 뜻은 클러스터 내 데이터 포인트와 중심점 간의 거리가 일정하게 유지된다는 의미입니다. 즉, 클러스터의 형성이 안정화되었다는 것입니다.
여기서 한번 더 중요한 포인트를 말하자면,
1. 유클리드 거리: 유클리드 거리는 클러스터가 생성되기 전에 각 데이터 포인트와 초기 중심점 간의 거리를 계산하는 데 사용됩니다. 데이터 포인트가 가장 가까운 중심점에 할당되도록 하여 클러스터를 형성하는 데 중요한 역할을 합니다. 이 과정은 클러스터의 초기 할당을 결정합니다.
2. 관성 (Inertia): 관성은 각 클러스터 내의 데이터 포인트와 그 클러스터의 중심점 간의 거리의 합을 계산하는 데 사용됩니다. 관성 값이 낮을수록 클러스터 내의 데이터 포인트들이 중심점에 가까이 모여 있음을 의미하며, 이는 클러스터가 잘 형성되었음을 나타냅니다. 클러스터의 품질을 평가하는 데 중요한 지표로 사용됩니다. 관성은 K-평균 클러스터링의 반복 과정에서 중심점을 업데이트할 때도 고려됩니다.
그러면 궁금한 점이 나올 수 있습니다. 만약 k를 8로 설정하면 8개의 군집이 나오는데, 어떻게 좌표에서는 하나의 점으로 표시될 수 있냐 이겁니다.
게산된 값들을 시각화 할 때에는 즉, k가 8일 때 나타나는 점은 8개의 클러스터에 대한 총 관성 값으로, 8개의 개별적인 관성 값을 평균 내거나 합산한 값이 아닙니다. 단순히 8개 클러스터에 대한 전체적인 거리 제곱의 합입니다.
즉, 8개의 개별 관성 값을 구하고, 그 8개를 전부 합친, 총 관성을 찾은것을 의미합니다.
즉, 비지도 학습 자체가, 군집하면 만난 데이터 포인트끼리의 특성을 비교하여 패턴과 규칙을 찾아가는 개념입니다.
궁금증이 하나 더 있습니다.
# 2차원으로 군집 시각화 (연령 vs 소득) plt.figure(figsize=(10, 8)) sns.scatterplot(x=data['Age'], y=data['Annual Income (k$)'], hue=data['Cluster'], palette='viridis') plt.title('Clusters of customers (Age vs Annual Income)') plt.show() # 2차원으로 군집 시각화 (소득 vs 지출 점수) plt.figure(figsize=(10, 8)) sns.scatterplot(x=data['Annual Income (k$)'], y=data['Spending Score (1-100)'], hue=data['Cluster'], palette='viridis') plt.title('Clusters of customers (Annual Income vs Spending Score)') plt.show()
여기서 왜 굳이 시각화를 각각 따로, 데이터의 특성들을 비교하는 걸까요? 그러면 안 쓰인 특성은 어떻게 되는 걸까요?
먼저, 연령 vs 소득 그래프입니다.
이 그래프는 **연령(Age)**와 연간 소득(Annual Income) 두 개의 변수만을 사용하여 고객의 분포를 시각화합니다. 지출 점수(Spending Score)는 군집화 과정에서 고객을 구분하는 중요한 특성이었지만, 이 그래프에서는 지출 점수가 시각화되지 않습니다. 즉, 이 그래프는 연령과 소득만을 비교하고 있습니다. 다만, 군집화 알고리즘에서 고객을 분류할 때는 지출 점수가 포함되어 있기 때문에, 연령과 소득 간의 관계가 군집화 결과에 영향을 미친다고 할 수 있습니다.
두번쨰로 소득 vs 지출 점수 그래프입니다.
이 그래프는 연간 소득과 지출 점수를 비교하는 것입니다. 여기서도 마찬가지로, 연령은 포함되어 있지 않습니다. 이 두 변수 간의 관계를 시각화하고 있습니다. 군집화 과정에서 사용된 다른 특성들이 그래프의 결과에 영향을 미쳤지만, 시각화는 이 두 변수의 관계만을 보여줍니다.
하지만
군집화 과정에서 연령은 데이터 포인트의 특성 중 하나로 사용되었습니다. 따라서 각 고객의 군집을 형성하는 데 연령이 영향을 미친 것입니다.
예를 들어, 만약 특정 연령대의 고객이 주로 높은 지출 점수를 가지면서 소득이 일정 범위 내에 있다면, 해당 연령대의 고객들이 소득 vs 지출 점수 그래프에서 군집으로 나타날 수 있습니다.
즉, 군집화 결과가 이 두 변수 간의 관계에 영향을 미칠 수 있지만, 각 그래프는 오직 두 변수만을 가지고 비교하는 것입니다.
그럼 이제 코드에 대해 배워보겠습니다.
import seaborn as sns -> seaborn은 다양한 고급 시각화 기능을 제공하여, 간단한 코드로 복잡한 그래프를 만들 수 있습니다. 예를 들어, scatterplot, boxplot, heatmap, pairplot 등을 손쉽게 생성할 수 있습니다.
그러면 이제 궁금증이 생길 수 있습니다. 왜 seaborn이랑 plt를 같이 쓰는거지? 둘 다 그래프를 만들 수 있는거 아닌가?
먼저 기본 그래프 라이브러리와 고급 시각화 라이브러리의 조합이라고 할 수 있습니다.
plt는 import matplotlib.pyplot as plt라는 것을 불러오는데, 여기서 matplotlib는 파이썬에서 기본적으로 그래프를 그리는 라이브러리입니다. 다양한 그래프를 그릴 수 있는 기본적인 도구와 기능을 제공합니다. 그리고 seaborn은 matplotlib를 기반으로 하는 고급 시각화 라이브러리입니다. seaborn은 데이터 시각화를 더 쉽고 세련되게 만들어 주는 기능을 추가합니다. 색상(hue), 크기(size), 모양(style)과 같은 추가적인 시각적 요소를 쉽게 지정할 수 있습니다.
sns.scatterplot(x=data['Age'], y=data['Annual Income (k$)'], hue=data['Cluster'], palette='viridis')
먼저 x = data['Age'] -> age의 값을 넣어주는것 y또한 마찬가지
hue = data['Cluster'] -> 자 여기서 헷갈릴 수 있습니다. 이 뜻은 hue에 Cluster라는 컬럼은 넣는다는 뜻이 아니라, Cluster의 색상을 무작위로 바꿔주는 역할을 합니다. 여기서 궁금하신게 들어가지는 값은 Age랑 Annual Income인데 왜 갑자기 Cluster를 바꿔주는지 의하할 수 있습니다.
하지만 hue는 사실 두 가지 역할을 합니다.
1. 지표로 사용: hue에 지정한 값(여기서는 data['Cluster'])은 데이터 포인트를 군집(클러스터)별로 나누는 데 사용됩니다. 즉, 각 데이터 포인트가 어떤 군집에 속하는지를 나타내는 정보로 사용됩니다. (참고로 Cluster 안에는 각 데이터 포인트가 속한 군집 레이블을 반환하는 값을(.labels_)를 가지고 있습니다.
2. 색상 구분: hue를 통해 군집에 따라 각 데이터 포인트의 색상이 다르게 표시됩니다. 이때 palette 매개변수를 사용하여 어떤 색상 조합을 사용할지를 설정할 수 있습니다. 예를 들어, palette='viridis'는 Viridis 색상 팔레트를 사용하여 각 군집을 색상으로 구분합니다.
palette = 'viridis' -> 팔레트는 데이터 시각화에서 사용할 색상 집합을 정의합니다. Seaborn에서는 시각화에 사용될 다양한 색상 조합을 미리 설정해 놓은 여러 가지 팔레트를 제공합니다. 이 팔레트는 데이터의 속성에 따라 점의 색상을 구분하는 데 사용됩니다. palette 매개변수는 그래프에서 점들의 색상을 어떻게 설정할지를 정의합니다.
그리고 각 특성은:
colorblind: 색각 장애인을 고려한 팔레트
viridis: 밝기 변화가 있는 색상
plasma: 더 따뜻한 색조의 그라디언트
cividis: 색각 장애인을 고려한 연속 색상
coolwarm: 두 극단적인 값을 나타내는 팔레트
RdBu: 빨강과 파랑을 사용하여 양극화를 나타내는 팔레트
Set1, Set2, Set3: 범주형 데이터를 나타내는 팔레트
이렇게 있습니다.
계층적 군집화란, 사실 K-means clustering과 매우 유사합니다. 하지만 몇가지 차이점이 있습니다
1. 처음부터 군집의 갯수를 정하지 않아도 됩니다. 데이터 포인트를 각각의 클러스터로 시작하여 점진적으로 병합합니다
2. 군집 간의 유사성을 기반으로 계층적 구조를 생성하며, 덴드로그램이라는 시각화를 사용합니다.
3. 각 데이터 포인트 간의 거리 또는 유사성을 계산하고, 가장 가까운 클러스터들을 반복적으로 병합합니다.
먼저 기본 개념이 있습니다. 좌표상으로는 서로 비슷한 특성끼리 모여 있는 경우가 많습니다. K-평균 클러스터링이나 계층적 군집화와 같은 군집화 방법은 기본적으로 데이터 포인트 간의 거리나 유사성을 기준으로 작동하기 때문에, 비슷한 특성을 가진 데이터 포인트들은 자연스럽게 가까운 위치에 배치됩니다.
여기서 병합 군집화 분할 군집화에 대해 나오는데, 분할은 어려운데다 잘 쓰이지 않기 때문에 병합만 보도록 하겠습니다.
병합 군집합은 간단히 말해 각 개별로 시작해서 유클리드 거리를 사용해 각 데이터 포인트(군집)의 거리를 계산한 다음 가까이 있는 데이터를 하나씩 가져오는데, 그 가져오는 데이터와 자신의 데이터의 특성을 보고 비교를 하면서, 특성을 이해하고, 그렇게 뭉쳐진 두개의 데이터는 다른 군집으로 병합되거나, 가져와서 그 데이터의 특성을 비교 및 다시 새롭게 학습을 하면서 최종적으로 모든 데이토 포인트들이 하나의 군집을 이루어 최종적인 특성과 패턴을 이해한다라고 생각하시면 편합니다.
자, 이제 궁금증이 여러개 생길 수 있습니다.
묶어지는 기준이 거리인데 유사성은 뭐지, 어차피 가까이 있는 데이터를 끌어 모으는데 굳이 거리를 계산 할 필요가 있어?라고 하실 수 있습니다.
먼저, 유클리드 거리 또는 맨해튼 거리와 같은 거리 측정 방법을 사용하여 두 데이터 포인트가 서로 얼마나 가까운지를 측정합니다. 두 포인트 간의 거리가 짧을수록 그들은 유사하다고 볼 수 있습니다. 반대로 거리가 멀면 유사성이 낮다고 판단할 수 있습니다.
게다가 계층적 군집화에서는 유사성을 기반으로 데이터를 묶으면서 패턴을 이해하고 규칙을 찾아가는 과정이 진행됩니다.
참고로 유클리드 거리, 또는 맨해튼 거리는 랜덤으로 사용되는 것이 아니라, 데이터의 특성과 분석 목적에 따라 결정됩니다. 두 가지 거리 측정 방법은 각각의 장단점이 있으며, 사용되는 맥락에 따라 적절하게 선택해야 합니다
1. 유클리드 거리: 두 점 간의 직선 거리를 계산합니다.
2. 맨해튼 거리: 두 점 간의 수직 및 수평 거리의 합을 계산합니다.
요약:
1. 데이터가 고르게 분포되어 있다면 유클리드 거리를, 특정한 축을 따라 배열된 경우라면 맨해튼 거리를 선택하는 것이 좋습니다.
2. 차원이 많을 경우 유클리드 거리가 왜곡될 수 있으므로 맨해튼 거리의 사용을 고려할 수 있습니다.
최종적으로 요약해보겠습니다
1. 초기 설정: 각 데이터 포인트는 처음에 개별적인 군집으로 시작합니다. 예를 들어, 50개의 데이터 포인트가 있다면, 처음에는 50개의 군집이 존재하는 셈입니다.
2. 거리 계산: 각 데이터 포인트 간의 거리를 계산합니다. 일반적으로 유클리드 거리를 사용하여 서로의 거리를 측정합니다. 이 단계에서 거리 행렬이 생성됩니다.
3. 가장 가까운 군집 선택: 거리 행렬을 기반으로 가장 가까운 두 개의 군집(또는 데이터 포인트)을 찾습니다. 이 두 군집은 서로의 거리 값이 가장 작습니다.
4. 병합: 가까운 두 군집을 하나로 병합합니다. 이때, 새로운 군집은 병합된 두 군집의 모든 데이터 포인트를 포함합니다.
5. 특성 비교 및 학습: 병합된 군집 내에서 각 데이터 포인트의 특성을 비교하고, 군집의 특성을 새롭게 정의합니다. 이는 군집이 어떻게 형성되었는지를 이해하고, 다음 단계에서 어떻게 더 큰 군집으로 확장될지를 결정하는 데 도움을 줍니다.
5.1 유사성 기반의 군집 형성: 데이터 포인트 간의 거리를 계산하여 가까운 데이터끼리 군집을 형성합니다. 이 과정에서 유사성이 높은 데이터들이 함께 묶입니다.
5.2 계층적 구조의 생성: 군집화 과정은 단계적으로 진행되며, 이로 인해 데이터 간의 관계를 시각적으로 이해할 수 있는 계층적 구조가 생성됩니다.
5.3 패턴 발견: 군집이 형성된 후, 각 군집의 특성을 분석하여 특정한 패턴이나 규칙을 찾을 수 있습니다.
6. 반복: 3~5단계를 반복하여 모든 데이터 포인트가 하나의 군집으로 병합될 때까지 진행합니다. 각 단계에서 군집 간의 거리 재계산과 병합이 이루어집니다(각 단계에서 군집 간의 거리를 재계산함으로써, 가장 가까운 군집을 찾아 병합할 수 있습니다. 이렇게 함으로써, 전체적으로 유사성이 높은 데이터들이 점차적으로 모여들게 됩니다. 이 과정은 군집 간의 관계를 효과적으로 유지하는 데 필수적입니다.).
7. 최종 결과: 모든 데이터 포인트가 하나의 군집으로 병합된 후, 최종 군집의 특성과 패턴을 이해합니다. 이때, 군집 내 데이터 포인트들의 유사성을 기반으로 특정한 패턴이나 규칙을 발견할 수 있습니다.
이제 코드에 대해 조금 알아보겠습니다.
import scipy.cluster.hierarchy as sch -> SciPy 라이브러리의 클러스터링 모듈 중 하나로, 주로 계층적 군집화(hierarchical clustering)를 수행하는 데 사용됩니다.
추가적인 기능들이 있습니다.
덴드로그램(dendrogram) 생성: 데이터 포인트 간의 관계를 시각적으로 나타내는 덴드로그램을 생성할 수 있습니다. 덴드로그램은 군집 간의 유사성과 거리 정보를 시각적으로 표현해 줍니다.
링키지(linkage) 계산: 여러 가지 거리 측정 방법(예: Ward, single, complete, average 등)을 사용하여 데이터 포인트 간의 연결을 계산합니다. 이 과정에서 두 군집을 합치는 방법을 결정하는 기준을 설정합니다.
계층적 군집화 수행: fcluster 함수를 사용하여 최종 군집을 형성하고, 지정된 기준에 따라 데이터 포인트를 군집으로 나눌 수 있습니다.
유사도 메트릭 선택:다양한 거리 메트릭(예: 유클리드 거리, 맨해튼 거리 등)을 사용하여 데이터 포인트 간의 유사성을 계산할 수 있습니다.
즉,
여기서, sch.dendrogram를 써서 덴드로그램을 사용하는데, linkage 계산을 넣어, 값(X_scaled)와 ward라는 방식을 지정합니다.plt.figure(figsize=(10, 7)) dendrogram = sch.dendrogram(sch.linkage(X_scaled, method='ward')) plt.title('Dendrogram') plt.xlabel('Customers') plt.ylabel('Euclidean distances') plt.show()
이제 이 부분을 설명하겠습니다.hc = AgglomerativeClustering(n_clusters=5, metric='euclidean', linkage='ward') # 모델 학습 및 예측 y_hc = hc.fit_predict(X_scaled) # 결과 시각화 plt.figure(figsize=(10, 7)) plt.scatter(X_scaled[y_hc == 0, 0], X_scaled[y_hc == 0, 1], s=100, c='red', label='Cluster 1') plt.scatter(X_scaled[y_hc == 1, 0], X_scaled[y_hc == 1, 1], s=100, c='blue', label='Cluster 2') plt.scatter(X_scaled[y_hc == 2, 0], X_scaled[y_hc == 2, 1], s=100, c='green', label='Cluster 3') plt.scatter(X_scaled[y_hc == 3, 0], X_scaled[y_hc == 3, 1], s=100, c='cyan', label='Cluster 4') plt.scatter(X_scaled[y_hc == 4, 0], X_scaled[y_hc == 4, 1], s=100, c='magenta', label='Cluster 5')
먼저 sklearn 라이브러리의 AgglomerativeClustering 클래스를 사용해서 병합 군집합이라고 알립니다.
그리고,
1. n_clusters: 생성할 군집의 수를 지정합니다. 위의 예에서는 n_clusters=5로 설정되어 있어, 데이터를 5개의 군집으로 나누겠다는 의미입니다.
2. metric: 데이터 포인트 간의 거리 계산 방법을 지정합니다. 위의 예에서는 'euclidean'으로 설정되어 있어, 유클리드 거리를 사용하여 포인트 간의 거리를 계산합니다.
3. linkage: 군집 간의 거리 계산 방식을 지정합니다. 위의 예에서는 'ward'로 설정되어 있어, Ward 연결 방식이 사용됩니다. Ward 연결 방식은 두 군집을 합쳤을 때의 분산 증가량을 최소화하는 방법입니다. 이는 각 군집의 중심점 간의 거리보다 군집의 크기나 모양을 더 고려하여 군집을 형성합니다.
그런데 여기서 궁금증이 생길 수 있습니다. 초기에 각 데이터 포인트가 개별적인 군집으로 시작하는데 왜 군집을 설정하지?
하지만, 병합 군집화는 최종적으로 모든 데이터가 하나의 군집이 될 때까지 계속해서 클러스터들을 합쳐 나갑니다. 그러나 이는 유용하지 않습니다. 데이터를 분석하는 목적은 적절한 개수의 군집을 찾고자 하는 것이지, 하나의 군집으로 끝내려는 것이 아닙니다. 그래서, 미리 몇 개의 군집(n_clusters)을 설정하거나, 덴드로그램을 이용해 적절한 시점에서 군집화를 멈추는 기준을 설정하는 것입니다.(참고로 군집의 수는 하나하나 1~10써가면서 찾는것이 제일 좋습니다.)
이제 시각화에 대해 살펴보겠습니다.
1. plt.scatter 함수:
plt.scatter는 산점도(scatter plot)를 그리는 함수입니다. 산점도는 데이터를 2차원 평면에서 점으로 표현하는 방법입니다.
여기서는 각 군집에 속하는 데이터 포인트들이 각기 다른 색으로 표시됩니다.
2. X_scaled[y_hc == 0, 0] 와 X_scaled[y_hc == 0, 1]:
X_scaled: 이 변수는 스케일링된 데이터입니다. 즉, 데이터의 범위를 표준화 또는 정규화하여 값들이 특정 범위 내에 들어가도록 변환한 상태입니다.
y_hc == 0: y_hc는 군집 레이블(label)을 의미합니다. 이 레이블은 각 데이터 포인트가 어떤 군집에 속하는지를 나타냅니다. y_hc == 0은 군집 0에 속하는 데이터 포인트들만 선택한다는 의미입니다.
X_scaled[y_hc == 0, 0]: 군집 0에 속하는 데이터 포인트들의 첫 번째 차원(특성) 값들을 선택합니다.
X_scaled[y_hc == 0, 1]: 군집 0에 속하는 데이터 포인트들의 두 번째 차원(특성) 값들을 선택합니다.
즉, X_scaled[y_hc == 0, 0]와 X_scaled[y_hc == 0, 1]은 군집 0에 속하는 데이터 포인트들의 x와 y 좌표입니다. 이 좌표들을 사용해 산점도에서 해당 포인트들을 그립니다.
3. s=100:
점의 크기를 의미합니다. s=100은 각 점의 크기를 100으로 설정하는 것입니다.
4. c='red':
점의 색깔을 설정합니다. 여기서는 군집 0에 속하는 데이터 포인트들을 빨간색(red)으로 표시합니다.
각각의 줄에서 c는 각기 다른 색깔로 설정되어 군집 1은 파란색(blue), 군집 2는 초록색(green) 등으로 표시됩니다.
5. label='Cluster 1':
그래프의 범례(legend)에서 각 군집을 어떻게 표시할지 정하는 부분입니다.
label='Cluster 1'은 군집 0을 "Cluster 1"로 표시한다는 의미입니다.
이후에도 군집 1, 군집 2 등 다른 군집을 각각 Cluster 2, Cluster 3 등으로 레이블링합니다.
즉,
X_scaled[y_hc == 0, 0]: = Age
X_scaled[y_hc == 0, 1]: = Annual Income으로 설정이 되면서, 그 값들을 불러와서 점들의 크기는 100, 색깔은 빨강으로, 이름은 Cluster1으로 표기한다는 의미입니다.
추가로
from sklearn.metrics import silhouette_score는 군집화 성능을 평가하기 위한 실루엣 점수(Silhouette Score)를 계산할 때 사용되는 silhouette_score 함수를 불러오는 코드입니다.
1에 가까울수록: 데이터 포인트가 자신의 군집에 잘 속해 있고, 다른 군집과는 명확히 구분됨.
0에 가까울수록: 데이터 포인트가 경계에 위치하여 두 군집 사이에 걸쳐 있을 가능성이 있음.
-1에 가까울수록: 데이터 포인트가 잘못된 군집에 속해 있음.
DBSCAN에서의 원리란
핵심점 찾기:
데이터 포인트 중에서 eps 반경 내에 min_samples 이상의 이웃을 가진 핵심점을 찾습니다.
eps 반경 내의 데이터수 ≥ min_samples : 해당 데이터 포인트를 중심으로 새로운 군집 형성.
eps 반경 내의 데이터수 < min_samples : 해당 데이터 포인트를 노이즈로 간주
군집 확장:
핵심점에서 시작하여 연결된 이웃점들을 따라가며 군집을 확장합니다. 이 과정에서 경계점은 군집에 포함되지만 노이즈점은 포함되지 않습니다.
반복:
모든 데이터 포인트가 처리될 때까지 이 과정을 반복합니다.
노이즈 처리:
군집에 속하지 않은 점들은 노이즈(이상치)로 처리됩니다.
이렇게 있습니다.
dbscan = DBSCAN(eps=5, min_samples=5) 이런식으로 적을 수 있습니다
그런데 eps와 min_sample을 적는 기준이 있습니다.
k-거리 플롯(k-distance plot) 사용 가장 흔히 사용되는 방법은 k-거리 플롯을 이용하는 것입니다.
여기서 k는 DBSCAN에서 설정한 min_samples 값과 동일하게 설정합니다. k-거리 플롯을 사용하여 최적의 EPS 값을 찾을 수 있습니다.
k-거리 플롯은 각 데이터 포인트에 대해, 그 포인트에서 가장 가까운 k번째 이웃까지의 거리를 계산합니다. 계산된 거리값들을 정렬하고, 이를 그래프에 플롯합니다.
그래프에서 기울기가 급격히 변하는 지점(Elbow)을 EPS로 설정하는 것이 일반적입니다. 이 급격한 변화 지점이 DBSCAN의 적절한 EPS 값이 됩니다.
나머지는....알아서 배웠다고 치자......딥 러닝 배우러 가야해...