广州网站建设优化广东省建设网站
2026/4/4 4:33:26 网站建设 项目流程
广州网站建设优化,广东省建设网站,wordpress 小米商城,最超值的锦州网站建设引言#xff1a;在机器学习领域#xff0c;聚类算法作为无监督学习的核心技术之一#xff0c;广泛应用于用户分群、图像分割、文本聚类、异常检测等场景。其中Kmeans算法以其简单高效、易于实现的特点#xff0c;成为最受欢迎的聚类算法之一。本文将从基础概念出发#xf…引言在机器学习领域聚类算法作为无监督学习的核心技术之一广泛应用于用户分群、图像分割、文本聚类、异常检测等场景。其中Kmeans算法以其简单高效、易于实现的特点成为最受欢迎的聚类算法之一。本文将从基础概念出发逐步深入剖析Kmeans的核心原理、算法步骤、数学推导再通过Python代码实现手动实现sklearn库调用帮助大家理解最后探讨其参数调优、优缺点及实际应用场景适合机器学习入门者及需要深入掌握Kmeans的开发者阅读。一、Kmeans核心概念与核心思想1.1 什么是聚类聚类是无监督学习的一种其核心目标是将数据集中的样本按照“相似度”划分为不同的簇Cluster使得同一簇内的样本相似度尽可能高簇内紧凑不同簇间的样本相似度尽可能低簇间分离。与监督学习不同聚类不需要预先标注的标签数据完全依靠数据自身的分布特征完成分类。1.2 Kmeans的定义Kmeans算法全称为K-均值聚类K-means Clustering是一种基于划分的聚类算法。其中“K”代表聚类的簇数需要预先指定“均值”代表每个簇的中心是该簇内所有样本的均值向量聚类中心。算法通过迭代优化的方式将数据划分为K个互不重叠的簇最终得到稳定的聚类结果。1.3 核心思想Kmeans的核心思想可以概括为“划分-更新-收敛”三步循环划分根据当前的K个聚类中心计算每个样本到各个中心的距离将样本分配到距离最近的簇中更新针对每个簇重新计算该簇内所有样本的均值向量将其作为新的聚类中心收敛重复“划分-更新”步骤直到聚类中心不再发生明显变化或变化小于预设阈值或达到最大迭代次数算法停止。二、Kmeans算法原理与详细步骤2.1 距离度量Kmeans算法的核心是通过“距离”判断样本与聚类中心的相似度最常用的距离度量方式是欧氏距离Euclidean Distance适用于连续型数据。对于两个d维向量欧氏距离公式为除了欧氏距离还可根据数据类型选择其他距离如曼哈顿距离、余弦相似度等但欧氏距离是Kmeans的默认选择。2.2 目标函数Kmeans的目标是最小化簇内样本的离散程度常用的目标函数为簇内平方和Within-Cluster Sum of Square, WCSS也称为惯性Inertia。其公式定义为其中K为预设的簇数表示第i个簇表示第i个簇的聚类中心均值向量表示样本x到聚类中心的欧氏距离。Kmeans算法的迭代过程本质上就是不断最小化目标函数J的过程。2.3 完整算法步骤结合目标函数和核心思想Kmeans的完整算法步骤如下数据预处理对数据进行标准化如Z-score标准化消除量纲影响这是Kmeans的关键预处理步骤否则数值范围大的特征会主导距离计算预设参数确定簇数K、最大迭代次数max_iter、收敛阈值tol聚类中心变化小于tol则停止初始化聚类中心从数据集中随机选择K个样本作为初始聚类中心传统Kmeans方式存在局限性后续会讲改进方案簇分配划分计算每个样本到K个聚类中心的欧氏距离将样本分配到距离最近的簇更新聚类中心对每个簇计算簇内所有样本的均值向量作为新的聚类中心判断收敛计算新聚类中心与旧中心的距离若所有中心的距离都小于tol或达到最大迭代次数max_iter则停止迭代否则返回步骤4继续循环输出结果得到K个簇及对应的聚类中心目标函数J达到最小值局部最优。2.4 数学推导为什么聚类中心是簇内均值这里通过对目标函数J求导证明“聚类中心为簇内样本均值”是最小化J的最优解。对目标函数J中的第i个簇的聚类中心求偏导是d维向量对其每个维度分别求导对单个维度k求导链式法则令偏导数为0极值条件解得其中是第i个簇的样本数量。这表明当聚类中心的每个维度都是簇内样本对应维度的均值时目标函数J取得极小值。因此“更新聚类中心为簇内均值”是Kmeans的最优更新策略。三、Kmeans的初始化问题与改进K-means3.1 传统Kmeans的局限性传统Kmeans通过“随机选择K个样本作为初始中心”存在两个严重问题对初始中心敏感不同的初始中心可能导致最终聚类结果差异很大甚至得到局部最优解而非全局最优聚类效果不稳定多次运行算法可能得到不同的结果需要多次运行取最优。3.2 K-means的核心思想与步骤K-means是对传统Kmeans初始化步骤的改进核心思想是让初始聚类中心尽可能远离彼此从而提升聚类效果的稳定性和最优性。其初始化步骤如下从数据集中随机选择1个样本作为第一个初始聚类中心对于每个样本x计算x到已选初始中心的最短距离即距离最近的初始中心的距离根据的概率分布随机选择下一个初始中心越大的样本被选中的概率越高重复步骤2-3直到选够K个初始聚类中心后续的簇分配、中心更新步骤与传统Kmeans一致。注K-means仅改进了初始化步骤后续迭代过程与传统Kmeans完全相同。目前主流的Kmeans实现如sklearn的KMeans类默认使用K-means初始化。四、Python实现Kmeans手动实现sklearn库实现下面通过代码实践帮助大家理解Kmeans的实现逻辑使用鸢尾花数据集简化为2维方便可视化。4.1 环境准备需要安装的库numpy、pandas、matplotlib、scikit-learnpip install numpy pandas matplotlib scikit-learn4.2 手动实现Kmeans含K-means初始化import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler # 1. 数据加载与预处理 iris load_iris() X iris.data[:, :2] # 取前2个特征方便可视化 y iris.target # 标准化关键步骤 scaler StandardScaler() X_scaled scaler.fit_transform(X) # 2. 实现K-means初始化 def kmeans_plus_plus_init(X, k): n_samples, n_features X.shape centers [] # 第一步随机选择第一个中心 centers.append(X[np.random.choice(n_samples)]) # 第二步迭代选择剩余k-1个中心 for _ in range(1, k): # 计算每个样本到最近已选中心的距离 distances [] for x in X: min_dist min([np.linalg.norm(x - center) for center in centers]) distances.append(min_dist ** 2) # 按距离平方概率选择 # 按距离平方的概率分布选择下一个中心 distances np.array(distances) prob distances / np.sum(distances) next_center_idx np.random.choice(n_samples, pprob) centers.append(X[next_center_idx]) return np.array(centers) # 3. 手动实现Kmeans def my_kmeans(X, k, max_iter100, tol1e-4): n_samples, n_features X.shape # 初始化聚类中心K-means centers kmeans_plus_plus_init(X, k) for _ in range(max_iter): # 4. 簇分配计算每个样本到中心的距离分配到最近的簇 clusters [[] for _ in range(k)] for x in X: distances [np.linalg.norm(x - center) for center in centers] cluster_idx np.argmin(distances) clusters[cluster_idx].append(x) # 5. 保存旧中心更新新中心 old_centers centers.copy() for i in range(k): if clusters[i]: # 避免簇为空极端情况 centers[i] np.mean(clusters[i], axis0) # 6. 判断收敛所有中心的变化小于tol center_changes [np.linalg.norm(centers[i] - old_centers[i]) for i in range(k)] if max(center_changes) tol: break # 生成最终的聚类标签 labels np.zeros(n_samples) for i in range(k): for x in clusters[i]: idx np.where(np.all(X x, axis1))[0][0] labels[idx] i return labels, centers # 4. 运行手动实现的Kmeans k 3 # 鸢尾花数据集实际有3类 labels, centers my_kmeans(X_scaled, k) # 5. 可视化结果 plt.figure(figsize(8, 6)) plt.scatter(X_scaled[:, 0], X_scaled[:, 1], clabels, cmapviridis, edgecolorsblack) plt.scatter(centers[:, 0], centers[:, 1], cred, marker*, s200, labelCluster Centers) plt.xlabel(Sepal Length (Standardized)) plt.ylabel(Sepal Width (Standardized)) plt.title(Kmeans Clustering Result (Manual Implementation)) plt.legend() plt.show()4.3 sklearn库实现Kmeans简洁高效sklearn的KMeans类默认使用K-means初始化支持并行计算实际项目中推荐使用。from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score # 1. 数据预处理同上已完成标准化 # 2. 初始化并训练Kmeans模型 kmeans KMeans( n_clusters3, # 簇数K initk-means, # 初始化方式默认就是k-means max_iter100, # 最大迭代次数 tol1e-4, # 收敛阈值 random_state42 # 随机种子保证结果可重复 ) labels_sklearn kmeans.fit_predict(X_scaled) # 3. 获取聚类中心 centers_sklearn kmeans.cluster_centers_ # 4. 评估聚类效果轮廓系数取值[-1,1]越接近1越好 sil_score silhouette_score(X_scaled, labels_sklearn) print(fSilhouette Score: {sil_score:.4f}) # 5. 可视化结果 plt.figure(figsize(8, 6)) plt.scatter(X_scaled[:, 0], X_scaled[:, 1], clabels_sklearn, cmapviridis, edgecolorsblack) plt.scatter(centers_sklearn[:, 0], centers_sklearn[:, 1], cred, marker*, s200, labelCluster Centers) plt.xlabel(Sepal Length (Standardized)) plt.ylabel(Sepal Width (Standardized)) plt.title(Kmeans Clustering Result (sklearn Implementation)) plt.legend() plt.show()运行结果说明轮廓系数Silhouette Score约为0.55说明聚类效果较好大于0.5属于可接受范围。可视化图中红色星号为聚类中心不同颜色的点为不同簇的样本。五、Kmeans参数调优如何选择最优K值Kmeans的核心参数是簇数K但K是预设的无法从数据中直接得到。选择合适的K值是Kmeans调优的关键常用的方法有两种肘部法则Elbow Method和轮廓系数法Silhouette Analysis。5.1 肘部法则核心思想随着K值增加簇内平方和WCSS/Inertia会不断减小因为簇数越多每个簇的样本越集中当K增加到某个值后WCSS的下降速度会明显变慢这个“拐点”对应的K值就是最优K值类似肘部的形状。# 肘部法则选择最优K wcss [] k_range range(1, 10) # 测试K从1到9 for k in k_range: kmeans KMeans(n_clustersk, initk-means, random_state42) kmeans.fit(X_scaled) wcss.append(kmeans.inertia_) # inertia_就是WCSS # 可视化肘部图 plt.figure(figsize(8, 6)) plt.plot(k_range, wcss, bo-) plt.xlabel(Number of Clusters (K)) plt.ylabel(Within-Cluster Sum of Square (WCSS)) plt.title(Elbow Method for Optimal K) plt.grid(True) plt.show()结果解读当K3时WCSS的下降速度明显变缓因此最优K值为3与鸢尾花数据集的实际类别数一致。5.2 轮廓系数法核心思想轮廓系数综合考虑了“簇内紧凑度”和“簇间分离度”对于每个样本计算其轮廓系数其中样本i到其所在簇内其他样本的平均距离簇内紧凑度越小越好样本i到其他簇内样本的平均距离的最小值簇间分离度越大越好。所有样本的轮廓系数的平均值即为整个数据集的轮廓系数取值范围[-1,1]聚类效果优秀0.5 s ≤ 0.7聚类效果良好0.25 s ≤ 0.5聚类效果一般s ≤ 0.25聚类效果较差。# 轮廓系数法选择最优K sil_scores [] k_range range(2, 10) # K1时无法计算轮廓系数 for k in k_range: kmeans KMeans(n_clustersk, initk-means, random_state42) labels kmeans.fit_predict(X_scaled) sil_score silhouette_score(X_scaled, labels) sil_scores.append(sil_score) # 可视化轮廓系数 plt.figure(figsize(8, 6)) plt.plot(k_range, sil_scores, ro-) plt.xlabel(Number of Clusters (K)) plt.ylabel(Silhouette Score) plt.title(Silhouette Analysis for Optimal K) plt.grid(True) plt.show()结果解读当K3时轮廓系数达到最大值约0.55因此最优K值为3与肘部法则的结果一致。六、Kmeans的优缺点6.1 优点简单易懂实现难度低无论是手动实现还是调用库计算效率高时间复杂度为n为样本数d为特征数I为迭代次数适合处理大规模数据集聚类结果直观易于解释对连续型数据适应性好应用范围广。6.2 缺点需要预先指定K值最优K值的选择依赖经验和调优方法肘部法则、轮廓系数法对初始聚类中心敏感传统Kmeans即使是K-means也无法保证得到全局最优解对异常值和噪声数据敏感异常值会严重影响聚类中心的计算仅适用于球形簇簇内样本呈圆形/椭圆形分布无法处理非凸簇、不规则形状的簇对数据量纲敏感必须进行标准化预处理无法处理类别不平衡的数据少数类簇可能被合并。七、Kmeans的应用场景尽管存在局限性但Kmeans凭借其高效性在多个领域得到广泛应用用户分群电商平台根据用户的购买历史、浏览行为、消费金额等数据将用户划分为不同群体如高价值用户、潜力用户、流失风险用户用于精准营销、个性化推荐图像分割将图像像素按照颜色、灰度值等特征聚类实现目标区域提取如人脸识别中的人脸区域分割、医学图像中的病灶分割文本聚类对新闻、评论、文档等文本数据通过TF-IDF等方法将文本转化为向量后用Kmeans聚类实现主题分类如新闻分类为政治、娱乐、体育等异常检测通过Kmeans聚类后距离所有聚类中心都很远的样本可判定为异常值如信用卡欺诈交易检测、服务器异常访问检测数据降维将聚类后的簇中心作为新的特征实现数据降维如高维数据聚类后用簇标签替代原始特征。八、总结与展望本文详细讲解了Kmeans聚类算法的核心概念、原理、算法步骤、数学推导通过Python手动实现和sklearn库实现验证了算法效果介绍了K-means改进方案和最优K值的选择方法最后分析了其优缺点和应用场景。Kmeans是聚类算法的入门经典但存在诸多局限性。针对这些局限性后续可学习其改进算法Mini Batch Kmeans适用于超大规模数据集通过随机抽取批量样本迭代更新中心提升计算效率DBSCAN基于密度的聚类算法无需预设K值可处理非凸簇和异常值层次聚类通过树状结构展示聚类过程无需预设K值适合小样本数据GMM高斯混合模型基于概率的聚类算法可处理非球形簇支持样本属于多个簇的概率输出。希望本文能帮助大家深入理解Kmeans算法在实际项目中灵活运用并根据数据特点选择合适的聚类算法。如果有疑问或补充欢迎在评论区交流

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询