k-mean聚类的python实现

时间:2022-12-31 16:53:37


作者:张双双

介绍

sklearn.cluster模块提供了常用的非监督聚类算法。 该模块中每一个聚类算法都有两个变体: 一个是类(class)另一个是函数(function)。 类实现了fit方法来从训练数据中学习聚类;对类来说,训练过程得到的标签数据可以在属性 labels_ 中找到。 函数接受训练数据返回对应于不同聚类的一个整数标签数组。

KMeans()函数介绍

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')

参数介绍:

  • 1.n_clusters:整形,默认=8 ,生成的聚类数,即产生的质心(centroids)数。

  • 2.max_iter:整形,默认=300 ,执行一次k-means算法所进行的最大迭代数。

  • 3.n_init:整形,默认=10 ,用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。

  • 4.init:有三个可选值:k-means++, random,或者传递一个ndarray向量。 此参数指定初始化方法,默认值为kmeans++。
    (1)k-means++用一种特殊的方法选定初始质心从而能加速迭代过程的收敛(即上文中的k-means++介绍)
    (2)random随机从训练数据中选取初始质心。
    (3)如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。

  • 5.precompute_distances:三个可选值,‘auto’,True 或者 False。 预计算距离,计算速度更快但占用更多内存。
    (1)auto:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。
    (2)True:总是预先计算距离。
    (3)False:永远不预先计算距离。

  • 6.tol:float形,默认值= 1e-4 与inertia结合来确定收敛条件。

  • 7.n_jobs:整形数。指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。
    (1)若值为 -1,则用所有的CPU进行运算。若值为1,则不进行并行运算,这样的话方便调试。
    (2)若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。

  • 8.random_state:整形或 numpy.RandomState 类型,可选用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。

  • 9.copy_x:布尔型,默认值=True.当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

实例

导入相关包

import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd
from sklearn import datasets 
from sklearn.cluster import KMeans
from sklearn import preprocessing
from sklearn.cluster import MiniBatchKMeans
from yellowbrick.cluster import KElbowVisualizer
from yellowbrick.cluster import SilhouetteVisualizer
from yellowbrick.cluster import InterclusterDistance

整理数据

iris = datasets.load_iris() 
X = iris.data[:, :4] # #表示我们取特征空间中的4个维度
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(X)

手肘法确定分类个数

# Elbow method 手肘法
plt.figure(figsize=(6,4))
model = KMeans()
visualizer = KElbowVisualizer(model, k=(1,8))
visualizer.fit(x_scaled)       
visualizer.show() 

k-mean聚类的python实现
确定分类个数为2。

创建模型

estimator = KMeans(n_clusters=2) # 构造聚类器
estimator.fit(x_scaled) # 聚类
label_pred1 = estimator.labels_ # 获取聚类标签

绘制结果

# 绘制结果
x0 = X[label_pred1 == 0]
x1 = X[label_pred1 == 1]
plt.scatter(x0[:, 0], x0[:, 1], c="red", marker='o', label='label0') 
plt.scatter(x1[:, 0], x1[:, 1], c="green", marker='*', label='label1') 
plt.xlabel('sepal length') 
plt.ylabel('sepal width') 
plt.legend(loc=2) 
plt.show()

k-mean聚类的python实现

分为3类的结果

estimator = KMeans(n_clusters=3) # 构造聚类器
estimator.fit(x_scaled) # 聚类
label_pred1 = estimator.labels_ # 获取聚类标签
# 绘制结果
x0 = X[label_pred1 == 0]
x1 = X[label_pred1 == 1]
x2 = X[label_pred1 == 2]
plt.scatter(x0[:, 0], x0[:, 1], c="red", marker='o', label='label0') 
plt.scatter(x1[:, 0], x1[:, 1], c="green", marker='*', label='label1') 
plt.scatter(x2[:, 0], x2[:, 1], c="blue", marker='+', label='label2') 
plt.xlabel('sepal length') 
plt.ylabel('sepal width') 
plt.legend(loc=2) 
plt.show()

k-mean聚类的python实现