系列目录
《Web安全之机器学习入门》笔记:第十章 10.2 K-Means hello world
《Web安全之机器学习入门》笔记:第十章 10.3 K-Means算法检测DGA域名
《Web安全之机器学习入门》笔记:第十章 10.5 DBSCAN hello world
目录
本系列是《Web安全之机器学习入门》的笔记集合,包含书中第五章-第十七章的内容。本文这一小节主要内容是讲解第10章使用K-MEANS算法的基本用法,本小节是通过生成的聚类数据集,使用K-means方法进行分类,并将其可视化。
一、K-means算法
K-Means 算法是一种无监督的聚类算法,旨在将给定数据集划分为 K 个不同的簇。其基本原理是:首先随机选择 K 个点作为初始聚类中心,然后计算每个数据点到各个聚类中心的距离,将数据点分配到距离最近的聚类中心所在的簇。接着,重新计算每个簇的中心,即该簇内所有数据点的均值。不断重复上述过程,直到聚类中心不再发生变化或达到预设的迭代次数。
该算法的优点是简单、快速,对处理高维数据和大规模数据集表现较好。然而,它也存在一些缺点,例如对初始聚类中心的选择较为敏感,不同的初始值可能导致不同的聚类结果,且需要事先指定聚类的数量 K,而这个 K 值往往难以准确确定。K-Means 算法在数据挖掘、图像处理、市场细分等领域有着广泛的应用,能帮助人们发现数据中的潜在结构和规律。
算法名称 | K-Means 算法 |
算法类型 | 无监督学习的聚类算法 |
核心思想 | 基于距离度量,将数据点划分到离其最近的聚类中心所代表的簇中,通过不断更新聚类中心使簇内数据点的相似度最大化 |
工作流程 | 1. 随机选择 K 个数据点作为初始聚类中心 2. 计算每个数据点到各个聚类中心的距离,将数据点分配到距离最近的聚类中心所在的簇 3. 重新计算每个簇的中心(簇内所有数据点的均值) 4. 重复步骤 2 和 3,直到聚类中心不再变化或达到预设的迭代次数 |
优点 | 1. 原理简单,实现容易 2. 计算效率较高,对于大规模数据集能快速收敛 3. 对处理数值型数据效果较好 4. 对高维数据也有一定的适用性 |
缺点 | 1. 需预先指定聚类数 K,而合适的 K 值难以确定 2. 对初始聚类中心的选择敏感,不同的初始值可能导致不同的聚类结果 3. 对噪声和离群点较为敏感,可能影响聚类效果 4. 只能发现球形的簇,对于非凸形状的簇聚类效果不佳 |
适用场景 | 1. 数据挖掘中的数据探索,发现数据的潜在分组结构 2. 图像处理,如对图像中的像素进行聚类 3. 市场细分,将客户按照不同特征进行分组 4. 文档聚类,对文本进行分类管理 |
二、数据集
本小节通过make_blobs产生数据集,该函数是 sklearn.datasets中的一个函数,主要是产生聚类数据集,代码如下所示。
n_samples = 1500
random_state = 170
X, y = make_blobs(n_samples=n_samples, random_state=random_state)
这段代码生成模拟聚类数据:设置样本数量为 1500(n_samples表示样本的个数),随机数种子设置为 170(random_state是随机种子,可以固定生成的数据 ) 以确保结果可复现,调用 make_blobs 函数生成二维数据点 X 和对应的真实聚类标签 y,X 为 1500 个样本的特征矩阵,y 为各样本的真实类别。
三、Kmeans分类
本文使用 K-Means 聚类分析模拟数据。生成 1500 个二维样本点,用 K-Means(聚成 3 类)聚类并获取标签,绘制散点图(按聚类标签着色),设置图形大小为 12x12,子图标题含拼写错误,最终展示聚类结果,直观呈现 K-Means 对模拟数据的分组效果。具体代码如下所示。
- 数据生成:用 make_blobs 生成 1500 个模拟聚类样本
- 聚类建模:初始化 K-Means(3 类),拟合数据并预测聚类标签
- 图形设置:创建 12x12 英寸的图形窗口
- 子图绘制:在子图中绘制散点图,按聚类标签着色
- 标题设置:为子图添加标题(含拼写错误)
- 图形显示:展示绘制的聚类结果散点图
- 程序执行:主函数调用聚类展示函数,运行整个流程
# 导入 matplotlib 库的 pyplot 模块,用于绘制图形
import matplotlib.pyplot as plt
# 从 sklearn 库的 cluster 模块导入 KMeans 类,用于进行 K-Means 聚类
from sklearn.cluster import KMeans
# 从 sklearn 库的 datasets 模块导入 make_blobs 函数,用于生成模拟的聚类数据
from sklearn.datasets import make_blobs
# 定义一个名为 show_kmeans 的函数,用于展示 K-Means 聚类的结果
def show_kmeans():
# 打印当前文件的文档字符串(如果有的话),这里一般用于调试或说明信息
print(__doc__)
# 设置图形窗口的大小为 12x12 英寸
plt.figure(figsize=(12, 12))
# 定义生成模拟数据的样本数量为 1500
n_samples = 1500
# 定义随机数种子为 170,确保每次运行代码生成的数据相同,保证结果可复现
random_state = 170
# 使用 make_blobs 函数生成模拟的聚类数据
# X 是生成的数据点,是一个二维数组,每一行代表一个样本,每一列代表一个特征
# y 是每个数据点的真实标签,用于后续验证聚类结果
X, y = make_blobs(n_samples=n_samples, random_state=random_state)
# 创建一个 K-Means 聚类模型,指定聚类的数量为 3,随机数种子为 170
# 使用 fit_predict 方法对数据进行聚类,并返回每个数据点所属的聚类标签
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X)
# 在一个 2x2 的子图布局中选择第一个子图
plt.subplot(221)
# 绘制散点图,将数据点 X 的第一列作为 x 坐标,第二列作为 y 坐标
# c=y_pred 表示根据每个数据点所属的聚类标签来设置颜色
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
# 设置当前子图的标题为 "hello word!",这里应该是拼写错误,正确的可能是 "hello world!"
plt.title("hello word!")
# 显示绘制的图形
plt.show()
# 程序的入口点,当直接运行该脚本时会执行以下代码块
if __name__ == '__main__':
# 调用 show_kmeans 函数来展示 K-Means 聚类的结果
show_kmeans()
3.运行结果