K-means

什么是K-Means?

K-Means是一种无监督分类学习算法。无监督分类是指人们事先对分类过程不施加任何的先验知识,而仅凭数据,即自然聚类的特性,进行“盲目”的分类;其分类的结果只是对不同类别达到了区分,但并不能确定类别的属性

 

基本原理

K-Means 算法是以距离作为相似度的评价指标,用样本点到类别中心的误差平方和作为聚类好坏的评价指标,通过迭代的方法使总体分类的误差评分和函数达到最小的聚类方法。

K-Means的目标函数很简单:

现在的问题是:找到这k个类别中心的具体值U = {u1,u2,u3,.....,uk},使上面表达式的值达到最小。

但是有个问题是怎么确定聚类的中心,解决方法是迭代

确定聚类中心

先随意给定初始的类别中心,然后做聚类,通过迭代,不断调整这些类别中心,直到得到最好的聚类中心为止。

 

以下图为例,

从这个思路上来讲,其实我们可以直接根据目标函数找最小。我们发现,K-Means的迭代,其实用的是EM(期望最大化)的思想。这里先不做介绍

 

K-Means的缺陷

K-Means的原理很好理解,但是我们深究一下就会发现,这个随机取类别中心点,问题很大。

如果初始类别中心不好,可能会使算法陷入局部最小值,得到一个次优的分类结果,而得不到全局最优解。另外,初始类别中心不好的话,会导致迭代次数的增加,从而增加分类所用的时间。

 

参考

K-Means分类法介绍:https://blog.youkuaiyun.com/liangdas/article/details/25470895

03-08
<think>嗯,用户想了解k-means聚类算法的介绍及实现方法。首先,我需要回顾一下k-means的基本概念。记得它是一种无监督学习算法,用于将数据分成k个簇。步骤的话,应该是初始化质心,分配数据点到最近的质心,重新计算质心,然后重复直到收敛。对了,初始质心的选择可能影响结果,所以有k-means++这样的改进方法。 然后,用户可能还关心实现方法。得准备用Python或者Matlab的例子。不过用户提供的引用里有Python和Matlab的代码示例,可能需要参考一下。比如引用3和4提到了Python实现,而引用1是Matlab的。需要确定用户偏向哪种语言,但问题里没有明确说明,所以最好都给出或者选一种常见的,比如Python。 接下来,考虑用户可能的需求。他们可能需要步骤的详细解释,避免太技术化的术语,但又要准确。比如,初始质心的选择,迭代过程,收敛条件等。还要提到优缺点,比如对初始值敏感,适合凸数据集,可能不适用于非球形簇。 另外,引用里提到了优化方法,比如k-means++、Mini-batch、二分k-means,这些也应该包括在回答里,作为改进方向。用户的问题还可能涉及到应用场景,比如客户分群,市场营销,所以举例子的时候可以提到这些。 需要检查LaTeX格式是否正确,确保数学表达式用$...$,比如欧氏距离公式$d(x, y) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2}$。独立公式用$$...$$,比如目标函数SSE。还要注意引用标识的位置,例如在提到k-means++时引用[^2]。 可能的问题点:是否覆盖了所有关键点,步骤是否清晰,代码示例是否正确,引用是否正确关联。比如,引用4提到二分k-means,应该在优化部分提到。还要注意避免错误,比如k-means的停止条件通常是质心不再变化或迭代次数,需要准确描述。 最后,生成相关问题要考虑用户可能的后续疑问,比如如何选择k值,算法的时间复杂度,与其他聚类算法的比较等。确保问题相关且有引导性。</think>### K-means聚类算法介绍及实现方法 K-means聚类算法是一种经典的无监督学习方法,通过迭代将数据集划分为$k$个簇,使得同一簇内的样本相似度高,不同簇间差异显著[^3]。 #### 一、算法原理 1. **初始化**:随机选择$k$个初始质心(每个簇的中心点)。 2. **分配样本**:计算每个样本到所有质心的距离(如欧氏距离$d(x, y) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2}$),将其分配到最近的质心对应簇。 3. **更新质心**:重新计算每个簇的质心(即簇内样本均值)。 4. **迭代**:重复步骤2-3,直到质心变化小于阈值或达到最大迭代次数。 目标是最小化**簇内平方误差和(SSE)**: $$SSE = \sum_{i=1}^k \sum_{x \in C_i} \|x - \mu_i\|^2$$ 其中$\mu_i$是第$i$个簇的质心,$C_i$为第$i$个簇的样本集合[^4]。 #### 二、Python实现示例 ```python import numpy as np from sklearn.cluster import KMeans # 生成示例数据 X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]]) # 使用K-means算法(k=2) kmeans = KMeans(n_clusters=2, init='k-means++', max_iter=300) kmeans.fit(X) print("质心坐标:", kmeans.cluster_centers_) print("样本所属簇:", kmeans.labels_) ``` #### 三、优化方法 - **K-means++**:优化初始质心选择,降低陷入局部最优的风险[^2]。 - **二分K-means**:通过逐步分裂簇提升稳定性。 - **Mini-batch K-means**:适用于大规模数据,每次迭代仅用部分样本加速计算。 #### 四、应用场景 1. 客户分群(如市场营销策略制定) 2. 图像压缩(颜色量化) 3. 异常检测(稀疏簇可能包含异常点) #### 五、优缺点 - **优点**:简单高效,时间复杂度为$O(n \cdot k \cdot t)$($n$样本数,$k$簇数,$t$迭代次数)。 - **缺点**:需预设$k$值;对初始质心敏感;仅适用于凸形簇。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值