聚类算法在数据挖掘和机器学习中广泛应用,特别是在没有标签的情况下进行模式识别、数据预处理、特征提取等任务。以下是一些经典的聚类算法案例,展示了不同算法的应用和效果。
1. K-means 聚类案例
背景:
假设我们有一组客户数据,每个客户都有年龄和年收入两项特征,我们希望将客户分为若干个群体,以便进行市场营销策略制定。
步骤:
- 输入数据:客户的年龄和年收入。
- 目标:将客户数据分成3个簇,分别代表不同的市场细分群体。
K-means 算法:
- 初始化:随机选择3个簇心(即3个初始的聚类中心)。
- 分配阶段:将每个客户分配到距离其最近的簇心。
- 更新阶段:重新计算每个簇的质心,即所有客户的均值。
- 重复:重复第2步和第3步,直到簇心不再发生变化或者达到预定的迭代次数。
结果:
通过K-means聚类,可能会得到如下三个群体:
- 群体1:年龄较小,收入较低的年轻人群体。
- 群体2:中年群体,收入较高。
- 群体3:年长群体,收入较低。
代码示例(使用Python的sklearn
库):
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 假设数据
X = np.array([[25, 30000], [30, 40000], [35, 50000], [40, 60000], [45, 70000],
[50, 80000], [55, 90000], [60, 100000], [65, 110000], [70, 120000]])
# K-means 聚类
kmeans = KMeans(n_clusters=3, random_state=0).fit(X)
# 获取簇心和分配的标签
centers = kmeans.cluster_centers_
labels = kmeans.labels_
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='x')
plt.xlabel('Age')
plt.ylabel('Income')
plt.title('Customer Segmentation using K-means')
plt.show()
2. DBSCAN(基于密度的空间聚类算法)案例
背景:
我们有一个带噪声的数据集,且数据的分布并不是规则的圆形或球形,而是具有不规则形状。例如,地理位置数据(如城市坐标)的聚类。
DBSCAN 算法:
DBSCAN 通过寻找数据点的密度来进行聚类,它的基本思路是:
- 核心点:如果一个点周围有至少 MinPts 个点,则它是一个核心点。
- 边界点:如果一个点不是核心点,但位于一个核心点的邻域内,则是边界点。
- 噪声点:如果一个点既不是核心点,也不在任何核心点的邻域内,则它是噪声点。
步骤:
- 输入数据:城市坐标数据。
- 目标:通过DBSCAN自动识别城市的聚类区域,且能够识别噪声数据(例如误差或无关数据)。
结果:
DBSCAN能够根据密度自动找到多个不规则形状的簇,并且能识别孤立的噪声点(如数据错误点)。
代码示例(使用Python的sklearn
库):
from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt
# 假设数据:城市坐标(经度、纬度)
X = np.array([[1, 2], [1, 3], [2, 2], [8, 7], [8, 8], [25, 80]])
# DBSCAN 聚类
db = DBSCAN(eps=3, min_samples=2).fit(X)
# 获取簇标签
labels = db.labels_
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.title('City Clustering using DBSCAN')
plt.show()
结果:
DBSCAN能够识别出两个簇,并将第三个点作为噪声点标记出来。
3. 层次聚类(Hierarchical Clustering)案例
背景:
假设我们有一组植物的特征数据,想要根据植物的特征将其分层聚类,构建树形结构,适用于自然分类、物种进化等问题。
步骤:
- 输入数据:植物的特征数据(如花瓣长度、宽度等)。
- 目标:基于特征构建植物的层次结构。
层次聚类算法:
- 初始阶段:每个数据点开始时是一个单独的簇。
- 合并阶段:逐步将最相似的簇合并成新的簇,直到所有簇合并成一个大簇。
- 可视化:通过树状图(dendrogram)来展示聚类的合并过程。
代码示例(使用Python的scipy
库):
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage
# 假设数据:植物特征(如花瓣长度、宽度等)
X = np.array([[1.1, 2.2], [1.5, 2.5], [3.6, 4.0], [3.8, 4.3], [8.0, 9.2], [8.2, 9.5]])
# 层次聚类
linked = linkage(X, method='ward')
# 绘制树状图
dendrogram(linked)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample index')
plt.ylabel('Distance')
plt.show()
结果:
树状图展示了植物之间的层次关系,帮助我们理解不同植物之间的相似度。根据树状图,可以选择合适的阈值来剪枝,从而确定最终的簇数。
4. K-means++ 聚类案例(K-means的改进)
背景:
K-means++ 是 K-means 的一种初始化方法,用来提高 K-means 的性能和稳定性,尤其在聚类中心不均匀分布时,能够避免 K-means 算法陷入局部最优解。
步骤:
- 输入数据:客户的年龄、年收入。
- 目标:使用 K-means++ 初始化方法进行聚类。
代码示例(使用Python的sklearn
库):
from sklearn.cluster import KMeans
import numpy as np
# 假设数据:客户特征(如年龄和收入)
X = np.array([[25, 30000], [30, 40000], [35, 50000], [40, 60000], [45, 70000],
[50, 80000], [55, 90000], [60, 100000], [65, 110000], [70, 120000]])
# 使用 K-means++ 初始化进行聚类
kmeans = KMeans(n_clusters=3, init='k-means++', random_state=0).fit(X)
# 获取聚类标签和簇心
labels = kmeans.labels_
centers = kmeans.cluster_centers_
# 输出簇心
print(centers)
结果:
K-means++ 能有效地选择初始簇心,从而使得聚类效果更好,避免了K-means陷入局部最优。
总结
- K-means 是一种广泛使用的聚类方法,适用于簇的形状比较均匀的情况。
- DBSCAN 适用于有噪声和不规则簇形的数据,可以自动检测噪声点。
- 层次聚类 适用于需要逐步建立层次关系的应用,如生物分类和树形数据结构。
- K-means++ 改进了K-means算法的初始化问题,能提高聚类的效果和稳定性。
聚类算法的选择通常取决于数据的特点(如簇形状、噪声等)。了解不同聚类方法的优缺点和应用场景对于选择合适的算法至关重要。