一.聚类的作用

聚类是机器学习中的一种重要方法,主要用于无监督学习场景。以下是聚类的几个主要目的和应用场景:

(1). 数据探索和理解

数据分布可视化:通过聚类,可以直观地查看数据集的结构和分布,有助于理解数据的特性。发现模式:聚类可以揭示数据中的潜在模式、趋势和结构,帮助分析数据的相似性。

(2). 特征工程

特征选择:聚类结果可以用于特征选择,通过识别相关性强的特征来减少维度。创建新特征:根据聚类结果,可以为模型生成新的特征,例如为每个样本分配一个聚类标签。

(3). 数据预处理

降噪:通过聚类,可以识别和去除噪声数据(异常值),从而提高后续分析的准确性。数据平衡:在不平衡数据集中,聚类可以帮助平衡类别,以便更好地训练模型。

(4). 客户细分

市场营销:聚类可用于将客户根据行为或特征分组,从而制定有针对性的市场策略。个性化推荐:通过分析用户的聚类,可以为用户提供个性化的推荐和服务。

(5). 图像处理

图像分割:在计算机视觉中,聚类可以用于图像分割,将图像中的不同区域或对象进行分离。特征提取:在图像识别中,可以通过聚类提取相似特征,以提高识别效果。

(6). 社交网络分析

社区检测:在社交网络中,聚类可以识别社交群体或社区,分析用户之间的关系。信息传播:通过聚类分析,可以研究信息在不同社交圈中的传播模式。

(7). 监测和异常检测

异常检测:聚类可用于识别数据中的异常模式,从而发现潜在的风险或欺诈行为。监测系统:在工业或网络监控中,聚类可以用于识别正常和异常行为,帮助提高系统的安全性和稳定性。

总结

聚类在机器学习中是一个非常重要的工具,能够帮助我们理解数据、改善数据质量、提供个性化服务以及识别潜在问题。无论是在商业、科学还是工程领域,聚类都有着广泛的应用。通过合理的聚类分析,可以为决策提供有力的支持。

以下是使用聚类的一些具体原因:

无监督学习:在没有标签数据的情况下,聚类算法可以自动发现数据中的模式。特征发现:聚类可以帮助识别数据中的重要特征,这些特征可能对后续的监督学习任务有帮助。数据压缩:通过聚类,可以用少量的聚类中心来表示大量的数据点,从而实现数据压缩。决策支持:在商业和决策过程中,聚类结果可以提供洞察,支持更明智的决策制定。科学研究:在生物学、物理学、社会学等领域,聚类可以帮助研究人员理解复杂的数据模式。

总之,聚类是机器学习中的一种重要工具,它为数据分析提供了一个无监督的框架,使我们能够在没有明确指导的情况下探索和理解数据。

聚类是一种无监督学习方法,其目的是将数据集中的样本根据特征的相似性进行分组。以下是一些常见的聚类算法,包括其细节、评估方式、优缺点以及代码示例。

二、常见聚类算法

1. K-means 聚类

算法概述:

K-means 是一种基于原型的聚类算法,通过迭代的方法将数据点分成 K 个簇。算法步骤:

随机选择 K 个初始中心点(质心)。将每个数据点分配到最近的中心点所在的簇。计算每个簇的新的质心(即簇中所有点的均值)。重复步骤 2 和 3,直到中心点不再变化或达到最大迭代次数。

公式:

目标函数为最小化平方误差(SSE):

J=∑k=1K∑xi∈Ck∥xi−ck∥2

J = \sum_{k=1}^{K} \sum_{x_i \in C_k} \| x_i - c_k \|^2

J=k=1∑K​xi​∈Ck​∑​∥xi​−ck​∥2

( CkC_kCk​ ):第 ( kkk ) 个簇,( ckc_kck​ ) 为第 ( kkk ) 个簇的簇心。( xix_ixi​ ):样本点。

优缺点:

优点:

简单易实现,计算速度快。对大规模数据集表现良好。

缺点:

K 值需要提前指定,且对初始中心点敏感。对噪声和异常值敏感。只能发现球状簇,无法处理形状复杂的簇。

评估方式:

使用肘部法则 (Elbow Method) 来选择 K 值,通过绘制不同 K 值下的 SSE (Sum of Squared Errors) 来寻找合适的 K 值。轮廓系数 (Silhouette Score) 用于评估聚类效果。

代码示例:

import numpy as np

import matplotlib.pyplot as plt

from sklearn.cluster import KMeans

from sklearn.datasets import make_blobs

from sklearn.metrics import silhouette_score

# 生成示例数据

X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 使用肘部法则确定最佳 K 值

SSE = []

K_range = range(1, 10)

for k in K_range:

kmeans = KMeans(n_clusters=k)

kmeans.fit(X)

SSE.append(kmeans.inertia_)

plt.plot(K_range, SSE, marker='o')

plt.title('Elbow Method')

plt.xlabel('Number of clusters K')

plt.ylabel('SSE')

plt.show()

# 选择 K=4

kmeans = KMeans(n_clusters=4)

y_kmeans = kmeans.fit_predict(X)

# 绘制结果

plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')

plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], c='red', s=200, alpha=0.75, marker='X')

plt.title('K-means Clustering')

plt.show()

# 评估聚类效果

silhouette_avg = silhouette_score(X, y_kmeans)

print("Silhouette Score:", silhouette_avg)

# Silhouette Score: 0.6819938690643478

2.Mean-Shift 聚类

算法概述:

Mean-Shift 是一种基于密度的聚类算法,旨在找到数据点的高密度区域,进而识别出聚类中心。与 K-means 类似,Mean-Shift 也试图将样本点聚集到密度较高的区域,但不同之处在于它不需要预先指定簇的数量。

算法步骤:

初始化:为数据集中的每个点初始化一个窗口(通常是一个球形窗口)。计算均值:对于每个窗口,计算窗口内所有点的均值,作为新的点。窗口移动:将窗口移动到计算得出的均值位置。收敛检测:重复步骤 2 和 3,直到窗口位置不再变化(即收敛)。聚类形成:所有收敛到同一位置的点被视为同一簇。

公式:

均值移动可以表示为:

xnew=x+1N∑xi∈N(x)(xi−x)

x_{\text{new}} = x + \frac{1}{N} \sum_{x_i \in N(x)} (x_i - x)

xnew​=x+N1​xi​∈N(x)∑​(xi​−x)

( N(x)N(x)N(x) ):点 ( xxx ) 的邻域。

( NNN ):邻域内的点数。

优缺点:

优点:

不需要预先指定聚类的数量。可以发现任意形状的簇。对噪声具有一定的鲁棒性。

缺点:

对参数选择(如窗口大小)敏感。计算复杂度较高,尤其是在大规模数据集上。在高维空间中,聚类效果可能不佳(维数灾难)。

评估方式:

评估 Mean-Shift 聚类的效果可以使用轮廓系数 (Silhouette Score) 和 Davies-Bouldin 指数等。

代码示例

以下是使用 Mean-Shift 聚类的代码示例:

import numpy as np

import matplotlib.pyplot as plt

from sklearn.datasets import make_blobs

from sklearn.cluster import MeanShift

from sklearn.metrics import silhouette_score

# 生成示例数据

X, _ = make_blobs(n_samples=300, centers=3, cluster_std=0.60, random_state=0)

# 使用 Mean-Shift 进行聚类

mean_shift = MeanShift()

mean_shift.fit(X)

y_mean_shift = mean_shift.labels_

# 绘制结果

plt.scatter(X[:, 0], X[:, 1], c=y_mean_shift, s=50, cmap='viridis')

plt.scatter(mean_shift.cluster_centers_[:, 0], mean_shift.cluster_centers_[:, 1], c='red', s=200, alpha=0.75, marker='X')

plt.title('Mean-Shift Clustering')

plt.xlabel('Feature 1')

plt.ylabel('Feature 2')

plt.show()

# 评估聚类效果

silhouette_avg = silhouette_score(X, y_mean_shift)

print("Silhouette Score:", silhouette_avg)

#Silhouette Score: 0.6594056994076228

3. 层次聚类 (Hierarchical Clustering)

算法概述:

层次聚类创建一个树状的聚类结构,可以是凝聚的(自底向上)或分裂的(自顶向下)。凝聚法:

每个数据点作为一个独立的簇。计算所有簇之间的距离,合并最近的两个簇。重复步骤 2,直到只剩一个簇。

分裂法:

从一个簇开始(所有点)。逐步分裂最不相似的簇。重复,直到达到所需的簇数。

公式:

优缺点:

优点:

不需要事先指定簇的数量。提供了数据的层次结构,可以通过树状图可视化。

缺点:

计算复杂度高,处理大数据集时效率较低。对噪声和异常值敏感。

评估方式:

使用树状图(Dendrogram)可视化聚类结构,选择合适的切割阈值来确定簇的数量。

代码示例:

import matplotlib.pyplot as plt

from sklearn.datasets import make_blobs

from sklearn.cluster import AgglomerativeClustering

from scipy.cluster.hierarchy import dendrogram, linkage

# 生成示例数据

X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 使用层次聚类

hierarchical = AgglomerativeClustering(n_clusters=4)

y_hierarchical = hierarchical.fit_predict(X)

# 绘制聚类结果

plt.scatter(X[:, 0], X[:, 1], c=y_hierarchical, s=50, cmap='viridis')

plt.title('Agglomerative Hierarchical Clustering')

plt.show()

# 生成树状图

linked = linkage(X, method='ward') # 使用 Ward 方法

plt.figure(figsize=(10, 7))

dendrogram(linked, orientation='top', distance_sort='descending', show_leaf_counts=True)

plt.title('Dendrogram')

plt.xlabel('Sample index')

plt.ylabel('Distance')

plt.show()

4. DBSCAN (Density-Based Spatial Clustering of Applications with Noise)

算法概述:

DBSCAN 是基于密度的聚类算法,通过密度连接来识别簇。算法步骤:

对于每个未访问的点,检查其邻域内的点(以 ε 半径为界)。如果邻域内的点数超过指定阈值 (minPtsminPtsminPts),则将这些点标记为一个簇。否则,将该点标记为噪声点。对于每个新点,重复步骤 1 和 2,直到所有点都被访问。

公式:

邻域定义为:

N(ϵ)={xj∣∥xi−xj∥≤ϵ}

N(\epsilon) = \{ x_j \mid \| x_i - x_j \| \leq \epsilon \}

N(ϵ)={xj​∣∥xi​−xj​∥≤ϵ}

( ϵ\epsilonϵ ):邻域半径。( minPts\text{minPts}minPts ):邻域内的最小点数。

优缺点:

优点:

不需要事先指定簇的数量。能够发现任意形状的簇,并且能有效处理噪声。

缺点:

对参数 ε 和 minPts 敏感,选择不当可能影响结果。在高维空间中表现较差(维数灾难)。

评估方式:

使用轮廓系数 (Silhouette Score) 和 Davies-Bouldin 指数等进行评估。

代码示例:

import matplotlib.pyplot as plt

from sklearn.datasets import make_blobs

from sklearn.metrics import silhouette_score

from sklearn.cluster import DBSCAN

# 生成示例数据

X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 执行 DBSCAN

dbscan = DBSCAN(eps=0.5, min_samples=5)

y_dbscan = dbscan.fit_predict(X)

# 绘制结果

plt.scatter(X[:, 0], X[:, 1], c=y_dbscan, s=50, cmap='viridis')

plt.title('DBSCAN Clustering')

plt.show()

# 评估聚类效果

silhouette_avg = silhouette_score(X, y_dbscan)

print("Silhouette Score:", silhouette_avg)

#Silhouette Score: 0.6303800996842714

三、评估聚类效果的指标

轮廓系数 (Silhouette Score):

衡量每个样本与其所属簇和最近的其他簇之间的相似度,值在 [-1, 1] 之间,越接近 1 表示聚类效果越好。

Davies-Bouldin 指数:

衡量簇的紧密度和分离度,值越小表示聚类效果越好。

Calinski-Harabasz 指数:

衡量簇内的紧密度与簇间的分离度,值越大表示聚类效果越好。