深入剖析机器学习K

您所在的位置:网站首页 数学最优化理论是谁提出的 深入剖析机器学习K

深入剖析机器学习K

2024-07-15 11:54| 来源: 网络整理| 查看: 265

K-means 聚类算法是机器学习中的基本算法之一,具有简单、高效和易于实现的特点。其数学基础主要包括距离度量、聚类中心更新以及目标函数优化。通过选择合适的 K 值、优化初始化方法、并行化处理和内存优化,可以显著提高 K-means 算法的性能和效果。本文详细介绍了 K-means 聚类算法的原理、应用、优化方法,并通过具体的示例代码帮助初学者理解和实现这一算法。希望本文能帮助你掌握 K-means 聚类算法,并应用到实际的数据分析和机器学习任务中。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pqfK9GFG-1720611934023)(https://i-blog.csdnimg.cn/direct/d4dbb5bb12634d46977e76d0fb26b5ff.png#pic_center)]

🧑 博主简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式+人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者,提供产品测评、学习辅导、简历面试辅导、毕设辅导、项目开发、C/C++/Java/Python/Linux/AI等方面的服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:gylzbk)

💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。

在这里插入图片描述

深入剖析K-means聚类算法:原理、应用场景与优化技巧详解 概述1. 🔬 K-means 聚类算法原理📍 聚类的定义🔍 K-means 算法步骤 2. 🧮 K-means 聚类算法的数学基础📏 距离度量⚖️ 聚类中心更新🎯 目标函数 3. 🚀 K-means 聚类算法的应用4. 🌟 K-means 聚类算法的优缺点优点缺点 5. 🔢 如何选择合适的 K 值📈 肘部法则(Elbow Method)📊 轮廓系数(Silhouette Coefficient) 6. 🛠️ K-means 聚类算法的优化⚡ K-means++ 初始化🌐 并行化处理🗂️ 内存优化 7. 💻 K-means 聚类算法的实现💡 使用 Python 实现 K-means 聚类自定义 K-means 算法 🧑‍💻 使用 scikit-learn 实现 K-means 聚类 8. 🔚 总结

概述

K-means 聚类是一种广泛使用的无监督学习算法,常用于数据挖掘和机器学习中的各种实际应用。本文将详细介绍 K-means 聚类算法的原理、数学基础、应用场景、以及如何进行优化,并提供示例代码帮助初学者更好地理解和实现这一算法。

1. 🔬 K-means 聚类算法原理 📍 聚类的定义

聚类是一种无监督学习任务,目的是将数据集中的数据点分组成多个组(簇),使得每个簇中的数据点彼此之间的相似度最大,而不同簇间的数据点相似度最小。K-means 聚类算法是一种常见的划分型聚类方法,它通过旋转迭代的方法使得每个簇的误差平方和最小化。

🔍 K-means 算法步骤

K-means 算法主要包含以下几个步骤:

选择K个初始的聚类中心(质心):

随机选择 K 个初始的聚类中心   μ 1 , μ 2 , … , μ k N \ \mu_1, \mu_2, \ldots, \mu_k N  μ1​,μ2​,…,μk​N。

分配数据点到最近的聚类中心:

对于每一个数据点   x i N \ x_i N  xi​N,计算它与每个聚类中心之间的距离,并将其分配到距离最小的聚类中心所属的簇中。

更新聚类中心:

重新计算每个簇的质心。新的质心是簇中所有数据点的平均值。

重复步骤 2 和 3,直到质心不再变化或变化非常小:

不断迭代,直到质心的位置稳定。 2. 🧮 K-means 聚类算法的数学基础 📏 距离度量

K-means 中最常用的距离度量方法是欧氏距离。对于两个数据点   x i N \ \mathbf{x}_i N  xi​N和   μ j N \ \mathbf{\mu}_j N  μj​N ,其欧氏距离为:

d ( x i , μ j ) = ∑ k = 1 n ( x i k − μ j k ) 2 d(\mathbf{x}_i, \mathbf{\mu}_j) = \sqrt{\sum_{k=1}^n (x_{ik} - \mu_{jk})^2} d(xi​,μj​)=k=1∑n​(xik​−μjk​)2 ​

其中,   x i N \ \mathbf{x}_i N  xi​N 表示第   i N \ i N  iN 个数据点,   μ j N \ \mathbf{\mu}_j N  μj​N 表示第   j N \ j N  jN 个质心,   n N \ n N  nN 是数据点的维数。

⚖️ 聚类中心更新

对于每个簇   C j N \ C_j N  Cj​N,新的质心计算如下:

μ j = 1 ∣ C j ∣ ∑ x i ∈ C j x i \mathbf{\mu}_j = \frac{1}{|C_j|} \sum_{\mathbf{x}_i \in C_j} \mathbf{x}_i μj​=∣Cj​∣1​xi​∈Cj​∑​xi​

其中,   ∣ C j ∣ N \ |C_j| N  ∣Cj​∣N 是簇   C j N \ C_j N  Cj​N 中的样本点数,   x i N \ \mathbf{x}_i N  xi​N 是属于簇   C j N \ C_j N  Cj​N 的数据点。

🎯 目标函数

K-means 算法的目标是最小化所有数据点到其所属簇的质心的距离平方和。其目标函数可以表示为:

J = ∑ j = 1 k ∑ x i ∈ C j ∥ x i − μ j ∥ 2 J = \sum_{j=1}^k \sum_{\mathbf{x}_i \in C_j} \|\mathbf{x}_i - \mathbf{\mu}_j\|^2 J=j=1∑k​xi​∈Cj​∑​∥xi​−μj​∥2

其中,   J N \ J N  JN 是目标函数值,   k N \ k N  kN 是簇的数量,   x i N \ \mathbf{x}_i N  xi​N 是数据点,   μ j N \ \mathbf{\mu}_j N  μj​N 是簇的质心。这一目标函数又称为误差平方和(Sum of Squared Errors, SSE)。

3. 🚀 K-means 聚类算法的应用

K-means 聚类算法在各个领域都有广泛的应用:

数据分组:如文件分类、客户分群等。图像压缩:将相似的颜色聚类,可以减少图像的颜色总数,从而压缩图像。市场细分:基于客户的购买行为或其他特征进行客户细分,以便进行精准营销。生物信息学:基因表达数据的聚类分析,用于发现潜在的生物学意义。 4. 🌟 K-means 聚类算法的优缺点 优点 简单易实现:算法步骤简单,易于编程实现。计算效率高:在大多数情况下,算法收敛速度快,计算效率高。适用范围广:能应用于多种领域和场景。 缺点 需要预先指定 K 值:必须预先指定聚类的数量 K。对初始质心敏感:初始质心的选择会影响聚类结果。易受噪声和异常值影响:噪声和异常值会显著影响聚类结果。仅适用于球状簇:K-means 聚类倾向于发现形状紧致、体积相似的簇,对于不同形状和大小的簇效果较差。 5. 🔢 如何选择合适的 K 值

选择合适的 K 值是使用 K-means 聚类算法的关键之一。以下是两种常见的选择方法:

📈 肘部法则(Elbow Method)

肘部法则是通过绘制误差平方和(SSE)与不同K值的曲线图来选择K值的方法。当K值增加时,簇内误差平方和(SSE)会减少,但是减少的幅度会逐渐变小。选择肘部点作为最佳K值,即曲线减小速度显著变慢的那个点。

import matplotlib.pyplot as plt from sklearn.cluster import KMeans def elbow_method(data): sse = [] for k in range(1, 11): kmeans = KMeans(n_clusters=k, random_state=0).fit(data) sse.append(kmeans.inertia_) plt.plot(range(1, 11), sse, marker='o') plt.xlabel('Number of clusters') plt.ylabel('SSE') plt.show() # 假设 data 是一个二维数据集 elbow_method(data) 📊 轮廓系数(Silhouette Coefficient)

轮廓系数综合考虑了簇内距离和簇间距离,值在[-1, 1]之间。轮廓系数接近1时表示聚类效果好,接近-1时表示聚类效果差。

from sklearn.metrics import silhouette_score def silhouette_method(data, k): kmeans = KMeans(n_clusters=k, random_state=0).fit(data) score = silhouette_score(data, kmeans.labels_) return score # 选择合适的 K 值 k_values = range(2, 11) scores = [silhouette_method(data, k) for k in k_values] plt.plot(k_values, scores, marker='o') plt.xlabel('Number of clusters') plt.ylabel('Silhouette Score') plt.show() 6. 🛠️ K-means 聚类算法的优化 ⚡ K-means++ 初始化

K-means++ 是一种改进的初始化方法,能显著提高K-means算法的收敛速度和效果。它通过一个概率分布,在数据点中选择 K 个质心,并最大化质心之间的距离。

from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=3, init='k-means++', random_state=0) kmeans.fit(data) 🌐 并行化处理

对于大规模数据集,可以使用并行 K-means 来加速计算。MiniBatchKMeans 是一种适用于大规模数据集的变体,使用小批量数据进行更新和聚类。

from sklearn.cluster import MiniBatchKMeans mbk = MiniBatchKMeans(n_clusters=3, random_state=0, batch_size=100) mbk.fit(data) 🗂️ 内存优化

在处理大规模数据集时,可以通过分批加载数据进行聚类,以减少内存开销。可以借助工具如 Dask 来处理大规模数据。

import dask.dataframe as dd from dask_ml.cluster import KMeans # 假设 large_data 是一个非常大的数据集 dask_df = dd.from_pandas(large_data, npartitions=4) kmeans = KMeans(n_clusters=3, random_state=0) kmeans.fit(dask_df) 7. 💻 K-means 聚类算法的实现 💡 使用 Python 实现 K-means 聚类 自定义 K-means 算法 import numpy as np def kmeans(data, k, max_iterations=100): np.random.seed(0) centroids = data[np.random.choice(data.shape[0], k, replace=False)] for _ in range(max_iterations): distances = np.linalg.norm(data[:, np.newaxis] - centroids, axis=2) labels = np.argmin(distances, axis=1) new_centroids = np.array([data[labels == i].mean(axis=0) for i in range(k)]) if np.all(centroids == new_centroids): break centroids = new_centroids return labels, centroids # 示例数据 data = np.random.rand(100, 2) labels, centroids = kmeans(data, k=3) 🧑‍💻 使用 scikit-learn 实现 K-means 聚类 import numpy as np from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 示例数据 data = np.random.rand(100, 2) # 进行 K-means 聚类 kmeans = KMeans(n_clusters=3, init='k-means++', random_state=0) labels = kmeans.fit_predict(data) # 可视化聚类结果 plt.scatter(data[:, 0], data[:, 1], c=labels, cmap='viridis', marker='o') plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red', marker='x') plt.title('K-means Clustering') plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KywDjfpw-1720611934025)(https://i-blog.csdnimg.cn/direct/f0a3c4ceba4d4b7a90910265dacebf5a.png)]

8. 🔚 总结

K-means 聚类算法是机器学习中的基本算法之一,具有简单、高效和易于实现的特点。其数学基础主要包括距离度量、聚类中心更新以及目标函数优化。通过选择合适的 K 值、优化初始化方法、并行化处理和内存优化,可以显著提高 K-means 算法的性能和效果。本文详细介绍了 K-means 聚类算法的原理、应用、优化方法,并通过具体的示例代码帮助初学者理解和实现这一算法。希望本文能帮助你掌握 K-means 聚类算法,并应用到实际的数据分析和机器学习任务中。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3