python机器学习库sklearn——k均值聚类[通俗易懂]

Python (95) 2023-03-27 17:56

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说python机器学习库sklearn——k均值聚类[通俗易懂],希望能够帮助你!!!。
python机器学习库sklearn——k均值聚类[通俗易懂]_https://bianchenghao6.com/blog_Python_第1张
python机器学习库sklearn——k均值聚类[通俗易懂]_https://bianchenghao6.com/blog_Python_第2张

全栈工程师开发手册 (作者:栾鹏)

python数据挖掘系列教程

k均值聚类的相关的知识内容可以参考
http://blog.csdn.net/luanpeng825485697/article/details/78347433

K-means

k-means 算法将一组 N 样本 X 划分成 K 不相交的 clusters (簇) C, 每个都用 cluster (该簇)中的样本的均值 $mu_j $描述。 这个 means (均值)通常被称为 cluster(簇)的 “centroids(质心)”; 注意,它们一般不是从 X 中挑选出的点,虽然它们是处在同一个 space(空间)。 K-means(K-均值)算法旨在选择最小化 inertia(惯性) 或 within-cluster sum of squared(簇内和的平方和)的标准的 centroids(质心):

k均值聚类过程:
1、构造数据集。
2、使用数据集进行k均值算法。
3、可视化聚类效果。


from sklearn.cluster import Birch  # 从sklearn.cluster机器学习聚类包中导入Birch聚类
from sklearn.cluster import KMeans  # 从sklearn.cluster机器学习聚类包中导入KMeans聚类

"""
第1部分:数据集
X表示二维矩阵数据,篮球运动员比赛数据
总共20行,每行两列数据
第一列表示球员每分钟助攻数:x1
第二列表示球员每分钟得分数:x2
"""

X = [[0.0888, 0.5885],[0.1399, 0.8291],[0.0747, 0.4974],[0.0983, 0.5772],[0.1276, 0.5703],
     [0.1671, 0.5835],[0.1906, 0.5276],[0.1061, 0.5523],[0.2446, 0.4007],[0.1670, 0.4770],
     [0.2485, 0.4313],[0.1227, 0.4909],[0.1240, 0.5668],[0.1461, 0.5113],[0.2315, 0.3788],
     [0.0494, 0.5590],[0.1107, 0.4799],[0.2521, 0.2735],[0.1007, 0.6318],[0.1067, 0.4326],
     [0.1456, 0.8280]
     ]

"""
第2部分:KMeans聚类
clf = KMeans(n_clusters=3) 表示类簇数为3,聚成3类数据,clf即赋值为KMeans
y_pred = clf.fit_predict(X) 载入数据集X,并且将聚类的结果赋值给y_pred
"""

clf = KMeans(n_clusters=3)  # 聚类算法,参数n_clusters=3,聚成3类
y_pred = clf.fit_predict(X)  # 直接对数据进行聚类,聚类不需要进行预测

# 输出完整Kmeans函数,包括很多省略参数
print('k均值模型:\n',clf)
# 输出聚类预测结果,20行数据,每个y_pred对应X一行或一个球员,聚成3类,类标为0、1、2
print('聚类结果:\n',y_pred)

"""
第3部分:可视化绘图
Python导入Matplotlib包,专门用于绘图
import matplotlib.pyplot as plt 此处as相当于重命名,plt用于显示图像
"""

import numpy as np
import matplotlib.pyplot as plt

# 获取第一列和第二列数据 使用for循环获取 n[0]表示X第一列
x1 = [n[0] for n in X]
x2 = [n[1] for n in X]

# 绘制散点图 参数:x横轴 y纵轴 c=y_pred聚类预测结果 marker类型 o表示圆点 *表示星型 x表示点
plt.scatter(x1, x2, c=y_pred, marker='x')

# 绘制标题
plt.title("Kmeans-Basketball Data")

# 绘制x轴和y轴坐标
plt.xlabel("x1")
plt.ylabel("x2")

# 显示图形
plt.show()

python机器学习库sklearn——k均值聚类[通俗易懂]_https://bianchenghao6.com/blog_Python_第3张

小批量 K-Means

MiniBatchKMeans 是 KMeans 算法的一个变体,它使用 mini-batches (小批量)来减少计算时间,同时仍然尝试优化相同的 objective function (目标函数)。 Mini-batches(小批量)是输入数据的子集,在每次 training iteration (训练迭代)中 randomly sampled (随机抽样)。这些小批量大大减少了融合到本地解决方案所需的计算量。 与其他降低 k-means 收敛时间的算法相反,mini-batch k-means 产生的结果通常只比标准算法略差。

该算法在两个主要步骤之间进行迭代,类似于 vanilla k-means 。 在第一步, b 样本是从数据集中随机抽取的,形成一个 mini-batch (小批量)。然后将它们分配到最近的 centroid(质心)。 在第二步,centroids (质心)被更新。与 k-means 相反,这是在每个样本的基础上完成的。对于 mini-batch (小批量)中的每个样本,通过取样本的 streaming average (流平均值)和分配给该质心的所有先前样本来更新分配的质心。 这具有随时间降低 centroid (质心)的 rate (变化率)的效果。执行这些步骤直到达到收敛或达到预定次数的迭代。

k均值聚类和小批量k均值聚类对比案例

import time
import numpy as np
import matplotlib.pyplot as plt

from sklearn.cluster import MiniBatchKMeans, KMeans
from sklearn.metrics.pairwise import pairwise_distances_argmin
from sklearn.datasets.samples_generator import make_blobs

# #############################################################################
# 产生样本数据
np.random.seed(0)

batch_size = 45
centers = [[1, 1], [-1, -1], [1, -1]]  # 三种聚类的中心
n_clusters = len(centers)
X, labels_true = make_blobs(n_samples=3000, centers=centers, cluster_std=0.7)  # 生成样本随机数

# #############################################################################
# k均值聚类

k_means = KMeans(init='k-means++', n_clusters=3, n_init=10)
begin_time = time.time()  # 记录训练开始时间
k_means.fit(X) # 聚类模型
t_batch = time.time() - begin_time  # 记录训练用时
print('k均值聚类时长:',t_batch)
# #############################################################################
# 小批量k均值聚类
# batch_size为每次更新使用的样本数
mbk = MiniBatchKMeans(init='k-means++', n_clusters=3, batch_size=batch_size,
                      n_init=10, max_no_improvement=10, verbose=0)
begin_time = time.time()  # 记录训练开始时间
mbk.fit(X) # 聚类模型
t_mini_batch = time.time() -  begin_time  # 记录训练用时
print('小批量k均值聚类时长:',t_mini_batch)
# #############################################################################
# 结果可视化
fig = plt.figure(figsize=(16, 6))  # 窗口大小
fig.subplots_adjust(left=0.02, right=0.98, bottom=0.05, top=0.9)  # # 窗口四周留白
colors = ['#4EACC5', '#FF9C34', '#4E9A06']  # 三种聚类的颜色

# 在两种聚类算法中,样本的所属类标号和聚类中心
k_means_cluster_centers = np.sort(k_means.cluster_centers_, axis=0) # 三个聚类点排序
mbk_means_cluster_centers = np.sort(mbk.cluster_centers_, axis=0) # 三个聚类点排序
k_means_labels = pairwise_distances_argmin(X, k_means_cluster_centers) # 计算X中每个样本与k_means_cluster_centers中的哪个样本最近。也就是获取所有对象的所属的类标签
mbk_means_labels = pairwise_distances_argmin(X, mbk_means_cluster_centers) # 计算X中每个样本与k_means_cluster_centers中的哪个样本最近。也就是获取所有对象的所属的类标签
order = pairwise_distances_argmin(k_means_cluster_centers,mbk_means_cluster_centers)  # 计算k均值聚类点相对于小批量k均值聚类点的索引。因为要比较两次聚类的结果的区别,所以类标号要对应上


# 绘制KMeans
ax = fig.add_subplot(1, 3, 1)
for k, col in zip(range(n_clusters), colors):
    my_members = k_means_labels == k  # 获取属于当前类别的样本
    cluster_center = k_means_cluster_centers[k]  # 获取当前聚类中心
    ax.plot(X[my_members, 0], X[my_members, 1], 'w',markerfacecolor=col, marker='.') # 绘制当前聚类的样本点
    ax.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,markeredgecolor='k', markersize=6) # 绘制聚类中心点
ax.set_title('KMeans')
ax.set_xticks(())
ax.set_yticks(())
plt.text(-3.5, 1.8,  'train time: %.2fs\ninertia: %f' % (t_batch, k_means.inertia_))

# 绘制MiniBatchKMeans
ax = fig.add_subplot(1, 3, 2)
for k, col in zip(range(n_clusters), colors):
    my_members = mbk_means_labels == k # 获取属于当前类别的样本
    cluster_center = mbk_means_cluster_centers[k] # 获取当前聚类中心
    ax.plot(X[my_members, 0], X[my_members, 1], 'w',markerfacecolor=col, marker='.') # 绘制当前聚类的样本点
    ax.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,markeredgecolor='k', markersize=6) # 绘制聚类中心点
ax.set_title('MiniBatchKMeans')
ax.set_xticks(())
ax.set_yticks(())
plt.text(-3.5, 1.8, 'train time: %.2fs\ninertia: %f' %(t_mini_batch, mbk.inertia_))

# 初始化两次结果中
different = (mbk_means_labels == 4)
ax = fig.add_subplot(1, 3, 3)

for k in range(n_clusters):
    different += ((k_means_labels == k) != (mbk_means_labels == order[k]))  # 将两种聚类算法中聚类结果不一样的样本设置为true,聚类结果相同的样本设置为false

identic = np.logical_not(different)  # 向量取反,也就是聚类结果相同设置true,聚类结果不相同设置为false

ax.plot(X[identic, 0], X[identic, 1], 'w',markerfacecolor='#bbbbbb', marker='.') # 绘制聚类结果相同的样本点
ax.plot(X[different, 0], X[different, 1], 'w',markerfacecolor='m', marker='.') # 绘制聚类结果不同的样本点
ax.set_title('Difference')
ax.set_xticks(())
ax.set_yticks(())

plt.show()

python机器学习库sklearn——k均值聚类[通俗易懂]_https://bianchenghao6.com/blog_Python_第4张

发表回复