【Python】一文详细向您介绍 scipy.cluster.vq.kmeans() 的原理、常见用法和使用场景举例等
下滑即可查看博客内容
🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇
🎓 博主简介:985高校的普通本硕,曾有幸发表过人工智能领域的 中科院顶刊一作论文,熟练掌握PyTorch框架。
🔧 技术专长: 在CV、NLP及多模态等领域有丰富的项目实战经验。已累计提供近千次定制化产品服务,助力用户少走弯路、提高效率,近一年好评率100% 。
📝 博客风采: 积极分享关于深度学习、PyTorch、Python相关的实用内容。已发表原创文章600余篇,代码分享次数逾九万次。
💡 服务项目:包括但不限于科研辅导、知识付费咨询以及为用户需求提供定制化解决方案。
🌵文章目录🌵
- 🤔 一、引言:初识 k-means 算法
- 🧪 二、k-means 算法原理
- 💻 三、`scipy.cluster.vq.kmeans()` 函数详解
- 🌈 四、常见用法示例
- 🚀 五、使用场景举例
- 🤔 六、注意事项与进阶
- 🚀 七、总结与展望
下滑即可查看博客内容
🤔 一、引言:初识 k-means 算法
在数据科学的广阔天地中,聚类分析无疑是一颗璀璨的明珠。它能够在没有标签信息的情况下,将数据集中的样本划分为多个群组(即“簇”),使得同一簇内的样本相似度较高,而不同簇间的样本相似度较低。在众多聚类算法中,k-means 算法以其简洁高效的特点,成为了最为广泛应用的算法之一。今天,我们就来深入探讨 Python 中 scipy.cluster.vq.kmeans()
函数的原理、用法及其实战应用。
🧪 二、k-means 算法原理
k-means 算法的核心思想非常简单:给定一个包含 M 个样本的数据集,以及要划分的簇的数量 k,算法通过迭代的方式,找到 k 个簇的中心点(即“质心”),使得每个样本到其所属簇的质心的距离之和最小。具体步骤如下:
- 初始化:随机选择 k 个样本作为初始的质心。
- 分配簇:对于数据集中的每一个样本,计算其到 k 个质心的距离,并将其分配到距离最近的质心所在的簇中。
- 更新质心:对于每个簇,重新计算其质心(即簇内所有样本的均值)。
- 迭代:重复步骤 2 和 3,直到质心的位置不再发生变化或达到预设的迭代次数。
💻 三、scipy.cluster.vq.kmeans()
函数详解
在 Python 的 scipy
库中,scipy.cluster.vq.kmeans()
函数实现了 k-means 算法。该函数的基本参数如下:
obs
:二维数组,每行是一个观测向量,列是特征。注意,特征通常需要先进行白化处理(即归一化)。k_or_guess
:整数或数组,指定簇的数量 k 或初始质心的猜测。iter
:整数,最大迭代次数,默认为 20。thresh
:浮点数,收敛阈值,默认为 1e-5。如果新旧质心之间的最大距离小于此值,则算法停止。
🌈 四、常见用法示例
下面是一个使用 scipy.cluster.vq.kmeans()
的简单示例,我们将对著名的鸢尾花(Iris)数据集进行聚类分析。
# 导入必要的库
import matplotlib.pyplot as plt # 导入matplotlib的pyplot模块,用于绘图
from scipy.cluster.vq import kmeans, whiten, vq # 从scipy.cluster.vq导入kmeans, whiten, vq函数
from sklearn.datasets import load_iris # 从sklearn.datasets导入load_iris函数,用于加载鸢尾花数据集
from sklearn.decomposition import PCA # 从sklearn.decomposition导入PCA类,用于主成分分析 # 加载数据
iris = load_iris() # 调用load_iris函数加载鸢尾花数据集,结果存储在iris变量中
X = iris.data # 从iris对象中提取特征数据,存储在X变量中 # 数据白化
X_whitened = whiten(X) # 对特征数据X进行白化处理,去除数据的尺度和相关性,结果存储在X_whitened中 # PCA降维
pca = PCA(n_components=2) # 创建一个PCA实例,设置主成分数量为2
X_pca = pca.fit_transform(X_whitened) # 使用PCA实例对白化后的数据进行降维处理,结果存储在X_pca中 # 执行 k-means 聚类,假设我们知道有 3 个簇
k = 3 # 设置聚类簇的数量为3
centroid, distortion = kmeans(X_pca, k) # 对降维后的数据进行k-means聚类,返回质心和畸变值 # 输出质心
print("质心:") # 打印提示信息
print(centroid) # 打印聚类得到的质心 # 分配簇标签
labels = vq(X_pca, centroid)[0] # 使用vq函数将降维后的数据点分配到最近的质心,返回簇标签 # 可视化结果(这里仅展示二维投影,便于理解)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels, cmap='viridis', marker='o') # 绘制数据点,颜色根据簇标签分配
plt.scatter(centroid[:, 0], centroid[:, 1], c='red', s=200, alpha=0.75, marker='x') # 绘制质心,以红色'x'标记
plt.title('Iris Dataset K-Means Clustering') # 设置图表标题
plt.xlabel('PCA Feature 1') # 设置x轴标签
plt.ylabel('PCA Feature 2') # 设置y轴标签
plt.show() # 显示图表
🚀 五、使用场景举例
k-means 算法的应用场景非常广泛,包括但不限于:
- 市场细分:根据客户的购买行为、年龄、收入等特征,将客户划分为不同的细分市场,以便制定针对性的营销策略。
- 图像分割:在图像处理中,可以将图像中的像素点聚类成不同的区域,实现图像的自动分割。
- 文本聚类:对文档集合进行聚类,发现文档之间的相似性,实现文档的自动分类和主题提取。
🤔 六、注意事项与进阶
尽管 k-means 算法在许多场景下表现出色,但使用时仍需注意以下几个问题:
-
初始质心的选择:k-means 算法对初始质心的选择非常敏感,不同的初始质心可能导致不同的聚类结果。为了缓解这个问题,可以采用多次运行算法并选择最佳结果的方法,或者使用更复杂的初始化策略,如 k-means++。
-
簇的数量 k 的选择:在实际应用中,簇的数量 k 通常是未知的,需要预先指定。选择合适的 k 值对于聚类效果至关重要。一种常用的方法是尝试不同的 k 值,并评估聚类结果的质量(如使用轮廓系数等指标),然后选择最优的 k 值。
-
异常值和噪声:数据集中的异常值和噪声可能会对 k-means 算法产生不利影响,导致质心的位置偏离实际簇的中心。在实际应用中,可能需要先对数据进行清洗和预处理,以减少异常值和噪声的影响。
-
算法收敛性:虽然 k-means 算法通常能够收敛到局部最优解,但并不能保证收敛到全局最优解。此外,算法的收敛速度也可能受到数据规模、特征维度和初始质心选择等因素的影响。
为了进一步提高 k-means 算法的性能和效果,可以考虑以下进阶策略:
- 使用加速算法:如 MiniBatchKMeans,该算法通过从数据集中随机选择一部分样本来更新质心,从而加速算法的收敛过程。
- 结合其他算法:将 k-means 与其他算法(如层次聚类、DBSCAN 等)结合使用,可以弥补各自的不足,提高聚类效果。
- 特征选择和降维:在聚类之前,通过特征选择和降维技术减少数据的维度和冗余信息,可以提高聚类算法的效率和效果。
🚀 七、总结与展望
通过对 scipy.cluster.vq.kmeans()
函数的详细探讨,我们深入了解了 k-means 算法的原理、用法及其在 Python 中的实现。k-means 算法以其简洁高效的特点,在数据科学领域得到了广泛应用。然而,我们也需要认识到其局限性,如初始质心选择的敏感性、簇数量 k 的选择难题以及异常值和噪声的影响等。
展望未来,随着数据量的不断增长和聚类需求的日益复杂化,k-means 算法将面临更多的挑战和机遇。为了应对这些挑战,我们需要不断探索新的算法和技术,如结合深度学习、强化学习等先进方法,以提高聚类算法的准确性、鲁棒性和可扩展性。同时,我们也需要关注数据预处理和特征工程等基础工作,为聚类算法提供更高质量的数据支持。相信在不久的将来,聚类分析将会在数据科学领域发挥更加重要的作用。