K-means聚类算法:具体应用与代码

1、K-means算法的基本思想

K-means算法是一种迭代求解的聚类分析算法,其核心思想是将数据集中的n个对象划分为K个聚类,使得每个对象到其所属聚类的中心(或称为均值点、质心)的距离之和最小。这里所说的距离通常指的是欧氏距离,但也可以是其他类型的距离度量。

K-means算法通过迭代的方式不断优化聚类结果,使得每个聚类内的对象尽可能紧密,而不同聚类间的对象则尽可能分开。这种优化过程通常基于某种目标函数,如误差平方和(Sum of Squared Errors, SSE),该目标函数衡量了所有对象到其所属聚类中心的距离之和。

在众多聚类算法中,K-means算法因其简单高效而备受青睐。K-means算法的基本思想是:通过迭代的方式,将数据划分为K个不同的簇,并使得每个数据点与其所属簇的质心(或称为中心点、均值点)之间的距离之和最小。

具体来说,K-means算法的执行过程通常包括以下几个步骤:首先,随机选择K个数据点作为初始的簇质心;然后,根据每个数据点与各个簇质心的距离,将其分配给最近的簇;接着,重新计算每个簇的质心,即取簇内所有数据点的平均值作为新的质心;重复上述的分配和更新步骤,直到满足某种终止条件(如簇质心不再发生显著变化或达到预设的迭代次数)。

K-means的执行结果:最终的聚类中心不一定是数据内的点,而是簇中的数据点的中心

2、算法步骤详解

K-means算法的执行过程通常包括以下几个步骤:

(1)初始化:选择K个初始聚类中心

在算法开始时,需要随机选择K个数据点作为初始的聚类中心。这些初始聚类中心的选择对最终的聚类结果有一定的影响,因此在实际应用中,通常会采用一些启发式的方法来选择较好的初始聚类中心,如K-means++算法。

(2)分配:将每个数据点分配给最近的聚类中心

对于数据集中的每个数据点,计算其与每个聚类中心的距离,并将其分配给距离最近的聚类中心。这一步通常使用欧氏距离作为距离度量,计算公式如下:(公式建议使用Edge浏览器,chrome可能不行)

$ dist(x,c_i)=\sqrt{\sum_{j=1}^d{(x_j-c_{ij})^2}} $

其中,$x$是数据点,$c_i$ 是第 i 个聚类中心,$d$ 是数据的维度,$x_j$ 和 $c_{ij}$ 分别是$x$ 和 $c_i$ 在第 $j$ 维上的值。

(3)更新:重新计算每个聚类的中心

对于每个聚类,重新计算其聚类中心。新的聚类中心是该聚类内所有数据点的均值,计算公式如下:

$ c_i=\frac1{|S_i|}\sum_{x\in S_i}x $

(4)迭代:重复分配和更新步骤,直到满足终止条件

重复执行分配和更新步骤,直到满足某种终止条件。常见的终止条件包括:

  • 聚类中心不再发生显著变化:即新的聚类中心与旧的聚类中心之间的距离小于某个预设的阈值。
  • 达到最大迭代次数:为了避免算法陷入无限循环,通常会设置一个最大迭代次数作为终止条件。

在迭代过程中,算法会不断优化聚类结果,使得每个聚类内的对象更加紧密,而不同聚类间的对象更加分散。最终,当满足终止条件时,算法停止迭代并输出最终的聚类结果。

需要注意的是,K-means算法对初始聚类中心的选择和聚类数K的设定非常敏感。不同的初始聚类中心和K值可能会导致完全不同的聚类结果。因此,在实际应用中,通常需要结合具体问题和数据特点来选择合适的初始聚类中心和K值,并可能需要对算法进行多次运行以获取更稳定的结果。

三、K-means算法的优点与局限性

K-means算法作为机器学习中常用的聚类方法之一,在实际应用中具有诸多优点,但同时也存在一些局限性。下面我们将详细探讨K-means算法的优点和局限性。

1、优点
(1)简单易懂:
K-means算法的原理直观易懂,通过迭代的方式将数据划分为K个聚类,使得每个数据点到其所属聚类的质心距离之和最小。这种简单直观的思想使得K-means算法易于被理解和接受,适合初学者入门学习。

(2)计算效率高:
K-means算法在迭代过程中,主要涉及到距离计算和均值计算,这些计算相对简单且高效。因此,在处理大规模数据集时,K-means算法通常能够在较短的时间内完成聚类任务,适合用于实时处理或大规模数据处理场景。

(3)易于实现:
K-means算法的实现相对简单,只需按照初始化、分配、更新和迭代的步骤进行即可。这使得K-means算法在编程实践中易于实现和调试,降低了使用门槛。

2、 局限性
(1)对初始聚类中心敏感:
K-means算法的聚类结果在很大程度上受到初始聚类中心选择的影响。如果初始聚类中心选择不当,可能会导致聚类结果出现偏差或不稳定。为了缓解这一问题,可以采用一些启发式方法(如K-means++算法)来优化初始聚类中心的选择。

(2)可能陷入局部最优:
K-means算法在迭代过程中采用贪心策略,每一步都试图找到当前最优解。然而,这种策略可能导致算法陷入局部最优解,而无法达到全局最优。为了克服这一问题,可以尝试使用不同的初始聚类中心进行多次运行,或者结合其他优化算法来改进K-means算法的性能。

(3)需要预先设定聚类数K:
K-means算法需要提前设定聚类数K,这个值的选择往往需要根据具体问题和数据特点来确定。如果K值选择不当,可能会导致聚类结果不符合实际情况或无法有效揭示数据的内在结构。在实际应用中,可以通过一些评估指标(如轮廓系数、肘部法则等)来辅助确定合适的K值。

综上所述,K-means算法具有简单易懂、计算效率高和易于实现等优点,但同时也存在对初始聚类中心敏感、可能陷入局部最优和需要预先设定聚类数K等局限性。因此,在使用K-means算法时,我们需要结合具体问题和数据特点来选择合适的初始聚类中心、K值以及优化策略,以获得更好的聚类效果。

四、K-means算法的应用场景

1、 图像处理
在图像处理领域,K-means算法常用于图像分割和颜色量化等任务。

图像分割:K-means算法能够将图像中的像素点按照颜色、亮度等特征进行聚类,从而实现图像的分割。通过设定不同的聚类数K,可以将图像划分为不同的区域,有助于提取出图像中的目标物体或背景信息。

颜色量化:在图像压缩或简化处理中,K-means算法可以用于减少图像中的颜色数量。通过将颜色空间中的颜色值进行聚类,每个聚类中心代表一种颜色,从而实现对图像颜色的量化。这有助于减小图像文件的大小,同时保持较好的视觉效果。

五、K-means算法的优化与改进

4、自适应确定聚类数K的方法
K-means算法需要提前设定聚类数K,而选择合适的K值往往是一个挑战。为了自适应地确定聚类数K,研究者们提出了以下方法:

轮廓系数:轮廓系数是一种评估聚类效果的指标,它综合考虑了同一聚类内数据点的紧凑度和不同聚类间数据点的分离度。通过计算不同K值下的轮廓系数,可以选择使得轮廓系数最大的K值作为最优聚类数。

肘部法则:肘部法则通过观察聚类误差平方和(SSE)随K值变化的曲线来确定最优聚类数。当K值较小时,增加K值会显著降低SSE;而当K值达到某个阈值后,再增加K值对SSE的降低效果不再明显。这个阈值对应的K值即为最优聚类数。

六、K-means算法的实现与案例

在Python中,我们可以使用sklearn库中的KMeans类来方便地实现K-means算法。下面我们将展示如何使用sklearn库进行K-means聚类,并通过一个简单的案例来演示其在实际数据上的应用过程,同时介绍如何利用肘部法则来确定最佳的聚类数K。

1、使用sklearn实现K-means算法

首先,确保你已经安装了sklearn库。如果没有安装,可以使用pip进行安装:

pip install -U scikit-learn

然后,你可以按照以下步骤使用KMeans类:

from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt

# 假设我们有一些二维数据
data = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])

# 设置聚类数K
K = 2

# 使用 K-Means
# n_init 表示算法运行的次数(默认值是 10)。K-Means 会运行多次,并选择结果最优的一次(根据惯例是最小化总误差平方和)。
# random_state 表示随机数生成器的种子(默认值是 None)。如果指定了种子,每次运行 K-Means 都会得到相同的结果。
# n_clusters 表示聚类的数量(默认值是 8)。
# init 表示初始化方法(默认值是 'k-means++')。
# max_iter 表示最大迭代次数(默认值是 300)。
# tol 表示收敛阈值(默认值是 1e-4)。
kmeans = KMeans(n_clusters=2, init='random', n_init=100, random_state=1)

# 对数据进行拟合和预测
kmeans.fit(data)
labels = kmeans.predict(data)
centroids = kmeans.cluster_centers_

# 打印聚类中心和标签
print("Cluster centers:")
print(centroids)
print("Labels:")
print(labels)

# 可视化结果
plt.scatter(data[:, 0], data[:, 1], c=labels, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=300, alpha=0.5)
plt.title('K-means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

从上面的运行结果中,我们知道聚类中心为(1,2)和(4,2)点,也可以将相应的点打上类别的标签,上面代码的计算结果和可视化结果如下:

这段代码首先导入了必要的库,然后创建了一个二维数据集。接着,我们设置了聚类数K为2,并初始化了一个KMeans对象。之后,我们使用fit方法对数据进行拟合,并通过predict方法获取每个数据点的聚类标签。最后,我们打印出聚类中心和每个数据点的标签,并使用matplotlib进行可视化。

2、 简单的案例:确定K值并使用K-means算法

假设我们有一组关于用户购买行为的数据,并希望根据这些数据对用户进行聚类。我们将使用肘部法则来确定最佳的K值。

首先,加载数据并预处理(例如标准化或归一化):

from sklearn.datasets import make_blobs 
from sklearn.preprocessing import StandardScaler 

# 生成模拟数据 
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0) 

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

接下来,使用肘部法则确定K值:

from sklearn.metrics import silhouette_score 
import matplotlib.pyplot as plt 

# 肘部法则确定K值 
distortions = [] 
K = range(1, 10) 

for k in K: 
kmeanModel = KMeans(n_clusters=k).fit(X) 
distortions.append(kmeanModel.inertia_) 

# 绘制肘部图 
plt.plot(K, distortions, 'bx-') 
plt.xlabel('k') 
plt.ylabel('Distortion') 
plt.title('The Elbow Method showing the optimal k') 
plt.show()

在上面的代码中,我们计算了不同K值下的畸变程度(inertia),即每个样本与其所属聚类中心的距离之和。然后,我们绘制了K值与畸变程度的曲线图。根据肘部法则,我们选择畸变程度开始趋于平稳的K值作为最佳聚类数。通过上面的代码,我们知道当K=4时,loss产生的比较大幅度变化,所以这一份数据集KMeans聚类的最优的K就选择4;

一旦确定了K值,我们就可以使用K-means算法对数据进行聚类,并可视化结果:

 # 使用确定的K值进行聚类 
optimal_k = 4 # 假设通过肘部法则确定的最佳K值为4 
kmeans = KMeans(n_clusters=optimal_k, random_state=0) 
kmeans.fit(X) 
labels = kmeans.labels_ 
centroids = kmeans.cluster_centers_ 

# 可视化聚类结果 
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') 
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=300, alpha=0.5) 
plt.title('K-means Clustering with Optimal K')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

在上面的代码中,我们使用之前通过肘部法则确定的最佳K值来初始化KMeans对象,并对数据进行拟合。接着,我们获取每个数据点的聚类标签和聚类中心,并使用matplotlib库将聚类结果进行可视化。

通过这个案例,我们展示了如何使用sklearn库实现K-means算法,并通过肘部法则来确定最佳的聚类数K。在实际应用中,你可以根据具体的数据集和需求调整参数和可视化方法,以获得更好的聚类效果。

七、总结与展望

1、K-means聚类算法总结

K-means聚类算法是一种无监督学习方法,通过迭代优化将数据点划分为K个不相交的子集(即聚类)。算法的核心思想是通过初始化聚类中心,然后不断迭代更新每个聚类的中心点,直至聚类结果收敛。每个数据点被分配到距离最近的聚类中心所在的聚类中,而聚类中心则是其所属聚类中所有数据点的均值。

K-means算法的优点在于其实现简单、计算效率高,并且能够处理大规模数据集。它不需要预先定义复杂的模型,而是通过数据自身的分布特性进行聚类。此外,K-means算法对于球形或凸形的数据集聚类效果较好。

然而,K-means算法也存在一些缺点。首先,它对于初始聚类中心的选择非常敏感,不同的初始选择可能导致截然不同的聚类结果。其次,K-means算法需要预先设定聚类数K,而选择合适的K值通常是一个挑战。此外,算法对噪声和异常值也比较敏感,因为它们可能会显著影响聚类中心的位置。

为了优化K-means算法的性能和稳定性,研究者们提出了多种改进方法。这包括使用更好的初始聚类中心选择策略(如K-means++)、改进距离度量方式(如使用余弦相似度或曼哈顿距离)、采用加速技巧(如利用KD树或球树加速最近邻搜索),以及自适应确定聚类数K的方法(如通过轮廓系数或肘部法则确定K值)。


原文链接:https://blog.csdn.net/AI_dataloads/article/details/133322550      K-Means聚类算法原理(可视化超详细)

https://blog.csdn.net/qq_38614074/article/details/137456095   【机器学习-14】K-means聚类算法:原理、应用与优化

感谢你的阅读


欢迎评论交流


忽如一夜春风来,千树万树梨花开。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇