聚类
聚类是无监督学习中的一种重要方法,旨在将数据集中相似的数据对象划分到同一个簇中,使得不同簇之间的数据对象差异尽可能大。在大数据环境下,聚类可以帮助挖掘数据中的隐藏结构和模式,应用场景十分广泛,比如在客户细分领域,根据客户的消费行为、年龄、地域等特征进行聚类,能将客户分为不同群体,方便企业制定针对性的营销策略;在图像识别中,可以依据图像的特征(如颜色、纹理等)聚类来进行图像分类等。
常见的聚类算法除了下面要详细说的 K-means 之外,还有层次聚类(如凝聚式层次聚类、分裂式层次聚类等,通过不断合并或拆分簇来构建聚类层次结构)、密度聚类(例如 DBSCAN 算法,基于数据点的密度来确定簇,能发现任意形状的簇并且能识别出数据集中的噪声点)等。
K-means 算法及其实现
K-means 是一种非常经典且应用广泛的聚类算法,它的核心思想比较简单直观:
-
步骤概述:
- 初始化:首先确定要划分的簇的数量
k
,然后从数据集中随机选择k
个数据点作为初始的聚类中心(也可以采用其他初始化方法来提高聚类效果,比如 K-means++ 初始化,尽量让初始聚类中心相互之间距离较远)。 - 分配数据点到簇:对于数据集中的每个数据点,计算它与各个聚类中心的距离(通常采用欧几里得距离等度量方式),然后将该数据点分配到距离它最近的那个聚类中心所在的簇中。
- 更新聚类中心:当所有数据点都被分配到相应的簇后,重新计算每个簇的中心位置(比如对于数值型数据,簇中心通常是簇内所有数据点对应维度的均值)。
- 迭代:重复上述分配数据点和更新聚类中心的步骤,直到聚类中心不再发生明显变化(可以通过设置一个收敛阈值,比如前后两次迭代聚类中心的位置变化小于某个值时,就认为算法收敛)或者达到预设的最大迭代次数为止。
- 初始化:首先确定要划分的簇的数量
-
Python 实现示例:
以下是 Python 代码实现 K-means 算法(使用 Python 的numpy
库来进行数值计算),这里假设输入数据是一个二维的数值型数据集(可以方便可视化展示聚类效果,实际应用中可以处理多维数据):
import numpy as np
def euclidean_distance(point1, point2):
"""计算两点之间的欧几里得距离"""
return np.sqrt(np.sum((point1 - point2) ** 2))
def k_means(data, k, max_iterations=100, tolerance=1e-4):
"""
K-means聚类算法实现
参数:
data (numpy.ndarray): 输入的数据集,形状为 (样本数, 特征数)
k (int): 要划分的簇的数量
max_iterations (int, 可选): 最大迭代次数,默认为100
tolerance (float, 可选): 收敛阈值,默认为1e-4
返回:
centroids (numpy.ndarray): 最终的聚类中心,形状为 (k, 特征数)
labels (numpy.ndarray): 每个数据点所属的簇的标签,形状为 (样本数,)
"""
# 随机选择k个初始聚类中心
indices = np.random.choice(len(data), k, replace=False)
centroids = data[indices]
for _ in range(max_iterations):
# 存储每个数据点所属的簇的标签
labels = np.zeros(len(data), dtype=int)
# 分配数据点到簇
for i, point in enumerate(data):
distances = [euclidean_distance(point, centroid) for centroid in centroids]
labels[i] = np.argmin(distances)
# 更新聚类中心
new_centroids = np.array([data[labels == j].mean(axis=0) for j in range(k)])
# 检查聚类中心是否收敛
if np.all(np.abs(new_centroids - centroids) < tolerance):
break
centroids = new_centroids
return centroids, labels
调用这个函数进行测试,数据为随机生成的二维数据点
# 生成示例数据
np.random.seed(0)
data = np.random.rand(100, 2)
# 设置簇的数量
k = 3
# 运行K-means算法
centroids, labels = k_means(data, k)
# 简单打印聚类结果(可以进一步可视化展示等)
print("聚类中心:", centroids)
print("数据点所属簇的标签:", labels)
K-means 算法有助于深入理解聚类的基本原理以及相关的距离计算、迭代优化等操作,但在实际应用中,为了更高效和方便地使用聚类功能,也可以直接调用一些成熟的机器学习库(如 scikit-learn
库中已经实现好且经过优化的 K-means 算法类)。
关于在写作过程中原创与使用AI的声明
本手稿的作者声明,在本作品的写作过程中,我们使用AI只包含:生成式AI图片/视频为了提高文章的观赏性、使用AI编辑器提升文章的可读性和精炼语言、修订程序过程中出现的错误以及添加标准化说明。这种使用是在严格的人为监督和控制下进行的。在应用AI技术后,作者对稿件进行了仔细的审查和编辑,以确保稿件的原创性、准确性和连贯性。
作者理解AI产生的内容可能是不正确的、不完整的或有偏见的。考虑到这一点,作者确保所有AI编辑器修订过的手稿以及语句最后经过了人类的眼睛和判断并彻底作者本人人工修改与校订,以符合人类的阅读习惯。所生成文本遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明,学术使用本文必须按期刊规定标注本文出处,翻用必究。
根据CSDN的原创政策,作者确认没有AI或AI辅助技术被列为本文的作者或合著者。作者完全理解,作者身份带来的责任和任务只能归因于人类并由人类执行,作者在准备本文时遵守了这些指导方针。
参考资料:
K均值(K-means)聚类算法(Python3实现代码)_聚类_helloWorld-GitCode 开源社区
K-means聚类算法原理及python实现_机器学习_杨Zz.-百度飞桨星河社区