当前位置:首页 > Python > 正文

Python聚类算法选择指南:从原理到实践 | 机器学习教程

Python聚类算法选择指南:从原理到实践

聚类分析是机器学习中重要的无监督学习技术,广泛应用于客户细分、异常检测、图像分割等领域。本文将详细介绍Python中常用的聚类算法,包括K-means、DBSCAN、层次聚类等,并提供算法选择指南和实际代码示例。

1. 聚类算法概述

聚类分析是将数据集中的对象分成相似对象组成的多个组(簇)的过程,使得同一簇中的对象相似度较高,不同簇中的对象相似度较低。

聚类算法的主要类型:

  • 划分聚类:如K-means、K-medoids
  • 密度聚类:如DBSCAN、OPTICS
  • 层次聚类:如凝聚层次聚类、分裂层次聚类
  • 模型聚类:如高斯混合模型
  • 谱聚类:基于图论的聚类方法

2. 常见聚类算法比较

算法 适用场景 优点 缺点
K-means 球形簇,数据量中等 简单高效,可扩展性好 需指定K值,对异常值敏感
DBSCAN 任意形状簇,噪声数据 无需指定簇数,抗噪声 对参数敏感,高维数据效果差
层次聚类 小数据集,需要层次结构 可视化好,可获取层次关系 计算复杂度高,不适合大数据
高斯混合模型 概率模型,不同大小/形状的簇 软聚类,概率分配 计算复杂,可能收敛到局部最优

3. 算法选择的关键因素

数据集大小

K-means适合大数据集,层次聚类适合小数据集

簇的形状

球形簇选K-means,任意形状选DBSCAN或谱聚类

数据维度

高维数据考虑降维或使用谱聚类

噪声数据

噪声较多时选择DBSCAN等密度聚类算法

4. K-means聚类详解

K-means是最常用的聚类算法,通过迭代将数据划分为K个簇。

算法步骤:

  1. 随机选择K个初始质心
  2. 将每个点分配到最近的质心形成簇
  3. 重新计算每个簇的质心
  4. 重复2-3步直到质心不再变化

Python代码示例:

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 创建模拟数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 应用K-means
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75)
plt.title('K-means聚类结果')
plt.show()
            

5. DBSCAN聚类详解

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法。

核心概念:

  • 核心点:在半径ε内至少有minPts个点的点
  • 边界点:在核心点ε邻域内但自身不满足核心点条件的点
  • 噪声点:既不是核心点也不是边界点的点

Python代码示例:

from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt

# 创建半月形数据
X, y = make_moons(n_samples=200, noise=0.05, random_state=0)

# 应用DBSCAN
dbscan = DBSCAN(eps=0.3, min_samples=5)
clusters = dbscan.fit_predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=clusters, s=50, cmap='viridis')
plt.title('DBSCAN聚类结果')
plt.show()
            

6. 层次聚类详解

层次聚类通过构建树状的层次结构来分解数据集,分为凝聚(自底向上)和分裂(自顶向下)两种方法。

Python代码示例:

from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

# 创建数据
X, y = make_blobs(n_samples=30, centers=3, random_state=0)

# 凝聚层次聚类
agg = AgglomerativeClustering(n_clusters=3)
assignment = agg.fit_predict(X)

# 绘制树状图
plt.figure(figsize=(10, 5))
plt.title("层次聚类的树状图")
dendrogram(linkage(X, method='ward'))
plt.show()
            

7. 聚类评估方法

内部指标

  • 轮廓系数:衡量簇内紧密度和簇间分离度
  • Calinski-Harabasz指数:簇间离散度与簇内离散度之比
  • Davies-Bouldin指数:簇内离散度与簇间分离度之比

外部指标

  • 调整兰德指数:衡量聚类结果与真实标签的相似度
  • 互信息:衡量聚类结果与真实标签的信息共享量
  • 同质性:每个簇仅包含单个类的成员

8. 实战案例:客户细分

使用Mall Customer数据集对客户进行细分,基于年收入、消费分数等特征。

完整代码实现:

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt

# 加载数据
data = pd.read_csv('Mall_Customers.csv')
X = data[['Annual Income (k$)', 'Spending Score (1-100)']]

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

# 使用肘部方法确定最佳K值
wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42)
    kmeans.fit(X_scaled)
    wcss.append(kmeans.inertia_)
    
# 绘制肘部图
plt.plot(range(1, 11), wcss, marker='o')
plt.title('肘部方法')
plt.xlabel('簇数量')
plt.ylabel('WCSS')
plt.show()

# 根据肘部图选择K=5
kmeans = KMeans(n_clusters=5, init='k-means++', random_state=42)
clusters = kmeans.fit_predict(X_scaled)

# 可视化结果
plt.figure(figsize=(10, 6))
plt.scatter(X_scaled[:,0], X_scaled[:,1], c=clusters, cmap='viridis', s=50)
plt.scatter(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1], 
            s=200, c='red', marker='X', label='质心')
plt.title('客户聚类结果')
plt.xlabel('标准化年收入')
plt.ylabel('标准化消费分数')
plt.legend()
plt.show()
            

客户聚类分析结果:

  • 高收入高消费:目标客户群体,提供高端产品
  • 中等收入中等消费:最大客户群体,提供性价比产品
  • 低收入高消费:潜在风险群体,需关注消费习惯
  • 高收入低消费:需激活消费潜力,提供专属优惠
  • 低收入低消费:基础服务群体,保持基本服务

总结

选择合适的聚类算法是数据分析的关键步骤:

  • K-means适用于球形簇和大数据集
  • DBSCAN适合任意形状簇和含噪声数据
  • 层次聚类提供簇间关系可视化
  • 高斯混合模型支持概率聚类

实际应用中,建议尝试多种算法并结合业务需求进行评估,使用轮廓系数等指标比较不同算法的效果。同时,数据预处理(标准化、降维)对聚类结果有重要影响。

发表评论