Python 기계 학습 의 Kmeans 기초 알고리즘

1.K-means 기초 알고리즘 소개
k-maeans 알고리즘 은 일종 의 집합 알고리즘 이다.이른바 집합 이란 유사 성 원칙 에 따라 비교적 높 은 싱크로 율 을 가 진 데이터 대상 을 같은 클래스 로 나 누고 비교적 높 은 싱크로 율 을 가 진 데이터 대상 을 다른 클래스 로 나 누 는 것 이다.집합 과 분류의 가장 큰 차이 점 은 집합 과정 은 감독 과정 이 없다 는 것 이다.즉,처리 해 야 할 데이터 대상 은 선험 지식 이 없고 분류 과정 은 감독 과정,즉 선험 지식 이 있 는 훈련 데이터 세트 가 존재 한 다 는 것 이다.
2.알고리즘 과정
K-means 중심 사상:상수 K 를 미리 확정 하고 상수 K 는 최종 집합(또는 클 러 스 터 라 고 함)유형 수 를 의미한다.먼저 초기 점 을 질량 심 으로 무 작위 로 선정 하고 모든 견본 과 질량 심 간 의 싱크로 율(여 기 는 유럽식 거리)을 계산 하여 견본 점 을 가장 비슷 한 유형 으로 분류 한 다음 에 각 유형의 질량 심(즉,유형 중심)을 다시 계산 하여 이런 과정 을 반복 한다.질량 심 이 더 이상 변 하지 않 을 때 까지 최종 적 으로 모든 견본 이 속 한 유형 과 각 유형의 질량 심 을 확정 했다.매번 모든 견본 과 각 질량 심 간 의 싱크로 율 을 계산 해 야 하기 때문에 대규모 데이터 세트 에서 K-Means 알고리즘 은 수렴 속도 가 비교적 느리다.
1.분류 알고리즘:
전형 적 인 무 감독 학습 알고리즘 으로 비슷 한 견본 을 하나의 유형 에 자동 으로 분류 하 는 데 사용 된다.
분류 알고리즘 과 분류 알고리즘 의 가장 큰 차이 점 은 분류 알고리즘 은 감독 이 없 는 학습 알고리즘 이 고 분류 알고리즘 은 감독의 학습 에 속한다.
알고리즘,분 류 는 결 과 를 안다.
집합 알고리즘 에서 견본 간 의 유사 성에 따라 견본 을 서로 다른 유형 으로 나 누고 서로 다른 싱크로 율 계산 방법 에 대해 서로 다른 집합 결 과 를 얻 을 수 있 으 며 자주 사용 하 는 싱크로 율 계산 방법 은 유럽식 거리 법 이 있다.
2.분류:
물리 적 또는 추상 적 대상 의 집합 은 유사 한 대상 으로 구 성 된 여러 가지 유형 으로 나 뉘 는 과정 을 집합 이 라 고 한다.집합 에서 생 성 된 클 러 스 터 는 데이터 대상 의 집합 으로 이 대상 들 은 같은 클 러 스 터 의 대상 과 서로 비슷 하 며 다른 클 러 스 터 의 대상 과 다르다.
3.묶음:
이 알고리즘 은 데이터 집합 류 를 k 류,즉 k 개의 클 러 스 터 로 이해 할 수 있 습 니 다.
4.질량 중심:
각 유형의 중심 위치,즉 떨 기 중심 을 가리킨다.
5.거리 공식:
자주 사용 되 는 것 은 유클리드 거리(오 씨 거리),맨 해 튼 거리,민 코 프 스키 거리 등 이 있다.
3.문자 절차
1.처리 할 데이터 세트 지정
2.클 러 스 터 의 개수 k(kmeans 알고리즘 이 초 매개 변 수 를 전달 할 때 최대 K 값 만 설정 합 니 다)
3.K 개의 클 러 스 터 를 임의로 생 성하 고 K 개의 클 러 스 터 를 생 성 하 는 중심 은 각각 c 1,c 2,...,c k c1,c2,...,ck c1,c2,...,ck 이다.각 묶음 의 견본 수량 은 N 1,N 2,..,N 3 N1,N2,...,N3 N1,N2,...,N3 이다.
4.유클리드 거리 공식 을 통 해 각 점 에서 각 질량 심 까지 의 거 리 를 계산 하고 각 점 을 가장 가 까 운 질량 심 에 나 누 어 데이터 집합 을 K 류 점 으로 초보 적 으로 나눈다.
5.질 심 업데이트:아래 의 공식 을 통 해 모든 질 심 을 업데이트 합 니 다.즉,새로운 질량 심 의 수 치 는 현재 이 질량 심 이 속 한 모든 점 의 평균 값 과 같다.c j = 1 N j ∑ i = 1 N j x i , y i c_{j}=\frac{1}{N_{j}}\sum_{i=1}^{N{j}}x_{i},y_{i} cj​=Nj​1​i=1∑Nj​xi​,yi​
6.수렴 요 구 를 충족 시 킬 때 까지 상기 절 차 를 반복 한다.(보통 확실한 중심 점 은 변 하지 않 는 다.)
도형 전시
在这里插入图片描述
상술 한 절차 에 따라 우 리 는 분류 과정 을 더욱 잘 이해 할 수 있다.
5.코드 구현

x    ],[   y    ]]
for i in range(m):
    if i < m/3: 
        data[0].append(uniform(1,5))#    
        data[1].append(uniform(1,5))
    elif i < 2*m/3:
        data[0].append(uniform(6,10))
        data[1].append(uniform(1,5))
    else:
        data[0].append(uniform(3,8))
        data[1].append(uniform(5,10))
#            
plt.scatter(data[0],data[1])
plt.xlim(0,11)
plt.ylim(0,11)
plt.show()

#        
def distEuclid(x1,y1,x2,y2):
    d = sqrt((x1-x2)**2+(y1-y2)**2)
    return d

cent0 = [uniform(2,9),uniform(2,9)] #   K=3    ,    
cent1 = [uniform(2,9),uniform(2,9)] #[x,y]
cent2 = [uniform(2,9),uniform(2,9)]
mark = [] #    
dist = [[],[],[]]#            
#  
for n in range(50):
    #            
    for i in range(m):
        dist[0].append(distEuclid(cent0[0],cent0[1],data[0][i],data[1][i]))
        dist[1].append(distEuclid(cent1[0],cent1[1],data[0][i],data[1][i]))
        dist[2].append(distEuclid(cent2[0],cent2[1],data[0][i],data[1][i]))
    #       
    sum0_x = sum0_y = sum1_x = sum1_y = sum2_x = sum2_y = 0
    number0 = number1 = number2 = 0
    for i in range(m):
        if dist[0][i]<dist[1][i] and dist[0][i]<dist[2][i]:
            mark.append(0)
            sum0_x += data[0][i]
            sum0_y += data[1][i]
            number0 += 1
        elif dist[1][i]<dist[0][i] and dist[1][i]<dist[2][i]:
            mark.append(1)
            sum1_x += data[0][i]
            sum1_y += data[1][i]
            number1 += 1
        elif dist[2][i]<dist[0][i] and dist[2][i]<dist[1][i]:
            mark.append(2)
            sum2_x += data[0][i]
            sum2_y += data[1][i]
            number2 += 1    
    #    
    cent0 = [sum0_x/number0,sum0_y/number0]
    cent1 = [sum1_x/number1,sum1_y/number1]
    cent2 = [sum2_x/number2,sum2_y/number2]

#  
for i in range(m):
    if mark[i] == 0:
        plt.scatter(data[0][i],data[1][i],color='red')
    if mark[i] == 1:
        plt.scatter(data[0][i],data[1][i],color='blue')
    if mark[i] == 2:
        plt.scatter(data[0][i],data[1][i],color='green')     
plt.scatter(cent0[0],cent0[1],marker='*',color='red')
plt.scatter(cent1[0],cent1[1],marker='*',color='blue')
plt.scatter(cent2[0],cent2[1],marker='*',color='green')
plt.xlim(0,11)
plt.ylim(0,11)
plt.show()
        
상기 코드 데이터 선택 은 무 작위 로 생 성 된 것 으로 매번 실행 결과 가 다 르 기 때문에 테스트 를 통 해 분류 가 이상 적 이지 않 은 효 과 를 발견 할 수 있 습 니 다.기초 알고리즘 에 큰 폐단 이 존재 한 다 는 것 을 설명 하기 위해 우 리 는 개선 이 필요 하 다.본 편의 내용 을 바탕 으로 지식 을 개선 하 는 설명 을 하지 않 는 다.
몇 가지 비교적 좋 은 분류在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
몇 가지 비교적 나 쁜 분류在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
소결
장점.
알고리즘 이 간단 하고 실현 하기 쉽다.
클 러 스 터 효 과 는 K 값 선택 에 의존 합 니 다.
결점.
사용자 가 미리 클래스 갯 수 를 지정 해 야 합 니 다.
집합 결 과 는 초기 클 러 스 터 센터 의 선택 에 비교적 민감 하 다.
국부 최 우수 에 빠 지기 쉽다.구형 클 러 스 터 만 발견 할 수 있 습 니 다.
파 이 썬 머 신 러 닝 의 KMeans 기초 알고리즘 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.파 이 썬 KMeans 기초 알고리즘 에 관 한 더 많은 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기