K-means 算法实现

步骤 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 类后的数据散点图,可以发现,存在较多的样本点被聚到了错误
的簇中

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值