Kmeans 클러스터링 알고리즘 종합 분석(Python)

클러스터링 은 일반적인 비지도 학습 방법으로, 단순히 유사한 데이터 샘플을 그룹(클러스터)으로 그룹화하고 클러스터링하는 프로세스입니다.

우리는 특정 클래스(보통 레이블 정보 없이)가 무엇인지 알지 못하며, 달성하려는 목표는 유사한 샘플을 함께 클러스터링하는 것, 즉 샘플 데이터 자체의 분포 법칙을 사용하는 것입니다.

이 글에서는 클러스터링 알고리즘을 자세히 소개할 텐데, 이 글이 마음에 드셨다면 북마크, 팔로우 등을 잊지 말아주세요.

[참고] 코드, 데이터 및 기술 교환의 전체 버전은 기사 말미에 제공됩니다.

클러스터링 알고리즘은 크게 기존 클러스터링 알고리즘 심층 클러스터링 알고리즘 으로 나눌 수 있습니다 .

  • 기존의 클러스터링 알고리즘은 주로 원래 기능 + 분할/밀도/계층 및 기타 방법을 기반으로 합니다.
    그림

  • 심층 클러스터링 방법은 주로 표현 학습 + 기존 클러스터링 알고리즘 이후의 기능을 기반으로 합니다.그림

kmeans 클러스터링 원리

Kmeans 클러스터링은 가장 일반적인 클러스터링 알고리즘이라고 할 수 있으며 분할 방식을 기반으로 클러스터링됩니다. 원리는 k 클러스터 중심을 먼저 초기화하고 계산된 샘플과 중심 사이의 거리를 기준으로 각 클러스터 아래의 샘플을 요약하는 것입니다. 샘플과 샘플이 속한 클러스터 중심 사이의 거리를 최소화하는 목표를 반복적으로 달성합니다(다음 목적 함수).그림

최적화 알고리즘 단계는 다음과 같습니다.

1. 초기 클러스터 중심으로 k개의 샘플을 무작위로 선택합니다(k는 클러스터의 수를 나타내는 하이퍼파라미터입니다. 값은 사전 지식 및 검증 방법을 기반으로 결정할 수 있음).

2. 데이터 세트의 각 샘플에서 k 군집 중심까지의 거리를 계산하고 거리가 가장 작은 군집 중심에 해당하는 클래스에 할당합니다.

3. 각 클러스터에 대해 클러스터 중심 위치를 다시 계산합니다.

4. 특정 종료 조건에 도달할 때까지 위의 2단계와 3단계를 반복합니다(예: 반복 횟수, 클러스터 중심 위치가 변경되지 않은 상태로 유지됨 등).

그림

.... 
#kmeans算法是初始化随机k个中心点
random.seed(1)
center = [[self.data[i][r] for i in range(1, len((self.data)))]  
                      for r in random.sample(range(len(self.data)), k)]

#最大迭代次数iters
for i in range(self.iters):
    class_dict = self.count_distance() #计算距离,比较个样本到各个中心的的出最小值,并划分到相应的类
    self.locate_center(class_dict) # 重新计算中心点
    #print(self.data_dict)
    print("----------------迭代%d次----------------"%i)
    print(self.center_dict)  #聚类结果{k:{
    
    {center:[]},{distance:{item:0.0},{classify:[]}}}}
    if sorted(self.center) == sorted(self.new_center):
        break
    else:
        self.center = self.new_center

Kmeans 클러스터링의 반복 알고리즘은 실제로 EM 알고리즘임을 알 수 있으며, EM 알고리즘은 확률 모델에 관찰할 수 없는 숨겨진 변수가 포함된 경우 매개변수 추정 문제를 해결합니다.

Kmeans의 잠재 변수는 각 범주가 속한 범주입니다. Kmeans 알고리즘의 반복 단계에서 중심점을 확인할 때마다 EM 알고리즘의 E 단계에 해당하는 중심점을 다시 표시하여 현재 매개변수 조건에서 기대치를 찾습니다. 그리고 우도함수가 최대화될 때(손실함수가 가장 작은 경우) EM 알고리즘에서 M단계에 해당하는 중심점을 다시 찾는 마크에 따라 해당 매개변수. EM 알고리즘의 단점은 로컬 최소값에 쉽게 빠지기 ​​때문에 Kmeans가 때때로 로컬 최적 솔루션을 얻는 이유입니다.

거리 측정법 선택

kmeans 알고리즘은 각 샘플이 속하는 가장 가까운 중심점을 결정하기 위해 거리 유사도를 기반으로 계산되며 일반적인 거리 측정에는 맨해튼 거리와 유클리드 거리가 포함됩니다.

  • 맨해튼 거리 공식:

그림

  • 유클리드 거리 공식:

그림맨해튼과 유클리드 거리의 계산 방법은 두 샘플(x, y)의 각 특징 i 사이의 총 거리를 계산하는 매우 간단합니다. 아래 그림과 같이(2차원 피처의 경우) 파란색 선의 거리는 맨해튼 거리입니다(맨해튼의 한 교차로에서 다른 교차로까지 운전한다고 상상해보십시오. 실제 운전 거리는 이 "Manhattan 거리", 도시 블록 거리라고도 함), 빨간색 선은 유클리드 거리입니다.

그림

넷째, k 값의 결정

kmeans는 k 개의 클러스터로 나뉘며 알고리즘의 효과는 k개의 경우에 따라 매우 다를 수 있습니다. K 값의 결정은 선험적 방법, 엘보우 방법 및 기타 방법과 같이 일반적으로 사용됩니다.

  • 선험적 방법

선험적으로는 상대적으로 간단합니다. 즉, k의 값은 비즈니스 지식을 기반으로 결정됩니다. 예를 들어, 붓꽃 데이터 세트의 경우 k=3에 따라 클러스터링하여 확인할 수 있는 세 가지 범주가 있다는 것을 알고 있을 것입니다. 아래 그림에서 볼 수 있듯이 비교 클러스터링 예측은 실제 붓꽃 종과 더 일치합니다.그림그림

  • 팔꿈치 방법

k의 값이 클수록 클러스터가 더 많이 분할되고 해당 지점에서 클러스터 중심까지의 거리의 제곱합(클래스 내 거리, WSS)이 작을수록 알 수 있습니다. K의 증가에 따라 WSS가 감소하는 곡선을 결정합니다. 변곡점을 K의 값으로 합니다.그림

엘보우 방법의 단점은 사람의 판단이 필요하고 충분히 자동화되지 않는다는 것입니다.다음과 같은 다른 방법이 있습니다.

  • Gap 통계 방법을 사용하여 k 값을 결정했습니다.

  • 서로 다른 K 값의 평균 실루엣 계수를 확인합니다. 1에 가까울수록 클러스터링 효과가 좋습니다.

  • 서로 다른 K 값의 클래스 내 거리/클래스 간 거리를 확인하면 값이 작을수록 좋습니다.

  • ISODATA 알고리즘: k-means 알고리즘을 기반으로 하며 클러스터링 결과를 "병합" 및 "분할"하는 두 가지 작업을 추가하여 최종 클러스터링 결과를 결정합니다. 따라서 k 값을 수동으로 지정할 필요가 없습니다.

5. Kmeans의 결함

5.1 중심점 초기화 문제

kmeans는 임의의 초기화 중심점을 사용하며 다른 초기화 중심점이 알고리즘 결과에 더 큰 영향을 미칩니다. 따라서 Kmeans++ 알고리즘은 이에 대한 응답으로 업데이트되었으며 초기화 아이디어는 각 클러스터의 중심이 가능한 서로 떨어져 있어야 한다는 것이었습니다. 각 점에서 기존 중심점까지의 거리 성분을 기반으로 k개의 요소를 순서대로 중심점으로 무작위로 선택합니다. 식별된 군집 중심점에서 멀어질수록 다른 군집의 중심점으로 선택될 가능성(거리의 제곱에 비례하는 확률)이 높아집니다. 다음 코드.

# Kmeans ++ 算法基于距离概率选择k个中心点
            # 1.随机选择一个点
            center = []
            center.append(random.choice(range(len(self.data[0]))))
            # 2.根据距离的概率选择其他中心点
            for i in range(self.k - 1):
                weights = [self.distance_closest(self.data[0][x], center) 
                         for x in range(len(self.data[0])) if x not in center]
                dp = [x for x in range(len(self.data[0])) if x not in center]
                total = sum(weights)
                #基于距离设定权重
                weights = [weight/total for weight in weights]
                num = random.random()
                x = -1
                i = 0
                while i < num :
                    x += 1
                    i += weights[x]
                center.append(dp[x])
            center = [self.data_dict[self.data[0][center[k]]] for k in range(len(center))]

5.2 커널 Kmeans

유클리드 거리에 기반한 Kmeans는 각 데이터 클러스터의 데이터가 동일한 사전 확률을 갖는다고 가정하고 구형 분포를 나타내지만 이러한 분포는 실생활에서 일반적이지 않다. 볼록하지 않은 데이터 분포 형태에 대해 최적화하기 위해 커널 함수를 도입할 수 있는데, 이때 알고리즘은 커널 클러스터링 방법의 일종인 커널 Kmeans 알고리즘이라고도 합니다. 커널 클러스터링 방법의 주요 아이디어는 입력 공간의 데이터 포인트를 비선형 매핑을 통해 상위 수준의 특징 공간에 매핑하고 새로운 특징 공간에서 클러스터링을 수행하는 것입니다. 비선형 매핑은 데이터 포인트가 선형으로 분리될 확률을 증가시켜 기존 클러스터링 알고리즘이 실패할 때 커널 함수를 도입하여 보다 정확한 클러스터링 결과를 얻을 수 있습니다.

5.3 기능 유형

kmeans는 수치 지향 특성이며 범주 특성에는 onehot 또는 기타 인코딩 방법이 필요합니다. 또한, 혼합된 데이터 유형의 클러스터링에 사용할 수 있는 K-Modes 및 K-Prototypes 알고리즘이 있습니다.숫자적 특성 클러스터 클래스 센터의 경우 각 특성의 평균값을 얻고 범주형 특성 센터는 다음을 얻습니다. 모드이고 계산 거리는 해밍 거리를 사용합니다. , 그렇지 않으면 0입니다.

5.4 특징의 가중치

클러스터링은 피처 간의 거리를 기준으로 계산되며, 거리를 계산할 때 피처 치수의 차이에 주의해야 합니다. 치수가 클수록 피처의 가중치가 커집니다. 예를 들어 유클리드 거리를 계산할 때 각 표본에 연령과 급여의 두 가지 특성 변수가 있다고 가정할 때 (연령 1-연령 2)²의 값은 (연봉 1-연봉 2)²보다 훨씬 작습니다. feature scaling은 사용하지 않으며, 의 경우 거리는 임금변수(큰 값)에 의해 지배된다. 따라서 우리는 이 문제를 해결하기 위해 모든 값을 1차로 통합하기 위해 기능 스케일링을 사용해야 합니다. 일반적인 솔루션은 데이터를 "정규화" 또는 "정규화"하여 모든 수치적 특성을 0~1과 같은 표준 범위로 통합하는 것입니다.그림

정규화된 기능은 균일한 가중치이며 때로는 다른 기능에 더 큰 가중치를 할당해야 합니다. feature1의 weight를 1로, feature2의 weight를 2로 하고, 0에서 1로 정규화한 후, Euclidean distance와 유사한 계산을 수행할 때(root sign 없이) 그림feature2의 값에 root No를 곱합니다. 2로 충분하므로 feature2에 해당하는 위 공식의 계산 결과가 2배가 되어 가중치를 쉽고 빠르게 얻을 수 있습니다. 맨해튼 거리를 사용하는 경우 특성에 가중치 2(2)를 직접 곱합니다.

예를 들어 임베딩 후 범주 기능에 가중치가 부여된 경우 임베딩이 256차원이고 임베딩 결과를 0에서 1로 정규화한 후 각 임베딩 차원에 1/256의 제곱근을 곱하여 모든 임베딩 이 범주에 1/256을 곱합니다. 거리 계산의 기여도가 1로 줄어들어 임베딩 크기가 너무 커지는 것을 방지하므로 kmeans의 클러스터링 결과가 기본적으로 단일 임베딩 기능에 크게 의존합니다. 카테고리 차원.

5.5 기능 선택

본질적으로 kmeans는 샘플 기능(샘플 분포) 간의 거리를 기반으로 속한 클러스터 클래스만 결정합니다. 다른 기능은 클러스터링 결과에 상당한 영향을 미칩니다. 대표성이 아닌 기능을 사용하는 경우 결과가 예상과 매우 다를 수 있습니다! 예를 들어, 은행 고객의 품질을 클러스터링하고 등급을 매기려면 거래 시간과 예금 금액이 중요한 기능인 반면 고객 성별과 연령은 노이즈일 수 있습니다. 성별 및 연령 기능을 사용하면 비슷한 성별과 연령의 고객을 얻을 수 있습니다!

비지도 클러스터링을 위한 기능 선택:

  • 한편으로 비즈니스 의미를 결합하고 비즈니스 시나리오에 가까운 기능을 선택할 수 있습니다.

  • 한편, 결측률, 유사도 및 PCA와 같은 일반적인 기능 선택(차원 축소) 방법을 결합하여 노이즈를 제거하고 계산을 줄이며 차원 폭발을 방지할 수 있습니다. 또한 태스크에 레이블 정보가 있는 경우 레이블에 피쳐의 피쳐 중요도(예: xgboost의 피쳐 중요도, 피쳐의 IV 값)를 결합하는 방법이기도 합니다.

  • 마지막으로, 신경망의 특징 표현(즉, 딥 클러스터링의 개념. 나중에 특별히 소개함), 예를 들어 word2vec는 고차원 단어 벡터 공간을 저차원으로 표현하는 데 사용할 수 있습니다. 차원 분포 벡터.

추천 기사

기술교류

재인쇄, 수집, 좋아요 및 지원을 환영합니다!

여기에 이미지 설명 삽입

현재 2,000명 이상의 회원 이 있는 기술 교류 그룹이 개설되었습니다 .추가할 때 참고하는 가장 좋은 방법은 출처 + 관심 방향, 같은 생각을 가진 친구를 찾기에 편리합니다.

  • 방법 1. 다음 사진을 WeChat에 보내고, 길게 눌러 식별하고, 백그라운드에서 회신합니다. 그룹 추가;
  • 방법 ②, 마이크로 신호 추가: dkl88191 , 참고: CSDN에서
  • ③ 방법, 위챗 공개계정 검색 : 파이썬 학습 및 데이터 마이닝 , 백그라운드 회신 : 그룹 추가

길게 눌러 팔로우

추천

출처blog.csdn.net/weixin_38037405/article/details/124315032