步骤 1 导入依赖
make_blobs
用于产生本次实验所需的数据集,
matplotlib
用于数据可视化,
KMeans
用于
Kmeans
算法拟合训练。
输入:
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
步骤 2 生成数据集
make_blobs()
可以用来生成聚类任务的数据集,它会返回产生的数据集以及相应标签。但是需
要注意的是,
Kmean
算法是用于处理无标签数据集的,也就是,在实际使用
Kmeans
算法的时
候,数据集是不含标签的。此处为方便大家理解,产生的数据集包含了标签信息。
其中,
n_samples
表示样本数量,
n_features
表示每个样本的特征数,也表示数据的维度,
centers
表示类别数,
random_state
表示随机生成器的种子,可以固定生成的数据,给定之
后,每次生成的数据集就是固定的。
输入
X, y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)
查看产生的数据集的维度信息。
输入:
print("X 的维度为:{}".format(X.shape))
print("y 的维度为:{}".format(y.shape))
输出:
X
的维度为:
(500, 2)
y
的维度为:
(500,)
可以看到,该数据集一共包含
500
个样本点,每个样本点包含了
2
个特征。
步骤 3 绘制散点图
首先,直接绘制该数据集的散点图,此时不考虑该数据集在生成时对应的标签。从图中我们可
以看到
4
个不同的簇。
输入:
fig, ax1 = plt.subplots(1)
ax1.scatter(X[:, 0], X[:, 1]
,marker='o' # 设置点的形状为圆形
,s=8 # 设置点的大小
)
plt.show()
接下来,我们根据生成数据集时对应的标签,按照不同颜色绘制散点图。
输入:
color = ["red","pink","orange","green"]
fig, ax1 = plt.subplots(1)
for i in range(4):
ax1.scatter(X[y==i, 0], X[y==i, 1] # 根据每个点的标签绘制
,marker='o' # 设置点的形状为圆形
,s=8 # 设置点的大小
,c=color[i]
)
plt.show()
步骤 4 Kmeans 聚类
调用
Sklearn
提供的
sklearn.cluster.KMeans
实现
K-means
聚类。首先我们将数据集聚成
3
类。
输入:
n_clusters = 3
cluster1 = KMeans(n_clusters=n_clusters,random_state=3).fit(X)
查看聚类后的每一个样本点的标签。
输入:
y_pred1 = cluster1.labels_
print(y_pred1)
打印每个簇的质心。
输入:
centroid1 = cluster1.cluster_centers_
print(centroid1)
可视化聚类结果。
输入:
color = ["red","pink","orange","gray"]
fig, ax1 = plt.subplots(1)
for i in range(n_clusters):
ax1.scatter(X[y_pred1==i, 0], X[y_pred1==i, 1]
,marker='o' #点的形状
,s=8 #点的大小
,c=color[i]
)
ax1.scatter(centroid1[:,0],centroid1[:,1]
,marker="x"
,s=15
,c="black")
plt.show()
可以看到,数据集被聚成了
3
个簇,每个簇的质心用黑色
x
表示。
步骤
5
再次
Kmeans
聚类
接下来,我们按照上述步骤重新实现
Kmeans
聚类,这次我们聚为
4
类。
输入:
n_clusters = 4
cluster2 = KMeans(n_clusters=n_clusters,random_state=0).fit(X)
y_pred2 = cluster2.labels_
centroid2 = cluster2.cluster_centers_
print("质心:{}".format(centroid2))
可视化聚类结果。
输入:
color = ["red","pink","orange","green"]
fig, ax1 = plt.subplots(1)
for i in range(n_clusters):
ax1.scatter(X[y_pred2==i, 0], X[y_pred2==i, 1]
,marker='o' #点的形状
,s=8 #点的大小
,c=color[i]
)
ax1.scatter(centroid2[:,0],centroid2[:,1]
,marker="x"
,s=15
,c="black")
plt.show()
可以看到,数据集被聚成了 4 个簇,每个簇的质心用黑色 x 表示。大家可以对比带有标签信息
的原始数据散点图和被聚为 4 类后的数据散点图,可以发现,存在较多的样本点被聚到了错误
的簇中