聚类算法是机器学习中一种重要的无监督学习算法,它的目的是将一组数据分成几个簇,使得同一个簇内的数据点之间相似度高,而不同簇内的数据点相似度低。聚类算法广泛应用于数据挖掘、图像分割、市场细分等领域。选择合适的聚类算法通常取决于数据的特性和分析目标。
1、K-均值聚类(K-Means Clustering)
K-均值聚类(K-Means Clustering)是一种广泛使用的机器学习算法,它属于无监督学习算法。这种算法试图将数据分成预先指定数量的簇,使得同一簇内的数据点相似度高,而不同簇内的数据点相似度低。
初始化过程中,通过随机选择K个数据点作为起始的簇中心(质心)开始。接着,在分配阶段,每个数据点会被分配给与其距离最小的簇中心,确保每个数据点归属于最近的簇。随后的更新阶段要求对每个簇重新计算中心,通常采取簇内所有点的均值作为新的簇中心。此过程不断重复,即不停地执行分配和更新步骤,直到满足结束条件:簇中心不再发生显著变化,或者变化非常小,或者达到了预先设置的迭代次数上限。此过程是很多聚类算法中的核心步骤,可以通过不断优化簇中心的位置,来提高聚类的准确性和效率。
K-均值聚类算法的关键参数是K,即预先设定的簇的数量。选择合适的K值是实现好的聚类效果的关键。不同的K值会导致聚类结果的显著不同,通常需要依据具体问题和数据集的特性来决定。有多种方法可以帮助确定最佳的K值,如肘方法(Elbow Method)和轮廓系数(Silhouette Coefficient)。Python 的scikit-learn 库中,K-means 算法由 KMeans
类提供,它有多个参数可以调整算法的行为。常用参数如下,
参数 |
类型 |
描述 |
n_clusters |
整数 |
要形成的簇的数量, 也即是中心点的数量。 这是最重要的参数, 直接影响聚类的结果。 |
init |
字符串或 ndarray |
初始化中心点的方法。 可以是 'k-means++'、 'random' 或者传递一个 ndarray。 'k-means++' 通过一种智能方式加速收敛, 而 'random' 则从数据中随机选择初始中心。 |
n_init |
整数 |
算法运行带不同质心种子的次数。 默认为 算法将运行 和(SSE)最低的作为最终结果。 |
max_iter |
整数 |
最大迭代次数, 如果在达到最大次数之前已经收敛, 则提前停止。默认值为 |
tol |
浮点数 |
收敛的容忍度。 如果簇中心的移动距离小于此值, 则认为算法已经收敛。默认值为 |
precompute_distances |
废弃 |
(已废弃)是否提前计算距离。 这个参数已在较新版本中废弃。 |
verbose |
整数 |
控制算法的冗余级别。 较高的值表示更多的信息输出。 |
random_state |
整数或 RandomState 实例 |
随机数生成器的种子。 用于结果的可重现性。 |
algorithm |
字符串 |
执行 K-means 算法的方法。 可选 'auto'、'full' 或 'elkan', 其中 'auto' 会根据数据的特性自动 选择最适合的算法。 |
使用示例,
from sklearn.cluster import KMeans from sklearn.datasets import make_blobs import matplotlib.pyplot as plt # 生成样本数据 n_samples = 300 random_state = 42 X, _ = make_blobs(n_samples=n_samples, random_state=random_state) # 设置KMeans聚类 kmeans = KMeans(n_clusters=3, # 聚类中心的数量 init='k-means++', # 初始化中心点的方法 n_init=10, # 不同质心种子的运行次数 max_iter=300, # 最大迭代次数 tol=1e-4, # 收敛的容忍度 random_state=random_state)# 随机数种子,确保可重复性 # 对数据进行聚类 kmeans.fit(X) # 预测每个样本的簇标签 labels = kmeans.labels_ # 获取聚类中心 centers = kmeans.cluster_centers_ # 绘制样本和聚类中心 plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis') plt.scatter(centers[:, 0], centers[: