大家好久不见!之前给大家介绍了分类和聚类的区别、聚类的进一步介绍以及K-means聚类算法,大家看懂了吗?
本期,我们将带领大家动手实践,向大家讲解之前介绍的“K-means”算法如何通过编程实现。
4.1 Python的编程实现
如果您有过Python的编程经验,那么可以动手试试下面的编程实践!
01、代码:数据获取
#Python
import matplotlib.pyplot as plt # 导入用于绘图的包(这里用的是matplotlib的工具)
from sklearn.cluster import KMeans # 导入K-means算法的包
from sklearn import datasets # 导入sklearn自带的数据集
iris = datasets.load_iris() # 下载和导入iris鸢尾花数据集 英文单词iris : 鸢尾属植物
X = iris.data[:, :4] # 抽取特征空间中的前4个维度
print(X.shape)
print(X)
X.shape的输出结果:(150, 4)
说明该数据集是有具有4个维度的150行数据
02、代码:绘制数据分布图
# 绘制数据分布图
plt.scatter(X[:, 0], X[:, 1], c="red", marker='D', alpha=0.3)
# plt.scatter()函数的作用是绘制散点图 英文单词scatter : 零星散布的东西
# “c”指的是color颜色,作用是为散点图上的点设置颜色; 在上面的代码中将散点图的点的颜色设置为红(red)
# “marker”指的是散点图上的点的形状; 英文单词marker : 标识, 标记
plt.xlabel('sepal length') # 设置横轴名称
补充:英文单词sepal : [植]萼片;花萼
plt.ylabel('sepal width') # 设置纵轴名称
plt.title(label='Data Distribution Map', # 图的标题
fontsize=18, # 标题字体大小
color='white', # 标题字体颜色
backgroundcolor='#334f65', # 标题的底色
pad=20)
plt.show() # 展示绘制好的散点图
数据分布图如下,横轴为花瓣长度,纵轴为花瓣宽度。
03、代码:聚类并绘制结果
#Python
estimator = KMeans(n_clusters=3) # 构造聚类器, 设置聚类类别数为3
estimator.fit(X) # 聚类
label_pred = estimator.labels_ # 获取聚类标签
x0 = X[label_pred == 0] # 获取类别是“0”的数据对象
x1 = X[label_pred == 1] # 获取类别是“1”的数据对象
x2 = X[label_pred == 2] # 获取类别是“2”的数据对象
# “label_pred”的全称应为“label_prediction”
# 绘制 k-means 聚类结果
plt.scatter(x0[:, 0], x0[:, 1], c="red", marker='H', label='label0', alpha=0.3)
# 补充: plt.scatter()是绘制散点图的函数
# c指的是颜色
# marker指的是散点的形状
# label指的是标签的名称
# alpha指的是散点的透明度,取值为[0, 1],0表示完全透明,1表示完全不透明
plt.scatter(x1[:, 0], x1[:, 1], c="green", marker='*', label='label1', alpha=0.3)
plt.scatter(x2[:, 0], x2[:, 1], c="blue", marker='D', label='label2', alpha=0.3)
# 给散点图加上标题
plt.title('Clustering results', # 标题的名称
fontsize=18, # 标题的字体大小
color='white', # 标题的字体颜色
backgroundcolor='#334f65', # 标题的背景
pad=20) # 标题的边距
plt.xlabel('sepal length') # 横坐轴
plt.ylabel('sepal width') # 纵坐轴
plt.legend(loc=2) # 显示图例;“loc”为“location”的意思,设置这个
# 英文单词legend: (图片或地图的)文字说明,图例
plt.show() # 记得要加上这句话,散点图才会显示出来
最终K-means聚类结果如下图所示
如果还存在疑惑的,可以在评论区留下您的吐槽