Python 에서 실 현 된 KMeans 분류 알고리즘 실례 분석

이 글 의 사례 는 Python 이 실현 한 KMans 집합 알고리즘 을 다 루 었 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
초보 자 프로 그래 밍,최근 Python 3 를 이용 하여 몇 가지 간단 한 기계 학습 분석 방법 을 실현 하고 자신의 학습 과정 을 기록 하고 싶 습 니 다.
KMeans 알고리즘 자체 에 대해 서 는 소개 하지 않 겠 습 니 다.다음은 자신 이 겪 은 문 제 를 기록 하 겠 습 니 다.
1.초기 집합 센터 에 대한 선택
초기 클 러 스 터 센터 의 선택 은 일반적으로 다음 과 같 습 니 다.
(1)무 작위 선택
(2)무 작위 로 견본 중의 한 점 을 중심 점 으로 하고 이 점 을 통 해 거리 가 비교적 큰 점 을 두 번 째 중심 점 으로 선택 하여 이런 식 으로 유추 한다.
(3)계층 집합 등 알고리즘 을 사용 하여 초기 집합 센터 를 업데이트 합 니 다.
저 는 처음에 numpy 를 사용 하여 랜 덤 으로 k 개의 클 러 스 터 센터 를 만 들 었 습 니 다.

Center = np.random.randn(k,n)

그러나 집합 을 발견 할 때 몇 번 반복 한 후에 집합 중심 에 nan 이 나타 나 는데 어떻게 된 일 인지 잘 모 르 겠 어 요.
그래서 나 는 각각 시도 했다.
(1)데이터 세트 의 앞 K 개 견본 을 선택 하여 초기 중심 점 으로 한다.
(2)무 작위 K 개 견본 점 을 초기 집합 중심 으로 선택
둘 다 집합 을 완성 할 수 있 음 을 발 견 했 습 니 다.저 는 iris.csv 데이터 세트 를 사 용 했 습 니 다.앞의 K 개의 견본 점 을 선택 하여 데이터 세트 를 만 들 때 교체 횟수 는 고정 적 입 니 다.랜 덤 K 개의 점 을 선택 할 때 교체 횟수 는 랜 덤 피 드 의 선택 과 관련 이 있 고 집합 효과 도 다 릅 니 다.어떤 랜 덤 피 드 는 집합 이 빠 르 고 좋 으 며 어떤 것 은 느 리 고 나 쁩 니 다.

def InitCenter(k,m,x_train):
  #Center = np.random.randn(k,n)
  #Center = np.array(x_train.iloc[0:k,:]) #      k        
  Center = np.zeros([k,n])         #       k         
  np.random.seed(5)            #       
  for i in range(k):
    x = np.random.randint(m)
    Center[i] = np.array(x_train.iloc[x])
  return Center

2.유형 간 거리 에 대한 선택
간단 하기 위해 서 나 는 오 씨 거 리 를 직접 채 택 했 고 아직 다른 거리 알고리즘 을 시도 하지 않 았 다.

def GetDistense(x_train, k, m, Center):
  Distence=[]
  for j in range(k):
    for i in range(m):
      x = np.array(x_train.iloc[i, :])
      a = x.T - Center[j]
      Dist = np.sqrt(np.sum(np.square(a))) # dist = np.linalg.norm(x.T - Center)
      Distence.append(Dist)
  Dis_array = np.array(Distence).reshape(k,m)
  return Dis_array

3.집합 중지 조건 에 대한 선택
집합 종료 조건 에 대해 서 는 여러 가지 선택 방법 이 있 습 니 다.
(1)일정 횟수 교체
(2)집합 센터 의 업 데 이 트 는 주어진 한도 값 보다 작 습 니 다.
(3)류 중의 견본 은 더 이상 변화 하지 않 는 다.
제 가 사용 한 것 은 앞의 두 가지 방법 입 니 다.첫 번 째 는 간단 하지만 집합 효 과 는 통제 하기 어렵 고 서로 다른 데이터 세트 에 대해 안정성 도 부족 합 니 다.두 번 째 는 적당 하고 안정성 도 강하 다.세 번 째 방법 은 아직 시도 하지 않 았 습 니 다.나중에 사용 해 보 세 요.아마도 집합 정밀도 가 좀 더 높 을 것 입 니 다.

def KMcluster(x_train,k,n,m,threshold):
  global axis_x, axis_y
  center = InitCenter(k,m,x_train)
  initcenter = center
  centerChanged = True
  t=0
  while centerChanged:
    Dis_array = GetDistense(x_train, k, m, center)
    center ,axis_x,axis_y,axis_z= GetNewCenter(x_train,k,n,Dis_array)
    err = np.linalg.norm(initcenter[-k:] - center)
    print(err)
    t+=1
    plt.figure(1)
    p=plt.subplot(3, 3, t)
    p1,p2,p3 = plt.scatter(axis_x[0], axis_y[0], c='r'),plt.scatter(axis_x[1], axis_y[1], c='g'),plt.scatter(axis_x[2], axis_y[2], c='b')
    plt.legend(handles=[p1, p2, p3], labels=['0', '1', '2'], loc='best')
    p.set_title('Iteration'+ str(t))
    if err < threshold:
      centerChanged = False
    else:
      initcenter = np.concatenate((initcenter, center), axis=0)
  plt.show()
  return center, axis_x, axis_y,axis_z, initcenter

err 는 이번 집합 중심 점 과 지난번 집합 중심 점 사이 의 오 씨 거리 이다.
threshold 는 인위적으로 집합 을 중지 하 는 한도 값 으로 저 는 개인 적 으로 0.1 또는 0.01 로 설정 합 니 다.
매번 교체 할 때마다 발생 하 는 분 류 를 표시 하기 위해 저 는 상기 코드 를 수 정 했 습 니 다.matplotlib 를 사용 하여 매번 교체 하 는 산 점 도 를 보 여 주 었 습 니 다.
아래 에 제 가 데 이 터 를 테스트 할 때의 그림 을 동봉 합 니 다.서브 맵 설정 의 개 수 는 교체 횟수 에 따라 정 해 야 합 니 다.

나 는 몇 개의 데이터 세트 를 테스트 했 는데,집합 의 정 도 는 그래도 괜찮다.
iris 데이터 세트 를 사용 하여 분석 한 결 과 는:
err of Iteration 1 is 3.11443180281
err of Iteration 2 is 1.27568813621
err of Iteration 3 is 0.198909381512
err of Iteration 4 is 0.0
Final cluster center is  [[ 6.85        3.07368421  5.74210526  2.07105263]
 [ 5.9016129   2.7483871   4.39354839  1.43387097]
 [ 5.006       3.428       1.462       0.246     ]]
마지막 으로 모든 코드 를 동봉 합 니 다.잘못된 점 은 많이 비판 해 주 십시오.감사합니다.

#encoding:utf-8
"""
  Author:   njulpy
  Version:   1.0
  Data:   2018/04/11
  Project: Using Python to Implement KMeans Clustering Algorithm
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.cluster import KMeans
def InitCenter(k,m,x_train):
  #Center = np.random.randn(k,n)
  #Center = np.array(x_train.iloc[0:k,:]) #      k        
  Center = np.zeros([k,n])         #       k         
  np.random.seed(15)            #       
  for i in range(k):
    x = np.random.randint(m)
    Center[i] = np.array(x_train.iloc[x])
  return Center
def GetDistense(x_train, k, m, Center):
  Distence=[]
  for j in range(k):
    for i in range(m):
      x = np.array(x_train.iloc[i, :])
      a = x.T - Center[j]
      Dist = np.sqrt(np.sum(np.square(a))) # dist = np.linalg.norm(x.T - Center)
      Distence.append(Dist)
  Dis_array = np.array(Distence).reshape(k,m)
  return Dis_array
def GetNewCenter(x_train,k,n, Dis_array):
  cen = []
  axisx ,axisy,axisz= [],[],[]
  cls = np.argmin(Dis_array, axis=0)
  for i in range(k):
    train_i=x_train.loc[cls == i]
    xx,yy,zz = list(train_i.iloc[:,1]),list(train_i.iloc[:,2]),list(train_i.iloc[:,3])
    axisx.append(xx)
    axisy.append(yy)
    axisz.append(zz)
    meanC = np.mean(train_i,axis=0)
    cen.append(meanC)
  newcent = np.array(cen).reshape(k,n)
  NewCent=np.nan_to_num(newcent)
  return NewCent,axisx,axisy,axisz
def KMcluster(x_train,k,n,m,threshold):
  global axis_x, axis_y
  center = InitCenter(k,m,x_train)
  initcenter = center
  centerChanged = True
  t=0
  while centerChanged:
    Dis_array = GetDistense(x_train, k, m, center)
    center ,axis_x,axis_y,axis_z= GetNewCenter(x_train,k,n,Dis_array)
    err = np.linalg.norm(initcenter[-k:] - center)
    t+=1
    print('err of Iteration '+str(t),'is',err)
    plt.figure(1)
    p=plt.subplot(2, 3, t)
    p1,p2,p3 = plt.scatter(axis_x[0], axis_y[0], c='r'),plt.scatter(axis_x[1], axis_y[1], c='g'),plt.scatter(axis_x[2], axis_y[2], c='b')
    plt.legend(handles=[p1, p2, p3], labels=['0', '1', '2'], loc='best')
    p.set_title('Iteration'+ str(t))
    if err < threshold:
      centerChanged = False
    else:
      initcenter = np.concatenate((initcenter, center), axis=0)
  plt.show()
  return center, axis_x, axis_y,axis_z, initcenter
if __name__=="__main__":
  #x=pd.read_csv("8.Advertising.csv")  #       
  #x=pd.read_table("14.bipartition.txt")
  x=pd.read_csv("iris.csv")
  x_train=x.iloc[:,1:5]
  m,n = np.shape(x_train)
  k = 3
  threshold = 0.1
  km,ax,ay,az,ddd = KMcluster(x_train, k, n, m, threshold)
  print('Final cluster center is ', km)
  #2-Dplot
  plt.figure(2)
  plt.scatter(km[0,1],km[0,2],c = 'r',s = 550,marker='x')
  plt.scatter(km[1,1],km[1,2],c = 'g',s = 550,marker='x')
  plt.scatter(km[2,1],km[2,2],c = 'b',s = 550,marker='x')
  p1, p2, p3 = plt.scatter(axis_x[0], axis_y[0], c='r'), plt.scatter(axis_x[1], axis_y[1], c='g'), plt.scatter(axis_x[2], axis_y[2], c='b')
  plt.legend(handles=[p1, p2, p3], labels=['0', '1', '2'], loc='best')
  plt.title('2-D scatter')
  plt.show()
  #3-Dplot
  plt.figure(3)
  TreeD = plt.subplot(111, projection='3d')
  TreeD.scatter(ax[0],ay[0],az[0],c='r')
  TreeD.scatter(ax[1],ay[1],az[1],c='g')
  TreeD.scatter(ax[2],ay[2],az[2],c='b')
  TreeD.set_zlabel('Z') #    
  TreeD.set_ylabel('Y')
  TreeD.set_xlabel('X')
  TreeD.set_title('3-D scatter')
  plt.show()



첨부:상기 예시 중의 iris.csv 파일여 기 를 클릭 하여 본 사이트 다운로드
Python 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.
본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기