文章目录
- 聚类分析简介
- K-means聚类
- 什么是K-means聚类?
- K-means聚类的步骤
- K-means聚类的特点
- K-means聚类实例
- 层次聚类
- 什么是层次聚类?
- 层次聚类的类型
- 层次聚类的步骤
- 层次聚类的特点
- 层次聚类实例
- K-means与层次聚类对比
- 相同点
- 不同点
- 结论
- 补充
聚类分析是数据挖掘中的一项重要技术,它可以帮助我们发现数据中的模式和结构。本文将介绍两种常用的聚类算法:K-means聚类和层次聚类,并通过实例展示它们在数据分析中的应用。
聚类分析简介
聚类分析是一种无监督学习方法,旨在将数据集中的对象分组,使得同一组内的对象相似度高,而不同组之间的对象相似度低。聚类分析广泛应用于市场细分、社交网络分析、图像分割等领域。
K-means聚类
什么是K-means聚类?
K-means聚类是一种基于中心的聚类算法,它将数据点划分到K个簇中,每个簇由一个质心点代表。算法的目标是最小化簇内点到质心的距离之和。
K-means聚类的步骤
- 初始化:随机选择K个数据点作为初始质心。
- 分配:将每个数据点分配到最近的质心,形成K个簇。
- 更新:重新计算每个簇的质心,通常是簇内所有点的均值。
- 迭代:重复分配和更新步骤,直到质心不再显著变化或达到预设迭代次数。
K-means聚类的特点
- 简单高效,易于实现。
- 对初始质心选择敏感,可能导致局部最优解。
- 适用于大规模数据集,但需要预先指定簇的数量。
K-means聚类实例
假设我们有一组客户数据,包括年龄、年收入等特征。使用K-means聚类,我们可以将客户分为几个具有相似特征的群体,以便于市场细分。
好的,下面是一个完整的聚类分析示例,包括数据生成、预处理、聚类分析、结果解释和可视化。
1. 数据生成
首先,我们生成一个包含多个特征的模拟客户数据集。
import pandas as pd
import numpy as np
# 生成模拟数据
data = {
'客户ID': ['C001', 'C002', 'C003', 'C004', 'C005', 'C006', 'C007', 'C008', 'C009', 'C010'],
'性别': ['男', '女', '男', '女', '男', '女', '男', '女', '男', '女'],
'年龄': [34, 28, 45, 25, 40, 31, 39, 42, 30, 36],
'年收入': [120, 90, 200, 60, 150, 80, 130, 100, 70, 110],
'教育水平': ['本科', '大专', '硕士', '本科', '硕士', '大专', '本科', '博士', '硕士', '本科'],
'购买频率': ['高', '中', '低', '高', '中', '高', '低', '中', '高', '低'],
'总消费金额': [5000, 3000, 10000, 4000, 6000, 2500, 8000, 7000, 5500, 4500],
'会员等级': ['银', '铜', '金', '银', '金', '铜', '银', '金', '银', '铜']
}
df = pd.DataFrame(data)
print(df)
2. 数据预处理
接下来,我们对数据进行预处理,包括编码分类变量和标准化数值特征。
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
# 定义数值特征和分类特征
numeric_features = ['年龄', '年收入', '总消费金额']
categorical_features = ['性别', '教育水平', '购买频率', '会员等级']
# 创建预处理器
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), numeric_features),
('cat', OneHotEncoder(), categorical_features)
])
# 拟合预处理器并转换数据
X = preprocessor.fit_transform(df.drop('客户ID', axis=1))
3. K-means聚类分析
使用K-means算法对数据进行聚类。
from sklearn.cluster import KMeans
# 应用K-means聚类
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)
# 将聚类结果添加到原始DataFrame
df['K-means 聚类标签'] = kmeans.labels_
from sklearn.decomposition import PCA
# 降维以便可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# 绘制散点图
plt.figure(figsize=(8, 6))
for i in range(kmeans.n_clusters):
plt.scatter(X_pca[kmeans.labels_ == i, 0], X_pca[kmeans.labels_ == i, 1],
label=f'Cluster {i+1}')
# 绘制质心
plt.scatter(pca.transform(kmeans.cluster_centers_)[:, 0], pca.transform(kmeans.cluster_centers_)[:, 1],
s=300, c='red', label='Centroids')
plt.title('K-means Clustering')
plt.xlabel('PCA Feature 1')
plt.ylabel('PCA Feature 2')
plt.legend()
plt.show()
层次聚类
什么是层次聚类?
层次聚类是一种不需要预先指定簇数量的聚类方法。它通过逐步合并或分割簇来构建一个层次结构,最终形成一个树状图来展示聚类结果。
层次聚类的类型
- 凝聚的层次聚类:从每个数据点作为单独的簇开始,逐步合并最接近的簇对。
- 分裂的层次聚类:从所有数据点作为一个簇开始,逐步分割最大的簇。
层次聚类的步骤
- 初始化:将每个数据点视为一个单独的簇。
- 计算距离:计算所有簇对之间的距离。
- 合并最近的簇:合并距离最近的两个簇。
- 更新距离矩阵:更新距离矩阵以反映新簇与其他簇之间的距离。
- 生成树状图:通过合并过程生成树状图。
层次聚类的特点
- 不需要预先指定簇的数量。
- 可以揭示数据的层次结构。
- 计算复杂度高,对噪声和异常值敏感。
层次聚类实例
针对上面的例子,我们采用层次聚类来实现
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# 应用层次聚类
Z = linkage(X, method='ward')
# 绘制谱系图
plt.figure(figsize=(8, 6))
dendrogram(Z, orientation='top')
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample index')
plt.ylabel('Distance')
plt.show()
K-means与层次聚类对比
K-means聚类和层次聚类是两种常用的聚类方法,它们在概念、算法和应用方面有一些相似之处,但也存在显著的不同点。以下是它们的一些主要异同:
相同点
- 聚类目的:两者都旨在将数据集中的对象分组,使得同一组内的对象比其他组的对象更相似。
- 无监督学习:K-means聚类和层次聚类都属于无监督学习算法,它们不需要预先标记的训练数据。
- 应用领域:它们都可以应用于市场细分、社交网络分析、图像分割、生物信息学等领域。
不同点
-
簇的数量:
- K-means聚类:需要预先指定簇的数量(K值)。
- 层次聚类:不需要预先指定簇的数量,可以通过剪枝树状图来确定簇的数量。
-
算法性质:
- K-means聚类:是一种基于中心的聚类方法,通过迭代优化质心位置来聚类。
- 层次聚类:是一种基于树状图的聚类方法,通过逐步合并或分割簇来构建层次结构。
-
算法过程:
- K-means聚类:包括初始化质心、分配数据点到最近的质心、更新质心位置等步骤。
- 层次聚类:包括计算距离矩阵、合并或分割簇、构建树状图等步骤。
-
算法复杂度:
- K-means聚类:通常具有较低的时间复杂度,适合大规模数据集。
- 层次聚类:时间复杂度较高,尤其是在数据量大时。
-
对初始条件的敏感性:
- K-means聚类:对初始质心的选择敏感,可能导致局部最优解。
- 层次聚类:不受初始质心选择的影响,但对距离度量和数据的尺度敏感。
-
结果解释:
- K-means聚类:结果通常更直观,容易解释。
- 层次聚类:通过树状图展示聚类过程,可以提供更丰富的信息,但可能需要更多的解释工作。
-
适用场景:
- K-means聚类:适用于大规模数据集,且簇的形状近似为球形时效果较好。
- 层次聚类:适用于数据集较小或需要揭示数据层次结构的情况。
-
可视化:
- K-means聚类:通常通过散点图展示聚类结果。
- 层次聚类:通过树状图展示聚类过程和结果。
在选择聚类算法时,应根据数据的特性、规模、形状以及分析的目标来决定使用K-means聚类还是层次聚类。有时,为了获得更全面的洞察,可以同时使用这两种方法进行分析。
结论
K-means聚类和层次聚类都是强大的聚类工具,它们各有优势和局限性。选择哪种聚类方法取决于数据的特性和分析的目标。在实际应用中,我们可能需要尝试多种聚类算法,并结合领域知识来解释聚类结果。聚类分析不仅能够帮助我们理解数据,还能够指导我们做出更明智的决策。随着数据科学的发展,聚类算法将继续在各个领域发挥重要作用。
补充
确定最佳的簇数量是聚类分析中的一个关键问题,尤其是在使用K-means聚类或需要预先指定簇数量的其他聚类算法时。以下是一些常用的方法来帮助确定最佳的簇数量:
-
肘部法则(Elbow Method):
- 将数据集用不同数量的簇进行K-means聚类,然后计算每个模型的总内部平方和(SSE,即簇内误差平方和)。
- 绘制SSE与簇数量的图,选择SSE下降速率骤减的点作为最佳簇数量。
-
轮廓系数(Silhouette Coefficient):
- 轮廓系数衡量每个数据点聚类的质量,范围从-1到1,值越大表示聚类效果越好。
- 对于不同的簇数量,计算所有数据点的轮廓系数的平均值,选择平均轮廓系数最大的簇数量。
-
戴维森堡丁指数(Davies-Bouldin Index):
- 这个指数衡量簇的相似度,值越小表示聚类效果越好。
- 与轮廓系数相反,戴维森堡丁指数越小,表示簇内的相似度越高,簇间的分离度越好。
-
Calinski-Harabasz指数(也称为方差比指数):
- 这个指数衡量簇间方差与簇内方差的比率,值越大表示聚类效果越好。
- 对于不同的簇数量,计算Calinski-Harabasz指数,并选择最大值对应的簇数量。
-
Gap统计量:
- Gap统计量比较数据集的聚类分布与一系列参考分布(通常是随机分布)之间的差异。
- 选择使Gap值最大的簇数量,表示该数量下的聚类效果显著优于随机分布。
-
交叉验证:
- 将数据集分为训练集和测试集,使用训练集进行聚类,然后在测试集上评估聚类效果。
- 选择在测试集上表现最好的簇数量。
-
领域知识:
- 结合领域专家的知识来确定簇的数量。在某些情况下,簇的数量可能基于业务逻辑或先验知识。
-
稳定性分析:
- 通过在不同的数据子集上运行聚类算法来检查结果的稳定性。
- 如果在不同的子集上得到的簇分配相似,则可以认为簇的数量是合理的。
-
可视化方法:
- 使用如树状图、散点图等可视化工具来直观评估不同簇数量下的聚类效果。
在实际应用中,可能需要结合多种方法来确定最佳的簇数量。例如,可以先使用肘部法则和轮廓系数来缩小可能的簇数量范围,然后使用领域知识或稳定性分析来做出最终决定。