>  기사  >  백엔드 개발  >  Python에서 K-평균 알고리즘 구현

Python에서 K-평균 알고리즘 구현

小云云
小云云원래의
2017-12-06 10:28:101837검색

K-평균은 기계 학습에서 일반적으로 사용되는 알고리즘입니다. 데이터 클러스터링에 자주 사용되는 알고리즘으로 데이터를 여러 범주로 자동 집계하기만 하면 됩니다. 한 클러스터에 있는 데이터의 유사성은 높고, 다른 클러스터에 있는 데이터의 유사성은 낮습니다.

K-MEANS 알고리즘은 k개의 클러스터 수와 n개의 데이터 객체가 포함된 데이터베이스를 입력하고 최소 분산 기준을 충족하는 k개의 클러스터를 출력하는 알고리즘입니다. k-평균 알고리즘은 입력 수량 k를 받아들인 다음 n개의 데이터 개체를 k개의 클러스터로 나누어 얻은 클러스터가 다음을 충족하도록 합니다. 동일한 클러스터에 있는 개체의 유사성은 더 높고 다른 클러스터에 있는 개체의 유사성은 더 작습니다. 이 기사에서는 Python에서 K-평균 알고리즘을 구현하는 방법을 소개합니다.

핵심 아이디어

k개 클러스터에 대한 분할 방식을 반복적으로 찾아 해당 k개 클러스터의 평균을 사용하여 해당 유형의 샘플을 나타낼 때 얻는 전체 오류가 최소화됩니다.

k 클러스터는 다음과 같은 특징을 가지고 있습니다. 각 클러스터 자체는 최대한 컴팩트하며 각 클러스터는 최대한 분리되어 있습니다.

k-평균 알고리즘은 최소 오류 제곱합 기준을 기반으로 합니다. K-menas의 장점과 단점:

장점:

간단한 원리
빠른 속도
대규모 데이터 세트에 대한 확장성이 비교적 좋습니다.

단점:

군집 수를 지정해야 함 K
이상값에 민감함
초기값에 민감함

K-평균의 군집화 과정

군집화 과정은 경사하강법과 유사 알고리즘 확립 비용 함수 및 반복을 통해 비용 함수 값을 점점 더 작게 만듭니다

c개 클래스의 초기 중심을 적절하게 선택합니다.
k번째 반복에서 모든 샘플에 대해 c 중심까지의 거리를 구하고, 가장 짧은 거리를 가진 중심이 위치한 클래스로 샘플을 분류합니다.
평균과 같은 방법을 사용하여 클래스의 중심 값을 업데이트합니다.
모든 c 클러스터 중심에 대해 반복 방법을 사용하여 업데이트한 후에도 값이 변경되지 않은 경우; (2) (3), 반복이 종료되고, 그렇지 않으면 반복이 계속됩니다.

이 알고리즘의 가장 큰 장점은 단순성과 속도입니다. 알고리즘의 핵심은 초기 중심과 거리 공식을 선택하는 데 있습니다.

K-수단 예제는 Python에서 km의 일부 매개변수를 보여줍니다.

sklearn.cluster.KMeans(
  n_clusters=8,
  init='k-means++', 
  n_init=10, 
  max_iter=300, 
  tol=0.0001, 
  precompute_distances='auto', 
  verbose=0, 
  random_state=None, 
  copy_x=True, 
  n_jobs=1, 
  algorithm='auto'
  )
n_clusters: 簇的个数,即你想聚成几类
init: 初始簇中心的获取方法
n_init: 获取初始簇中心的更迭次数,为了弥补初始质心的影响,算法默认会初始10个质心,实现算法,然后返回最好的结果。
max_iter: 最大迭代次数(因为kmeans算法的实现需要迭代)
tol: 容忍度,即kmeans运行准则收敛的条件
precompute_distances:是否需要提前计算距离,这个参数会在空间和时间之间做权衡,如果是True 会把整个距离矩阵都放到内存中,auto 会默认在数据样本大于featurs*samples 的数量大于12e6 的时候False,False 时核心实现的方法是利用Cpython 来实现的
verbose: 冗长模式(不太懂是啥意思,反正一般不去改默认值)
random_state: 随机生成簇中心的状态条件。
copy_x: 对是否修改数据的一个标记,如果True,即复制了就不会修改数据。bool 在scikit-learn 很多接口中都会有这个参数的,就是是否对输入数据继续copy 操作,以便不修改用户的输入数据。这个要理解Python 的内存机制才会比较清楚。
n_jobs: 并行设置
algorithm: kmeans的实现算法,有:'auto', ‘full', ‘elkan', 其中 ‘full'表示用EM方式实现
虽然有很多参数,但是都已经给出了默认值。所以我们一般不需要去传入这些参数,参数的。可以根据实际需要来调用。


코드 예제는 아래에 표시됩니다.


from sklearn.cluster import KMeans
from sklearn.externals import joblib
from sklearn import cluster
import numpy as np

# 生成10*3的矩阵
data = np.random.rand(10,3)
print data
# 聚类为4类
estimator=KMeans(n_clusters=4)
# fit_predict表示拟合+预测,也可以分开写
res=estimator.fit_predict(data)
# 预测类别标签结果
lable_pred=estimator.labels_
# 各个类别的聚类中心值
centroids=estimator.cluster_centers_
# 聚类中心均值向量的总和
inertia=estimator.inertia_

print lable_pred
print centroids
print inertia

代码执行结果
[0 2 1 0 2 2 0 3 2 0]

[[ 0.3028348  0.25183096 0.62493622]
 [ 0.88481287 0.70891813 0.79463764]
 [ 0.66821961 0.54817207 0.30197415]
 [ 0.11629904 0.85684903 0.7088385 ]]
 
0.570794546829


이번에는 디스플레이를 만듭니다. 그림에서는 2차원을 그리는 것이 더 직관적이므로 데이터를 2차원으로 조정하여 100개 항목을 선택합니다. 보시다시피 클러스터링 효과는 여전히 좋습니다. k-평균의 클러스터링 효율성에 대한 테스트를 수행하고 차원을 50차원으로 확장했습니다.


50차원

1000000개 항목

4'13s


50차원

수백만 개의 데이터에 대해 피팅 시간은 여전히 ​​허용되며 효율성도 여전히 좋다는 것을 알 수 있습니다. 모델은 다른 기계 학습 알고리즘 모델을 저장하는 것과 유사합니다


from sklearn.cluster import KMeans
from sklearn.externals import joblib
from sklearn import cluster
import numpy as np
import matplotlib.pyplot as plt

data = np.random.rand(100,2)
estimator=KMeans(n_clusters=3)
res=estimator.fit_predict(data)
lable_pred=estimator.labels_
centroids=estimator.cluster_centers_
inertia=estimator.inertia_
#print res
print lable_pred
print centroids
print inertia

for i in range(len(data)):
  if int(lable_pred[i])==0:
    plt.scatter(data[i][0],data[i][1],color='red')
  if int(lable_pred[i])==1:
    plt.scatter(data[i][0],data[i][1],color='black')
  if int(lable_pred[i])==2:
    plt.scatter(data[i][0],data[i][1],color='blue')
plt.show()
위 내용은 Python에서 K-평균 알고리즘을 구현한 내용입니다. 관련 권장 사항: k-평균 클러스터링 알고리즘을 사용하여 그림의 기본 색상을 식별합니다_PHP 튜토리얼
k-평균 클러스터링 알고리즘을 사용하여 그림의 기본 색상을 식별합니다.
K-평균 이해 이미지를 통한 알고리즘

위 내용은 Python에서 K-평균 알고리즘 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.