K-means 聚类算法的简单示例

### K-means聚类算法详解
K-means是一种迭代的聚类算法,它试图将数据点划分为K个簇,使得每个簇内的数据点与簇中心的距离之和最小。这个过程包括以下几个关键步骤:

1. **初始化**:选择K个数据点作为初始的簇中心。这些点可以是随机选择的,也可以通过其他启发式方法选择。

2. **分配阶段**:对于每个数据点,计算它与每个簇中心的距离,并将其分配到最近的簇中心,从而形成K个簇。

3. **更新阶段**:重新计算每个簇的中心,通常是簇内所有点的均值。这一步是为了移动簇中心到簇内所有点的“中心”。

4. **迭代**:重复分配和更新步骤,直到满足停止条件,如簇中心的变化小于某个阈值,或者达到预设的迭代次数。

5. **收敛**:当簇中心的位置不再显著变化时,算法收敛,此时的簇划分被认为是最终的聚类结果。

K-means算法的关键在于如何初始化簇中心以及如何确定K值。簇中心的初始化会影响最终的聚类结果,而K值的选择通常依赖于数据集的特性和聚类的目的。

### NumPy库详解
NumPy是Python中用于科学计算的基础库,它提供了一个强大的N维数组对象`ndarray`,以及相应的操作。NumPy的主要特性包括:

- **多维数组**:NumPy的核心是其N维数组对象,它是一个同质的多维数组,具有固定的大小和形状。

- **广播**:NumPy提供了一种强大的机制,允许不同大小的数组在数学运算中进行“广播”,以简化代码。

- **索引和切片**:NumPy数组支持复杂的索引和切片操作,使得数据操作更加灵活。

- **高级操作**:NumPy提供了大量的数学函数,包括统计、代数、逻辑、形状操作等。

- **内存映射文件**:NumPy可以创建映射到文件的数组,这使得处理大型数据集成为可能。

- **C/C++接口**:NumPy提供了与C/C++代码的接口,可以提高性能。

### Scikit-learn库详解
Scikit-learn是一个基于Python的机器学习库,它建立在NumPy、SciPy和matplotlib之上,提供了许多机器学习算法的实现。Scikit-learn的主要特点包括:

- **一致的API**:所有估计器(算法)都遵循相同的API,这使得学习和使用变得容易。

- **详细文档**:Scikit-learn提供了详细的文档和示例,帮助用户理解和应用算法。

- **模型选择和评估**:Scikit-learn提供了交叉验证、网格搜索等工具,帮助用户选择和评估模型。

- **可扩展性**:Scikit-learn的设计允许用户轻松地添加自己的算法。

- **集成学习**:Scikit-learn支持集成学习算法,如随机森林、梯度提升树等。

- **预处理**:Scikit-learn提供了数据预处理功能,包括特征缩放、编码等。

### Matplotlib库详解
Matplotlib是一个Python 2D绘图库,它以多种格式生成高质量的图表。Matplotlib的主要特点包括:

- **多种图表类型**:Matplotlib支持多种图表类型,如散点图、条形图、直方图、饼图等。

- **自定义性**:Matplotlib允许用户自定义图表的几乎所有方面,包括颜色、线条样式、标签、图例等。

- **交互式环境**:Matplotlib可以与IPython、Jupyter Notebook等交互式环境集成。

- **动画和Web支持**:Matplotlib支持生成动画,并可以与Web技术(如WebAgg、WebAgg)集成。

- **多种输出格式**:Matplotlib支持多种输出格式,包括PNG、PDF、SVG等。

- **工具箱**:Matplotlib提供了多个工具箱,如mplot3d,用于三维绘图。

### 聚类标签详解
在聚类分析中,聚类标签是一个重要的概念,它表示数据点被分配到的簇。在K-means聚类中,每个数据点根据其与簇中心的距离被分配到最近的簇。聚类标签的分配过程包括:

- **距离度量**:选择一个距离度量(如欧氏距离)来计算数据点与簇中心之间的距离。

- **分配**:根据距离度量,将每个数据点分配到最近的簇中心。

- **更新**:在K-means算法的迭代过程中,簇中心的位置会更新,这可能会导致一些数据点的聚类标签发生变化。

### 质心详解
质心是簇内所有点的均值,它代表了簇的“中心”。在K-means聚类中,质心的计算方法如下:

- **计算**:对于每个簇,计算簇内所有点的均值,得到新的质心。

- **更新**:在算法的每次迭代中,根据当前簇内的数据点更新质心的位置。

- **优化**:K-means算法的目标是最小化簇内误差,即最小化数据点与簇中心(质心)之间的距离。

- **稳定性**:质心的位置可能会受到初始簇中心选择的影响,不同的初始化可能导致不同的质心位置。

### 无监督学习详解
无监督学习是机器学习的一种,它不依赖于标记的训练数据。无监督学习的目标是从未标记的数据中发现结构、模式或分布。无监督学习的主要任务包括:

- **聚类**:将数据点分组,使得同一组内的数据点相似度高,不同组之间的数据点相似度低。

- **关联规则学习**:发现变量间的有趣关系,如频繁项集和关联规则。

- **异常检测**:识别数据集中的异常或离群点,这些点与大多数数据点显著不同。

- **降维**:减少数据的维度,同时尽量保留原始数据的信息,如主成分分析(PCA)和t-SNE。

- **密度估计**:估计数据的分布,如高斯混合模型。

- **生成模型**:学习数据的生成过程,如生成对抗网络(GANs)。

### 散点图详解
散点图是一种数据可视化技术,用于展示两个变量之间的关系。在散点图中,每个数据点由一个点表示,其横纵坐标分别对应两个变量的值。散点图的主要特点包括:

- **趋势观察**:散点图可以用来观察变量之间的趋势,如线性关系、非线性关系等。

- **模式识别**:散点图可以帮助识别数据中的模式,如群集、离群点、密度变化等。

- **变量比较**:散点图提供了一种直观的方式来比较不同变量之间的关系。

- **数据分布**:散点图可以用来展示数据的分布,如对称性、偏斜性等。

- **交互式探索**:散点图可以与交互式工具结合,允许用户探索数据的不同方面。

# 导入numpy库中的unique函数用于获取数组中的唯一值
from numpy import unique  
# numpy的unique函数会返回输入数组中的唯一元素,常用于识别分类标签或统计唯一元素的数量。

# 导入numpy库中的where函数用于获取满足条件的元素的索引
from numpy import where  
# numpy的where函数返回一个数组,其中包含满足给定条件的元素的索引。

# 导入sklearn.datasets模块中的make_classification函数用于生成分类数据集
from sklearn.datasets import make_classification  
# make_classification是scikit-learn库中的一个函数,用于生成分类数据集,这些数据集可以用于测试分类算法。

# 导入sklearn.cluster模块中的KMeans类用于K-means聚类
from sklearn.cluster import KMeans  
# KMeans是scikit-learn库中的一个类,用于执行K-means聚类算法。

# 导入matplotlib库中的pyplot模块用于数据可视化
from matplotlib import pyplot  
# pyplot是matplotlib库的一部分,它提供了一系列函数,用于创建各种静态的、动态的以及交互式的图表。

# 使用make_classification函数定义一个二维的数据集
# n_samples=1000 表示生成1000个样本
# n_features=2 表示每个样本有2个特征
# n_informative=2 表示2个特征是信息性的,即对分类有影响
# n_redundant=0 表示没有冗余特征
# n_clusters_per_class=1 表示每个类只有一个簇
# random_state=4 表示随机种子,用于生成可复现的数据集
X, _ = make_classification(  
   n_samples=1000,   
   n_features=2,   
   n_informative=2,   
   n_redundant=0,  
   n_clusters_per_class=1,  
   random_state=4)  
# 这行代码生成了一个包含1000个样本的数据集,每个样本有两个特征。这些特征都是信息性的,没有冗余特征,每个类只生成一个簇,随机种子设置为4,确保每次生成的数据集是相同的。

# 创建KMeans类的实例,指定聚类的数量为2
model = KMeans(n_clusters=2)  
# 这行代码创建了一个KMeans对象,准备进行聚类分析,指定了聚类的数量为2。

# 使用fit方法对数据集X进行拟合,以确定聚类中心
model.fit(X)  
# fit方法用于对数据集X进行拟合,KMeans算法会尝试找到数据的聚类中心。

# 使用predict方法为每个样本分配一个聚类标签
yhat = model.predict(X)  
# predict方法会根据模型的聚类中心为每个样本分配一个聚类标签,yhat就是包含这些标签的数组。

# 使用unique函数获取聚类标签中的唯一值,即聚类的数量
clusters = unique(yhat)  
# 这行代码找出了聚类标签中的唯一值,即不同聚类的数目。

# 遍历每个聚类标签
for cluster in clusters:  
  # 在这个循环中,我们将为每个不同的聚类生成一个散点图。

  # 使用where函数获取属于当前聚类的所有样本索引
  row_ix = where(yhat == cluster)  
  # where函数返回了所有被分配到当前聚类(cluster变量的值)的样本索引。

  # 使用scatter函数创建散点图,其中X[row_ix, 0]表示第一个特征的值,X[row_ix, 1]表示第二个特征的值
  pyplot.scatter(X[row_ix, 0], X[row_ix, 1])  
  # 这行代码使用matplotlib的scatter函数为属于当前聚类的样本创建一个散点图。

  # 显示散点图
  pyplot.show()  
  # 这行代码显示了上一步创建的散点图。由于循环中的scatter和show是分开的,所以每次循环都会重新绘制一个新的散点图,而不是在同一个图上添加点。

  • 30
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值