Python 에서 실 현 된 KMeans 분류 알고리즘 실례 분석
초보 자 프로 그래 밍,최근 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 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.