sklearn聚类算法之Kmeans

基本思想

K-Means聚类是最常见的一种聚类算法。在K-Means聚类中,算法试图把观察值分到k个组中,每个组的方差都差不多。分组的数量k是用户设置的一个超参数。具体来讲,K-Means算有如下几个步骤:

  1. 随机创建k个分组(即cluster)的“中心“点

  2. 对于每个观察值:

    (1) 算出每个观察值和这k个中心点之间的距离

    (2) 将观察值指派到离它最近的中心点的分组

  3. 将中心点移动到相应分组的点的平均值位置

  4. 重复步骤2和3,直到没有观察值需要改变它的分组。这时算法就被认为已经收敛,而且可以停止了

关于K-Means算法,有3点值得注意。第一,K-means聚类假设所有的聚类是凸形的(比如,圆形或者球形)。第二,所有特征在同一度量范围内。第三,分组之间是均衡的(即每个分组中观察值的数量大致相等)。如果你认为自己无法满足这些假设,就可能需要尝试其他的聚类方法。

API学习

class sklearn.cluster.KMeans(
	n_clusters=8,
	*, 
	init='k-means++', 
	n_init=10, 
	max_iter=300, 
	tol=0.0001, 
	verbose=0, 
	random_state=None, 
	copy_x=True, 
	algorithm='auto'
)
参数 类型 解释
n_clusters int, default=8 K-Means中的k,表示聚类数
init {‘k-means++’, ‘random’}, default=‘k-means++’ 'k-means++'用一种特殊的方法选定初始质心加速迭代过程收敛,'random’随机选取初始质心
n_init int, default=10 用不同的聚类中心初始化值运行算法的次数,最后的解是inertial意义下选出的最优结果
max_iter int, default=300 运行的最多迭代数
tol float, default=1e-4 容忍的最小误差,当误差小于tol就会退出迭代
verbose int, default=0 是否输出详细信息
random_state int, RandomState instance or None, default=None 用于初始化质心得生成器(generator)。如果值为一个整数,则确定一个seed
copy_x bool, default=True 如果为True,表示计算距离不会修改源数据
algorithm {“auto”, “full”, “elkan”}, default=“auto” 优化算法,full表示一般的K-Means算法,elkan表示elkan K-Means算法,auto根据数据是否稀疏进行选择
属性 类型 解释
cluster_centers_ ndarray of shape(n_clusters, n_features) 聚类中心的坐标
labels_ ndarray of shape(n_samples,) 分类结果
inertia_ float 样本到其最近聚类中心的距离平方和
n_iter_ int 运行的迭代次数
n_features_in_ int 拟合期间的特征个数
feature_names_in_ ndarray of shape(n_features_in_,) 拟合期间的特征名称
方法 说明
fit(X[, y, sample_weight]) Compute k-means clustering.
fit_predict(X[, y, sample_weight]) Compute cluster centers and predict cluster index for each sample.
fit_transform(X[, y, sample_weight]) Compute clustering and transform X to cluster-distance space.
get_params([deep]) Get parameters for this estimator.
predict(X[, sample_weight]) Predict the closest cluster each sample in X belongs to.
score(X[, y, sample_weight]) Opposite of the value of X on the K-means objective.
set_params(**params) Set the parameters of this estimator.
transform(X) Transform X to a cluster-distance space.

代码示例

>>> from sklearn.cluster import KMeans
>>> import numpy as np
>>> X = np.array([[1, 2], [1, 4], [1, 0],
...               [10, 2], [10, 4], [10, 0]])
>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
>>> kmeans.labels_
array([1, 1, 1, 0, 0, 0], dtype=int32)
>>> kmeans.predict([[0, 0], [12, 3]])
array([1, 0], dtype=int32)
>>> kmeans.cluster_centers_
array([[10.,  2.],
       [ 1.,  2.]])

优秀作品学习

import numpy as np
import matplotlib.pyplot as plt

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

plt.figure(figsize=(12, 12))

n_samples = 1500
random_state = 170
X, y = make_blobs(n_samples=n_samples, random_state=random_state)

# Incorrect number of clusters
y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)

plt.subplot(221)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.title("Incorrect Number of Blobs")

# Anisotropicly distributed data
transformation = [[0.60834549, -0.63667341], [-0.40887718, 0.85253229]]
X_aniso = np.dot(X, transformation)
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_aniso)

plt.subplot(222)
plt.scatter(X_aniso[:, 0], X_aniso[:, 1], c=y_pred)
plt.title("Anisotropicly Distributed Blobs")

# Different variance
X_varied, y_varied = make_blobs(
    n_samples=n_samples, cluster_std=[1.0, 2.5, 0.5], random_state=random_state
)
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_varied)

plt.subplot(223)
plt.scatter(X_varied[:, 0], X_varied[:, 1], c=y_pred)
plt.title("Unequal Variance")

# Unevenly sized blobs
X_filtered = np.vstack((X[y == 0][:500], X[y == 1][:100], X[y == 2][:10]))
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_filtered)

plt.subplot(224)
plt.scatter(X_filtered[:, 0], X_filtered[:, 1], c=y_pred)
plt.title("Unevenly Sized Blobs")

plt.show()

运行结果:
sklearn聚类算法之Kmeans_第1张图片

你可能感兴趣的:(sklearn机器学习笔记,sklearn,算法,kmeans)