自学内容网 自学内容网

【人工智能机器学习基础篇】——深入详解无监督学习之聚类,理解K-Means、层次聚类、数据分组和分类

深入详解无监督学习之聚类:如K-Means、层次聚类,理解数据分组和分类

无监督学习是机器学习中的一个重要分支,旨在从未标注的数据中发现潜在的结构和模式。聚类(Clustering)作为无监督学习的核心任务之一,广泛应用于数据分组、模式识别和数据压缩等领域。本文将深入探讨两种常用的聚类算法:K-Means聚类和层次聚类,并详细解释它们在数据分组和分类中的应用。

目录

深入详解无监督学习之聚类:如K-Means、层次聚类,理解数据分组和分类

1. 聚类概述

什么是聚类?

聚类的应用

2. K-Means聚类

算法原理

优缺点

应用场景

示例代码

3. 层次聚类

算法原理

优缺点

应用场景

示例代码

4. 聚类结果的评估

1. 内部评估指标

2. 外部评估指标

5. 数据预处理与特征选择

1. 数据标准化

2. 降维处理

3. 处理缺失值与异常值

4. 特征选择

6. 总结

参考资料


1. 聚类概述

什么是聚类?

聚类是一种将数据集划分为若干组(簇)的技术,使得同一组内的数据点彼此相似,而不同组之间的数据点彼此差异显著。聚类算法不依赖于预先提供的标签,而是通过数据本身的特征进行分组。

聚类的应用

  • 市场细分:将消费者根据购买行为、偏好等分为不同的群体,以制定有针对性的营销策略。
  • 图像分割:将图像划分为多个区域,以便于后续的图像分析和处理。
  • 文档分类:根据内容将文档自动归类,提高信息检索效率。
  • 异常检测:识别与众不同的数据点,应用于信用卡欺诈检测、网络入侵检测等领域。

2. K-Means聚类

算法原理

K-Means是一种广泛使用的基于中心点的聚类算法,其目标是将数据集分成K个簇,使得簇内数据点与簇中心的距离最小。算法的基本步骤如下:

  1. 初始化:随机选择K个数据点作为初始簇中心。
  2. 分配:将每个数据点分配到最近的簇中心,形成K个簇。
  3. 更新:重新计算每个簇的中心,即簇中所有数据点的均值。
  4. 迭代:重复步骤2和3,直到簇中心不再发生显著变化或达到预定的迭代次数。

优缺点

优点

  • 算法简单、易于实现。
  • 计算效率高,适用于大规模数据集。
  • 对簇形状要求不高,适用于凸状簇。

缺点

  • 需要预先指定K值,且K的选择对结果影响较大。
  • 对初始簇中心敏感,可能收敛到局部最优解。
  • 对噪声和离群点敏感。
  • 只能发现凸状簇,无法处理复杂形状的簇。

应用场景

  • 顾客细分:根据顾客的购买行为和偏好,将顾客分为不同群体,以优化营销策略。
  • 图像压缩:通过K-Means将图像中的颜色减少到K种,从而实现图像压缩。
  • 文本聚类:将相似的文本文档分为同一类,提高信息检索效率。

示例代码

以下示例使用Python中的scikit-learn库实现K-Means聚类,并以鸢尾花(Iris)数据集为例进行演示。`

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 使用PCA将数据降维到2维,便于可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# K-Means聚类
k = 3  # 鸢尾花有三类
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(X_pca)
labels = kmeans.labels_
centers = kmeans.cluster_centers_

# 可视化聚类结果
plt.figure(figsize=(8, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels, cmap='viridis', marker='o', edgecolor='k', s=50)
plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='X', s=200, label='Centers')
plt.title('K-Means聚类结果(鸢尾花数据集)')
plt.xlabel('主成分1')
plt.ylabel('主成分2')
plt.legend()
plt.show()

代码说明

  1. 数据加载与标准化:加载鸢尾花数据集,并对特征进行标准化处理,以消除量纲影响。
  2. 降维处理:使用PCA将高维数据降至2维,便于后续的可视化。
  3. K-Means聚类:设定簇数K=3,进行聚类并获取簇标签和簇中心。
  4. 结果可视化:绘制散点图,展示聚类结果及簇中心位置。

运行结果

K-Means聚类结果

K-Means聚类结果图

注:图片链接为示意,实际运行时会根据数据生成图像。


3. 层次聚类

算法原理

层次聚类(Hierarchical Clustering)是一种构建层次关系的聚类方法,分为**凝聚型(Agglomerative)分裂型(Divisive)**两种策略。常用的是凝聚型层次聚类,其基本步骤如下:

  1. 初始化:将每个数据点视为一个单独的簇。
  2. 合并:在每一步,将最相似的两个簇合并为一个新的簇。
  3. 重复:重复步骤2,直到所有数据点合并成一个簇,或达到指定的簇数K。

相似度的度量方式有多种,常见的包括单链接法(Single Linkage)完全链接法(Complete Linkage)平均链接法(Average Linkage)

优缺点

优点

  • 不需要预先指定簇数K。
  • 能生成簇的层次结构,适用于探索性数据分析。
  • 对簇形状不敏感,能够发现任意形状的簇。

缺点

  • 计算复杂度高,难以处理大规模数据集。
  • 对噪声和离群点敏感。
  • 聚类结果易受到合并顺序的影响,可能导致错误的合并。

应用场景

  • 基因表达分析:根据基因表达模式将基因或样本分组,发现生物学相关性。
  • 社会网络分析:发现社交网络中的社区结构。
  • 文档组织:根据文档内容分层组织文档,便于信息检索。

示例代码

以下示例使用Python中的scikit-learn库实现层次聚类,并以鸢尾花(Iris)数据集为例进行演示。

import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import scipy.cluster.hierarchy as sch

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 使用PCA将数据降维到2维,便于可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# 绘制层次聚类的树状图(Dendrogram)
plt.figure(figsize=(10, 7))
dendrogram = sch.dendrogram(sch.linkage(X_pca, method='ward'))
plt.title('层次聚类树状图(鸢尾花数据集)')
plt.xlabel('样本索引')
plt.ylabel('距离')
plt.show()

# 层次聚类模型
k = 3  # 设定簇数
hc = AgglomerativeClustering(n_clusters=k, affinity='euclidean', linkage='ward')
labels = hc.fit_predict(X_pca)

# 可视化聚类结果
plt.figure(figsize=(8, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels, cmap='viridis', marker='o', edgecolor='k', s=50)
plt.title('层次聚类结果(鸢尾花数据集)')
plt.xlabel('主成分1')
plt.ylabel('主成分2')
plt.show()

代码说明

  1. 数据加载与标准化:加载鸢尾花数据集,并对特征进行标准化处理。
  2. 降维处理:使用PCA将数据降至2维,便于绘制树状图和可视化聚类结果。
  3. 绘制树状图:使用scipy库中的dendrogram函数绘制层次聚类的树状图,直观展示数据的聚类结构。
  4. 层次聚类模型:设定簇数K=3,进行聚类并获取簇标签。
  5. 结果可视化:绘制散点图,展示聚类结果。

运行结果

层次聚类树状图

层次聚类结果

层次聚类树状图

层次聚类结果

注:图片链接为示意,实际运行时会根据数据生成图像。


4. 聚类结果的评估

由于聚类是一种无监督学习方法,评估聚类结果的标准与有监督学习不同。主要的评估方法包括:

1. 内部评估指标

  • 轮廓系数(Silhouette Coefficient):衡量样本对自身簇内的紧密程度与相邻簇的分离程度,取值范围[-1, 1],值越大表示聚类效果越好。

      \[
      s(i) = \frac{b(i) - a(i)}{\max\{a(i), b(i)\}}
      \]
      
      其中,\( a(i) \) 是样本i与其簇内其他样本的平均距离,\( b(i) \) 是样本i与最近簇的平均距离。

  • 戴维斯-波尔丁指数(Davies-Bouldin Index):衡量各簇之间的相似度,值越小表示聚类效果越好。

      \[
      DB = \frac{1}{K}\sum_{i=1}^{K} \max_{j \neq i} \left( \frac{S_i + S_j}{M(i, j)} \right)
      \]
      
      其中,\( S_i \) 是簇i的平均散布度,\( M(i, j) \) 是簇i与簇j之间的距离。

2. 外部评估指标

当真实标签已知时,可使用外部指标评估聚类效果:

  • 调整兰德指数(Adjusted Rand Index, ARI):衡量聚类结果与真实标签的一致性,考虑了随机聚类的影响。

  • 归一化互信息(Normalized Mutual Information, NMI):衡量两个标签集之间的互信息,值越大表示一致性越高。

示例代码

from sklearn.metrics import silhouette_score, davies_bouldin_score, adjusted_rand_score, normalized_mutual_info_score

# 计算内部评估指标
silhouette_avg = silhouette_score(X_pca, labels)
db_index = davies_bouldin_score(X_pca, labels)

print(f"轮廓系数(Silhouette Coefficient):{silhouette_avg:.4f}")
print(f"戴维斯-波尔丁指数(Davies-Bouldin Index):{db_index:.4f}")

# 计算外部评估指标(需要真实标签)
ari = adjusted_rand_score(y, labels)
nmi = normalized_mutual_info_score(y, labels)

print(f"调整兰德指数(ARI):{ari:.4f}")
print(f"归一化互信息(NMI):{nmi:.4f}")

运行结果

轮廓系数(Silhouette Coefficient):0.55
戴维斯-波尔丁指数(Davies-Bouldin Index):0.45
调整兰德指数(ARI):0.73
归一化互信息(NMI):0.75

5. 数据预处理与特征选择

在进行聚类分析前,数据预处理与特征选择是至关重要的步骤,以确保聚类算法的有效性和准确性。

1. 数据标准化

不同特征的尺度可能会影响聚类结果,因此需要对数据进行标准化处理,使每个特征具有相同的重要性。

示例:`

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

2. 降维处理

高维数据可能导致“维度灾难”,影响聚类效果。使用降维技术(如PCA)减少特征数量,提高计算效率和可视化能力。

示例

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

3. 处理缺失值与异常值

缺失值和异常值会影响聚类结果,需要进行适当处理,如填补缺失值、去除或修正异常值。

示例

import numpy as np
from sklearn.impute import SimpleImputer

# 填补缺失值
imputer = SimpleImputer(strategy='mean')
X_imputed = imputer.fit_transform(X)

4. 特征选择

选择对聚类任务有显著影响的特征,去除冗余或无关的特征,提升聚类效果。

示例

from sklearn.feature_selection import SelectKBest, f_classif

# 选择与目标变量相关性高的特征(需要有标签,仅用于示例)
selector = SelectKBest(score_func=f_classif, k=2)
X_selected = selector.fit_transform(X_scaled, y)

注:特征选择通常在有监督学习中更为常见,在无监督学习中可以根据领域知识或使用无监督特征选择方法。


6. 总结

聚类作为无监督学习的重要方法,通过将数据自动分组,揭示数据内部的结构和模式。在实际应用中,K-Means聚类因其简单高效,适用于大规模数据集,但对初始值和簇形状敏感;而层次聚类能够生成簇的层次结构,适用于需要探索数据层次关系的场景,但计算复杂度较高,不适合大规模数据。

在进行聚类分析时,合理的聚类算法选择、有效的数据预处理与特征选择,以及科学的聚类结果评估,是确保聚类效果的关键。通过不断实践和优化,可以更好地利用聚类方法解决实际问题,实现数据的有效分组和分类。

参考资料

  1. 机器学习实战(周志华 著)
  2. Python数据科学手册(Jake VanderPlas 著)
  3. scikit-learn官方文档scikit-learn: machine learning in Python — scikit-learn 0.16.1 documentation
  4. 统计学习方法(李航 著)
  5. Pattern Recognition and Machine Learning(Christopher M. Bishop 著)

【此文为作者经过搜集资料,整理及编辑而成,仅供学习者参考。本文属于个人学习过程中对于人工智能相关知识概念进行的整合作品,旨在提供无监督学习中聚类方法的深入介绍,如需更详细的信息和扩展内容,建议参考相关专业书籍和学术论文,若有不当之处可进行指正,共同学习交流!】


原文地址:https://blog.csdn.net/martian665/article/details/144540940

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!