一、引言

在机器学习领域,无监督学习是一种重要的学习范式,它与监督学习不同,不需要事先标记好的训练数据,而是从数据自身的结构和特征中挖掘信息。无监督学习算法在数据挖掘、数据分析、模式识别等众多领域都有着广泛的应用,能够帮助我们发现数据中的隐藏模式、聚类结构、异常值等,为进一步的决策和研究提供有力支持。本次技术分享将深入介绍几种常见的无监督学习算法,包括它们的原理、应用场景以及实现示例。

二、K-Means 聚类算法

(一)算法原理

K-Means 算法的核心目标是将给定的数据集划分为 K 个簇(cluster),使得每个簇内的数据点相似度较高,而不同簇之间的数据点相似度较低。其主要步骤如下:

  1. 初始化:随机选择 K 个数据点作为初始的聚类中心(centroid)。
  2. 分配数据点:对于数据集中的每个数据点,计算它与各个聚类中心的距离(通常使用欧几里得距离),并将其分配到距离最近的聚类中心所在的簇。
  3. 更新聚类中心:对于每个簇,计算簇内所有数据点的均值,将该均值作为新的聚类中心。
  4. 重复步骤 2 和 3:不断重复分配数据点和更新聚类中心的过程,直到聚类中心不再发生显著变化(达到预设的迭代次数或收敛条件)。

(二)应用场景

  • 客户细分:在市场营销中,根据客户的消费行为、年龄、收入等特征,将客户划分为不同的群体,以便制定针对性的营销策略。
  • 图像压缩:将图像中的像素点根据颜色特征聚类,用聚类中心的颜色值来表示一个簇内的像素,从而实现图像数据的压缩。
  • 数据预处理:对大规模数据进行初步聚类,发现数据的大致分布结构,为后续的有监督学习或更深入的数据分析提供基础。

(三)代码示例(使用 Python 的 scikit-learn 库)

from sklearn.cluster import KMeans
import numpy as np

# 生成示例数据
X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])

# 创建 K-Means 模型,设置聚类数为 2
kmeans = KMeans(n_clusters=2)
# 对数据进行聚类
kmeans.fit(X)

# 输出聚类中心
print(kmeans.cluster_centers_)
# 输出每个数据点所属的簇标签
print(kmeans.labels_)

三、层次聚类算法

(一)算法原理

层次聚类算法构建了一个嵌套的聚类序列,类似于一棵树状结构(dendrogram)。主要有两种类型:凝聚式层次聚类和分裂式层次聚类。

  • 凝聚式层次聚类:从每个数据点作为一个单独的簇开始,然后不断合并相似度最高的簇,直到所有数据点都合并到一个簇中或者达到预设的停止条件。
  • 分裂式层次聚类:则是从包含所有数据点的一个簇开始,逐步将簇分裂成更小的簇。

在计算簇之间的相似度时,可以使用多种方法,如单链法(single linkage)、全链法(complete linkage)、平均链法(average linkage)等。例如,单链法以两个簇中最近的两个数据点之间的距离作为簇间距离;全链法以两个簇中最远的两个数据点之间的距离作为簇间距离;平均链法计算两个簇中所有数据点对之间距离的平均值作为簇间距离。

(二)应用场景

  • 生物分类学:对生物物种进行分类,根据生物的特征构建层次化的分类体系。
  • 社交网络分析:分析社交网络中的群体结构,找出不同层次的社交圈子和群体关系。
  • 文本分类:将文档按照主题进行层次化聚类,形成主题层次结构,便于信息检索和知识管理。

(三)代码示例(使用 Python 的 scipy.cluster.hierarchy 库)

from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
import numpy as np

# 生成示例数据
X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])

# 使用平均链法进行凝聚式层次聚类
Z = linkage(X, 'average')

# 绘制层次聚类树状图
plt.figure(figsize=(10, 5))
dendrogram(Z)
plt.show()

四、主成分分析(PCA)算法

(一)算法原理

PCA 是一种用于数据降维的无监督学习算法。其基本思想是通过线性变换将原始数据投影到一个新的低维坐标系中,使得投影后的数据方差最大,从而在保留数据主要信息的同时降低数据的维度。
具体步骤如下:

  1. 计算协方差矩阵:对数据进行中心化处理(每个数据点减去均值)后,计算其协方差矩阵。
  2. 计算特征值和特征向量:求解协方差矩阵的特征值和特征向量。
  3. 选择主成分:按照特征值的大小对特征向量进行排序,选择前 k 个特征向量(k 为目标维数),这些特征向量构成了投影矩阵。
  4. 投影数据:将原始数据乘以投影矩阵,得到降维后的新数据。

(二)应用场景

  • 数据可视化:当数据维度很高时,难以直接进行可视化。PCA 可以将数据降维到二维或三维,以便绘制散点图等可视化图形,直观地观察数据的分布模式。
  • 特征提取:在图像识别、语音识别等领域,原始数据的特征维度往往很高。PCA 可以提取出最重要的特征,减少数据处理的复杂度和计算量,同时提高模型的训练效率和泛化能力。
  • 数据压缩:通过降低数据维度,减少数据存储空间的占用,在数据存储和传输方面具有重要意义。

(三)代码示例(使用 Python 的 scikit-learn 库)

from sklearn.decomposition import PCA
import numpy as np

# 生成示例数据
X = np.array([[1, 2, 3], [1.5, 1.8, 2.5], [5, 8, 9], [8, 8, 7], [1, 0.6, 1.2], [9, 11, 10]])

# 创建 PCA 模型,设置目标维数为 2
pca = PCA(n_components=2)
# 对数据进行降维
X_pca = pca.fit_transform(X)

print(X_pca)

五、DBSCAN 密度聚类算法

(一)算法原理

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)算法基于数据点的密度分布来进行聚类。它定义了两个重要参数:

  • 邻域半径(eps):以某个数据点为中心,半径为 eps 的圆形区域内的数据点构成该点的邻域。
  • 最小点数(min_samples):一个数据点的邻域内至少包含 min_samples 个数据点时,该数据点被称为核心点。

算法的主要步骤如下:

  1. 从数据集中任选一个未标记的数据点。
  2. 如果该点是核心点,则创建一个新的簇,并将其邻域内的所有数据点都加入该簇,然后递归地处理邻域内的核心点及其邻域,直到所有可达的数据点都被加入簇中。
  3. 如果该点不是核心点且未被其他簇包含,则将其标记为噪声点。
  4. 重复步骤 1 直到所有数据点都被处理完毕。

(二)应用场景

  • 地理信息系统(GIS):分析地理数据中的热点区域或聚类分布,如城市分布、地震带分布等。
  • 异常检测:识别数据集中的异常点或离群点,例如在网络流量监测中发现异常的流量模式。
  • 图像分析:对图像中的物体分布进行聚类分析,如在医学图像中检测肿瘤的聚集区域。

(三)代码示例(使用 Python 的 scikit-learn 库)

from sklearn.cluster import DBSCAN
import numpy as np

# 生成示例数据
X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])

# 创建 DBSCAN 模型,设置邻域半径为 2,最小点数为 2
dbscan = DBSCAN(eps=2, min_samples=2)
# 对数据进行聚类
labels = dbscan.fit_predict(X)

print(labels)

六、总结

无监督学习算法在数据分析和挖掘中具有不可替代的作用。K-Means 聚类算法适用于快速将数据划分为预定数量的簇;层次聚类算法能够构建数据的层次结构,提供更丰富的聚类信息;主成分分析可有效降低数据维度,便于数据处理和可视化;DBSCAN 密度聚类算法则在发现数据的自然聚类和异常点检测方面表现出色。在实际应用中,需要根据数据的特点和具体的业务需求选择合适的无监督学习算法,以充分发挥其优势,为解决各种复杂的数据分析问题提供有力的工具和方法。同时,无监督学习算法的研究仍在不断发展,新的算法和改进方法也在不断涌现,持续学习和探索将有助于我们更好地利用数据资源,挖掘数据背后的价值。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐