Python 数据分析入门为什么 K-Means 一定要先设 K一文看懂 K-Means 聚类原理上一篇我们已经知道聚类属于无监督学习核心目标是把相似的数据尽量放到同一组把差异较大的数据尽量分开。如果说上一篇解决的是“什么是聚类”那么这一篇要解决的问题就是K-Means 到底在做什么这是很多人接触聚类时学到的第一个算法也是最经典、最常用的聚类方法之一。它不算最复杂但非常适合入门因为它的思路直观、过程清晰而且 sklearn 里直接就能使用。这篇文章就围绕下面几个问题展开K-Means 为什么叫“K均值”它是怎么一步步把数据分成几类的它为什么一定要先给出 K它有哪些优点和局限Python 里怎么快速实现一、K-Means 是什么先用一句话概括K-Means 的任务是把数据划分成 K 个簇并且让每个簇内部的样本尽量接近。这里的K表示你希望把数据分成多少类。比如你想把一批用户分成 3 类就可以设定K3。K-Means 属于典型的划分式聚类方法。它会把数据直接分成若干个组并满足两个特点每个样本只能属于一个簇每个簇都至少有一个样本这说明 K-Means 做的是一种硬划分一个样本只能归到一个簇不会同时属于多个簇而且在 K-Means 中每个簇都会有一个“中心”这个中心是通过该簇内所有样本的均值计算出来的。这也是它名字里 “Means” 的来源。二、为什么它叫 K-Means这个名字其实很好理解K表示要分成几个簇Means表示每个簇用簇内样本的均值来表示中心所以 K-Means 不是随便找几个代表点而是通过样本的平均位置来定义每一类的中心。你可以把它想象成每个簇里有很多样本点算法会为这堆点找一个“中心位置”然后让离这个中心更近的点归到这一类所以 K-Means 的核心不只是“分组”而是一边分组一边不断调整每一组的中心位置。三、K-Means 到底是怎么工作的K-Means 是一个迭代优化算法。它会不断重复“分配样本”和“更新中心”这两个动作直到结果稳定下来。整个流程可以理解成下面几步。第一步先选出 K 个初始中心算法开始时需要先有 K 个中心点。最基础的做法是随机从数据中选 K 个点作为初始聚类中心。比如你设K3那算法一开始就会先找出 3 个初始中心。第二步给每个样本分配类别接下来算法会计算每个样本离哪个中心最近然后把它分到对应的簇中。你可以把这个过程理解成每个样本都去“认领”离自己最近的那个中心。第三步更新每个簇的中心当所有样本都被分配之后每个簇里就有了一批成员。这时算法会重新计算每个簇中所有样本的均值并把这个均值作为新的簇中心。这一步很关键因为新的中心通常会比最开始随机选的中心更合理。第四步继续循环有了新的中心后算法会再次执行按最近中心重新分配样本再重新计算新的均值中心这个过程会反复进行直到聚类中心几乎不再变化或者样本归属基本稳定或者达到最大迭代次数所以 K-Means 的本质其实很简单先分组再调中心再分组再调中心一直重复到稳定。四、K-Means 优化的到底是什么从目标上看K-Means 希望让每个样本尽量靠近自己所属簇的中心。如果不从公式角度理解可以把它看成同一簇里的点尽量“抱团”每一簇的中心尽量能代表这一簇样本到本簇中心的距离尽量更小所以 K-Means 想达到的效果就是让分组后的每一类尽量更紧凑。这也是为什么它在“团状分布”的数据上通常表现会比较自然。五、为什么 K-Means 一定要先给 K这是初学者最容易问的问题。原因其实很直接K-Means 不是先发现有几类再决定怎么分而是你先告诉它要分几类它再去完成这个任务。也就是说K是这个算法的输入条件之一。你不告诉它分成几类它就没法开始。这也是 K-Means 最明显的局限之一。如果K设得不合理就可能出现问题K太小本来应该分开的几类被硬合到一起K太大本来一类的数据被拆得过细所以在实际项目里K-Means 虽然好上手但K的选择本身就是一个需要认真考虑的问题。六、用一个直观例子理解 K-Means假设你有一批学生的数据特征是平时作业完成率测验成绩如果把这些学生画在二维平面上你可能会发现一些学生作业完成率高成绩也高一些学生作业完成率一般成绩中等一些学生作业完成率低成绩也偏低如果你想让算法自动把这些学生分成 3 类就可以设K3。然后 K-Means 会先随机给出 3 个中心每个学生归到离自己最近的中心根据每组学生重新计算中心重复这个过程直到三组学生的划分基本稳定最终得到的结果就是一种基于相似性的自动分组方式。七、K-Means 的优点是什么K-Means 之所以经典不是因为它没有缺点而是因为它在很多场景下确实很实用。1. 思路直观K-Means 的流程非常容易理解先找中心再分样本再更新中心反复迭代对于初学者来说这种算法特别适合建立“聚类”的第一印象。2. 计算效率较高K-Means 的实现通常比较高效在中等规模数据上也往往能较快得到结果。这也是它在实际任务里经常作为第一版方案的原因之一。3. 实用性强在很多数据探索、用户分群、样本初步划分的任务里K-Means 都是一个很常见的起点方案。八、K-Means 的缺点是什么K-Means 很经典但也有一些很明显的局限。1. 容易受到初始中心影响如果初始中心选得不好后面迭代可能会停在一个“还行但不是最好”的结果上。这也是为什么同一份数据不同初始化方式最后得到的聚类结果可能不完全一样。2. 必须先给出 K这是它最常见的限制之一。如果你事先并不知道该分几类就需要借助业务理解、可视化或评估指标来辅助判断。3. 对噪声和离群点比较敏感因为 K-Means 是基于均值来计算簇中心的而均值本身容易受到极端值影响。如果数据里有一些特别偏的点聚类中心可能会被拉偏。4. 不适合复杂形状的簇K-Means 更适合处理比较规则、比较紧凑的数据簇。如果数据天然分布成弯曲、环状或者其他不规则形状K-Means 往往不太擅长处理。5. 更适合数值型特征因为 K-Means 要计算均值所以它更适合处理数值型数据。如果数据主要是纯类别型特征均值本身就没有明确意义这时 K-Means 通常不是最理想的选择。九、K-Means 有哪些常见改进在实际应用中标准 K-Means 也有一些常见改进版本。1. K-Means标准 K-Means 一开始随机选择初始中心不同的初始中心可能导致完全不同的聚类结果。K-Means 的改进思路是让初始聚类中心尽可能分散一些。这样通常能得到更稳定、更合理的初始状态。2. ISODATAISODATA 可以看作是在 K-Means 的基础上增加了“合并”和“分裂”两个操作。简单理解就是如果某个簇样本太少可以删除或合并如果某个簇样本太多而且分散得很厉害可以拆成两个簇这个思路比标准 K-Means 更灵活。3. Mini Batch K-MeansMini Batch K-Means 每次迭代时不使用全部样本而是抽取一个小批量样本来更新聚类中心。它的特点是计算速度更快更适合大规模数据聚类效果通常和普通 K-Means 接近如果数据量很大这种方法会更实用。十、Python 实战用 sklearn 实现 K-Means下面直接用 sklearn 做一个最基础的 K-Means 示例。这里我们使用经典的鸢尾花数据集来演示。fromsklearn.datasetsimportload_irisfromsklearn.clusterimportKMeansimportmatplotlib.pyplotasplt# 1. 加载数据irisload_iris()Xiris.data[:,:2]# 只取前两个特征方便可视化# 2. 建立 K-Means 模型kmeansKMeans(n_clusters3,random_state42)# 3. 训练模型并预测类别labelskmeans.fit_predict(X)# 4. 获取聚类中心centerskmeans.cluster_centers_# 5. 可视化plt.figure(figsize(8,6))plt.scatter(X[:,0],X[:,1],clabels,cmapviridis,s40)plt.scatter(centers[:,0],centers[:,1],cred,markerX,s200)plt.xlabel(Feature 1)plt.ylabel(Feature 2)plt.title(K-Means Clustering on Iris Dataset)plt.show()十一、这段代码在做什么可以按步骤理解。1. 加载数据这里用的是load_iris()。鸢尾花数据集是机器学习里非常经典的入门数据集。2. 选择两个特征为了方便把结果画成二维图我们这里只取前两个特征Xiris.data[:,:2]这样后面就能直接画散点图。3. 建立模型kmeansKMeans(n_clusters3,random_state42)这里的含义是n_clusters3把数据分成 3 类random_state42固定随机种子保证结果可复现4. 训练并预测labelskmeans.fit_predict(X)这一步完成两件事训练 K-Means 模型返回每条样本所属的簇编号5. 获取聚类中心centerskmeans.cluster_centers_这里拿到的是每个簇的中心坐标。6. 画图观察结果代码中不同颜色表示不同簇红色X表示聚类中心这样可以很直观地看到 K-Means 最终把数据分成了哪些区域。十二、如果把 K 改掉会发生什么你可以尝试把代码里的n_clusters3改成n_clusters2或者n_clusters4然后观察结果变化。通常会看到当K太小时一些本来差异明显的样本会被合到一起当K太大时一些本来属于同一组的样本会被进一步拆开这也说明K-Means 的结果高度依赖 K 的设定。所以实际使用时K 不应该完全凭感觉乱设而要结合业务理解、可视化和评估指标一起判断。十三、什么时候适合用 K-MeansK-Means 比较适合这些场景想快速做用户分群想对数据做第一轮探索数据规模较大希望算法运行快一些数据的簇形状相对规则特征是数值型均值有明确意义它常常是一个很好的入门算法和基线模型。十四、什么时候不太适合用 K-Means下面这些情况就要更谨慎一些数据里噪声和离群点很多簇的形状非常复杂不同簇大小差异很大你完全不知道该分几类数据主要是类别型而不是数值型这时候就可能需要考虑层次聚类、DBSCAN 或其他方法。十五、课后思考可以试着回答下面几个问题为什么 K-Means 一定要先给出 KK-Means 中的 “Means” 指的是什么为什么 K-Means 容易受到初始中心的影响K-Means 为什么不太适合处理噪声很多的数据Mini Batch K-Means 和普通 K-Means 的主要区别是什么如果这些问题你都能比较顺畅地回答出来说明你已经抓住了 K-Means 这一算法最核心的思路。十六、本文总结这篇文章主要回答了一个问题K-Means 聚类到底在做什么可以把它概括成下面几点K-Means 是最经典、最常用的聚类方法之一它属于划分式聚类会把数据分成 K 个簇每个样本只能属于一个簇每个簇的中心由簇内样本的均值表示它通过“分配样本—更新中心”的方式不断迭代它的优点是直观、实用、效率较高它的局限包括需要预先给出 K、容易受初始中心影响、对噪声敏感、不适合复杂形状的簇如果用一句话总结 K-Means 的本质那就是先给定 K再不断调整簇中心让同一类中的样本尽量更接近。
30 Python 聚类:为什么 K-Means 一定要先设 K?一文看懂 K-Means 聚类原理
Python 数据分析入门为什么 K-Means 一定要先设 K一文看懂 K-Means 聚类原理上一篇我们已经知道聚类属于无监督学习核心目标是把相似的数据尽量放到同一组把差异较大的数据尽量分开。如果说上一篇解决的是“什么是聚类”那么这一篇要解决的问题就是K-Means 到底在做什么这是很多人接触聚类时学到的第一个算法也是最经典、最常用的聚类方法之一。它不算最复杂但非常适合入门因为它的思路直观、过程清晰而且 sklearn 里直接就能使用。这篇文章就围绕下面几个问题展开K-Means 为什么叫“K均值”它是怎么一步步把数据分成几类的它为什么一定要先给出 K它有哪些优点和局限Python 里怎么快速实现一、K-Means 是什么先用一句话概括K-Means 的任务是把数据划分成 K 个簇并且让每个簇内部的样本尽量接近。这里的K表示你希望把数据分成多少类。比如你想把一批用户分成 3 类就可以设定K3。K-Means 属于典型的划分式聚类方法。它会把数据直接分成若干个组并满足两个特点每个样本只能属于一个簇每个簇都至少有一个样本这说明 K-Means 做的是一种硬划分一个样本只能归到一个簇不会同时属于多个簇而且在 K-Means 中每个簇都会有一个“中心”这个中心是通过该簇内所有样本的均值计算出来的。这也是它名字里 “Means” 的来源。二、为什么它叫 K-Means这个名字其实很好理解K表示要分成几个簇Means表示每个簇用簇内样本的均值来表示中心所以 K-Means 不是随便找几个代表点而是通过样本的平均位置来定义每一类的中心。你可以把它想象成每个簇里有很多样本点算法会为这堆点找一个“中心位置”然后让离这个中心更近的点归到这一类所以 K-Means 的核心不只是“分组”而是一边分组一边不断调整每一组的中心位置。三、K-Means 到底是怎么工作的K-Means 是一个迭代优化算法。它会不断重复“分配样本”和“更新中心”这两个动作直到结果稳定下来。整个流程可以理解成下面几步。第一步先选出 K 个初始中心算法开始时需要先有 K 个中心点。最基础的做法是随机从数据中选 K 个点作为初始聚类中心。比如你设K3那算法一开始就会先找出 3 个初始中心。第二步给每个样本分配类别接下来算法会计算每个样本离哪个中心最近然后把它分到对应的簇中。你可以把这个过程理解成每个样本都去“认领”离自己最近的那个中心。第三步更新每个簇的中心当所有样本都被分配之后每个簇里就有了一批成员。这时算法会重新计算每个簇中所有样本的均值并把这个均值作为新的簇中心。这一步很关键因为新的中心通常会比最开始随机选的中心更合理。第四步继续循环有了新的中心后算法会再次执行按最近中心重新分配样本再重新计算新的均值中心这个过程会反复进行直到聚类中心几乎不再变化或者样本归属基本稳定或者达到最大迭代次数所以 K-Means 的本质其实很简单先分组再调中心再分组再调中心一直重复到稳定。四、K-Means 优化的到底是什么从目标上看K-Means 希望让每个样本尽量靠近自己所属簇的中心。如果不从公式角度理解可以把它看成同一簇里的点尽量“抱团”每一簇的中心尽量能代表这一簇样本到本簇中心的距离尽量更小所以 K-Means 想达到的效果就是让分组后的每一类尽量更紧凑。这也是为什么它在“团状分布”的数据上通常表现会比较自然。五、为什么 K-Means 一定要先给 K这是初学者最容易问的问题。原因其实很直接K-Means 不是先发现有几类再决定怎么分而是你先告诉它要分几类它再去完成这个任务。也就是说K是这个算法的输入条件之一。你不告诉它分成几类它就没法开始。这也是 K-Means 最明显的局限之一。如果K设得不合理就可能出现问题K太小本来应该分开的几类被硬合到一起K太大本来一类的数据被拆得过细所以在实际项目里K-Means 虽然好上手但K的选择本身就是一个需要认真考虑的问题。六、用一个直观例子理解 K-Means假设你有一批学生的数据特征是平时作业完成率测验成绩如果把这些学生画在二维平面上你可能会发现一些学生作业完成率高成绩也高一些学生作业完成率一般成绩中等一些学生作业完成率低成绩也偏低如果你想让算法自动把这些学生分成 3 类就可以设K3。然后 K-Means 会先随机给出 3 个中心每个学生归到离自己最近的中心根据每组学生重新计算中心重复这个过程直到三组学生的划分基本稳定最终得到的结果就是一种基于相似性的自动分组方式。七、K-Means 的优点是什么K-Means 之所以经典不是因为它没有缺点而是因为它在很多场景下确实很实用。1. 思路直观K-Means 的流程非常容易理解先找中心再分样本再更新中心反复迭代对于初学者来说这种算法特别适合建立“聚类”的第一印象。2. 计算效率较高K-Means 的实现通常比较高效在中等规模数据上也往往能较快得到结果。这也是它在实际任务里经常作为第一版方案的原因之一。3. 实用性强在很多数据探索、用户分群、样本初步划分的任务里K-Means 都是一个很常见的起点方案。八、K-Means 的缺点是什么K-Means 很经典但也有一些很明显的局限。1. 容易受到初始中心影响如果初始中心选得不好后面迭代可能会停在一个“还行但不是最好”的结果上。这也是为什么同一份数据不同初始化方式最后得到的聚类结果可能不完全一样。2. 必须先给出 K这是它最常见的限制之一。如果你事先并不知道该分几类就需要借助业务理解、可视化或评估指标来辅助判断。3. 对噪声和离群点比较敏感因为 K-Means 是基于均值来计算簇中心的而均值本身容易受到极端值影响。如果数据里有一些特别偏的点聚类中心可能会被拉偏。4. 不适合复杂形状的簇K-Means 更适合处理比较规则、比较紧凑的数据簇。如果数据天然分布成弯曲、环状或者其他不规则形状K-Means 往往不太擅长处理。5. 更适合数值型特征因为 K-Means 要计算均值所以它更适合处理数值型数据。如果数据主要是纯类别型特征均值本身就没有明确意义这时 K-Means 通常不是最理想的选择。九、K-Means 有哪些常见改进在实际应用中标准 K-Means 也有一些常见改进版本。1. K-Means标准 K-Means 一开始随机选择初始中心不同的初始中心可能导致完全不同的聚类结果。K-Means 的改进思路是让初始聚类中心尽可能分散一些。这样通常能得到更稳定、更合理的初始状态。2. ISODATAISODATA 可以看作是在 K-Means 的基础上增加了“合并”和“分裂”两个操作。简单理解就是如果某个簇样本太少可以删除或合并如果某个簇样本太多而且分散得很厉害可以拆成两个簇这个思路比标准 K-Means 更灵活。3. Mini Batch K-MeansMini Batch K-Means 每次迭代时不使用全部样本而是抽取一个小批量样本来更新聚类中心。它的特点是计算速度更快更适合大规模数据聚类效果通常和普通 K-Means 接近如果数据量很大这种方法会更实用。十、Python 实战用 sklearn 实现 K-Means下面直接用 sklearn 做一个最基础的 K-Means 示例。这里我们使用经典的鸢尾花数据集来演示。fromsklearn.datasetsimportload_irisfromsklearn.clusterimportKMeansimportmatplotlib.pyplotasplt# 1. 加载数据irisload_iris()Xiris.data[:,:2]# 只取前两个特征方便可视化# 2. 建立 K-Means 模型kmeansKMeans(n_clusters3,random_state42)# 3. 训练模型并预测类别labelskmeans.fit_predict(X)# 4. 获取聚类中心centerskmeans.cluster_centers_# 5. 可视化plt.figure(figsize(8,6))plt.scatter(X[:,0],X[:,1],clabels,cmapviridis,s40)plt.scatter(centers[:,0],centers[:,1],cred,markerX,s200)plt.xlabel(Feature 1)plt.ylabel(Feature 2)plt.title(K-Means Clustering on Iris Dataset)plt.show()十一、这段代码在做什么可以按步骤理解。1. 加载数据这里用的是load_iris()。鸢尾花数据集是机器学习里非常经典的入门数据集。2. 选择两个特征为了方便把结果画成二维图我们这里只取前两个特征Xiris.data[:,:2]这样后面就能直接画散点图。3. 建立模型kmeansKMeans(n_clusters3,random_state42)这里的含义是n_clusters3把数据分成 3 类random_state42固定随机种子保证结果可复现4. 训练并预测labelskmeans.fit_predict(X)这一步完成两件事训练 K-Means 模型返回每条样本所属的簇编号5. 获取聚类中心centerskmeans.cluster_centers_这里拿到的是每个簇的中心坐标。6. 画图观察结果代码中不同颜色表示不同簇红色X表示聚类中心这样可以很直观地看到 K-Means 最终把数据分成了哪些区域。十二、如果把 K 改掉会发生什么你可以尝试把代码里的n_clusters3改成n_clusters2或者n_clusters4然后观察结果变化。通常会看到当K太小时一些本来差异明显的样本会被合到一起当K太大时一些本来属于同一组的样本会被进一步拆开这也说明K-Means 的结果高度依赖 K 的设定。所以实际使用时K 不应该完全凭感觉乱设而要结合业务理解、可视化和评估指标一起判断。十三、什么时候适合用 K-MeansK-Means 比较适合这些场景想快速做用户分群想对数据做第一轮探索数据规模较大希望算法运行快一些数据的簇形状相对规则特征是数值型均值有明确意义它常常是一个很好的入门算法和基线模型。十四、什么时候不太适合用 K-Means下面这些情况就要更谨慎一些数据里噪声和离群点很多簇的形状非常复杂不同簇大小差异很大你完全不知道该分几类数据主要是类别型而不是数值型这时候就可能需要考虑层次聚类、DBSCAN 或其他方法。十五、课后思考可以试着回答下面几个问题为什么 K-Means 一定要先给出 KK-Means 中的 “Means” 指的是什么为什么 K-Means 容易受到初始中心的影响K-Means 为什么不太适合处理噪声很多的数据Mini Batch K-Means 和普通 K-Means 的主要区别是什么如果这些问题你都能比较顺畅地回答出来说明你已经抓住了 K-Means 这一算法最核心的思路。十六、本文总结这篇文章主要回答了一个问题K-Means 聚类到底在做什么可以把它概括成下面几点K-Means 是最经典、最常用的聚类方法之一它属于划分式聚类会把数据分成 K 个簇每个样本只能属于一个簇每个簇的中心由簇内样本的均值表示它通过“分配样本—更新中心”的方式不断迭代它的优点是直观、实用、效率较高它的局限包括需要预先给出 K、容易受初始中心影响、对噪声敏感、不适合复杂形状的簇如果用一句话总结 K-Means 的本质那就是先给定 K再不断调整簇中心让同一类中的样本尽量更接近。