在机器学习领域中,分析无标签数据是一项常见且重要的任务。与有标签数据(如分类问题)不同,无标签数据没有预定义的类别或目标值。这时,我们可以使用聚类分析(Clustering Analysis)来发现数据中的潜在结构或模式。本文将介绍如何使用Python和常用库对无标签数据进行聚类分析。
一、什么是聚类分析?
聚类分析是一种将数据集划分为多个组(即簇)的技术,使得同一簇内的数据点尽可能相似,而不同簇的数据点尽可能不同。常用的聚类算法有K-Means、层次聚类(Hierarchical Clustering)和DBSCAN等。
1. K-Means 聚类
K-Means 是一种迭代算法,目的是将数据集分成 K
个簇。其主要步骤包括:- 随机选择K个初始质心(centroids)。- 将每个数据点分配到最近的质心对应的簇中。- 重新计算每个簇的质心。- 重复上述过程,直到质心不再发生变化或达到最大迭代次数。
2. 层次聚类
层次聚类通过创建一个层次结构的聚类树来组织数据点,常见的有自下而上(聚合)和自上而下(分裂)两种方法。
3. DBSCAN 聚类
DBSCAN 是一种基于密度的聚类算法,能够识别任意形状的簇,尤其适用于处理噪声数据。
二、实战:使用Python进行K-Means聚类
接下来,我们将使用Python的 scikit-learn
库来对无标签数据进行K-Means聚类。
1. 环境准备
首先,我们需要安装所需的库。如果你还没有安装它们,可以运行以下命令:
pip install numpy pandas matplotlib scikit-learn
2. 导入库和数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 生成示例数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 将数据可视化
plt.scatter(X[:, 0], X[:, 1], s=50)
## <matplotlib.collections.PathCollection object at 0x0000021E0B728E90>
plt.show()
在这段代码中,我们使用 make_blobs
生成了一些模拟的二维数据,数据分布在四个簇中。然后,我们使用 matplotlib
将数据可视化。
3. 应用K-Means算法
# 使用K-Means进行聚类
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
## KMeans(n_clusters=4)
y_kmeans = kmeans.predict(X)
# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
## <matplotlib.collections.PathCollection object at 0x0000021E0B470A50>
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75)
## <matplotlib.collections.PathCollection object at 0x0000021E0DD5E950>
plt.show()
在这里,我们指定了 n_clusters=4
,意味着我们希望将数据分为四个簇。然后我们使用 fit
方法训练模型,predict
方法预测每个数据点所属的簇。最后,我们绘制了聚类结果,并用红色标记了簇的质心。
4. 确定最佳簇数
在实际应用中,确定最佳的簇数并不容易。常用的方法之一是肘部法则(Elbow Method),即通过绘制不同簇数下模型的SSE(Sum of Squared Errors)来选择最佳的簇数。
sse = []
for k in range(1, 10):
kmeans = KMeans(n_clusters=k)
kmeans.fit(X)
sse.append(kmeans.inertia_)
## KMeans(n_clusters=1)
## KMeans(n_clusters=2)
## KMeans(n_clusters=3)
## KMeans(n_clusters=4)
## KMeans(n_clusters=5)
## KMeans(n_clusters=6)
## KMeans(n_clusters=7)
## KMeans()
## KMeans(n_clusters=9)
plt.plot(range(1, 10), sse)
## [<matplotlib.lines.Line2D object at 0x0000021E0DF136D0>]
plt.xlabel('Number of clusters')
## Text(0.5, 0, 'Number of clusters')
plt.ylabel('SSE')
## Text(0, 0.5, 'SSE')
plt.show()
在这个图中,SSE 会随着簇数的增加而减小。当增加到某个值时,SSE的减小幅度会突然变缓,这个点通常被认为是最佳簇数。
三、总结
通过这篇文章,我们介绍了无标签数据的概念,并讲解了如何使用聚类分析(以K-Means为例)来分析这些数据。聚类分析是一种强大的工具,能够帮助我们在无监督学习中发现数据的内在结构。当然,除了K-Means外,还有其他多种聚类算法可供选择,如层次聚类、DBSCAN等,根据具体应用场景选择合适的算法至关重要。
感谢关注!