K-MEANS

一、K-均值聚类(K-means)

k-means算法是一种简单的迭代型聚类算法,采用距离作为相似性指标,从而发现给定数据集中的K个类,且每个类的中心是根据类中所有值的均值得到,每个类用聚类中心来描述。对于给定的一个包含n个d维数据点的数据集X以及要分得的类别K,选取欧式距离作为相似度指标,聚类目标是使得各类的聚类平方和最小,即最小化:

                                                      

结合最小二乘法和拉格朗日原理,聚类中心为对应类别中各数据点的平均值,同时为了使得算法收敛,在迭代过程中,应使最终的聚类中心尽可能的不变。

 

二、算法步骤

K-means是一个反复迭代的过程,算法分为四个步骤:

1) 选取数据空间中的K个对象作为初始中心,每个对象代表一个聚类中心;

2) 对于样本中的数据对象,根据它们与这些聚类中心的欧氏距离,按距离最近的准则将它们分到距离它们最近的聚类中心(最相似)所对应的类;

3) 更新聚类中心:将每个类别中所有对象所对应的均值作为该类别的聚类中心,计算目标函数的值;

4) 判断聚类中心和目标函数的值是否发生改变,若不变,则输出结果,若改变,则返回2)。

 

三、实例

# -*- coding: UTF-8 -*-
import numpy
import random
import matplotlib.pyplot as plt
 
def calculateDistance(vecA, vecB):   
 
    return numpy.sqrt(numpy.sum(numpy.square(vecA - vecB)))

def findCentroids(data_get, k):
return random.sample(data_get, k) def minDistance(data_get, centroidList): clusterDict = dict() for element in data_get: vecA = numpy.array(element) flag = 0 minDis = float("inf") for i in range(len(centroidList)): vecB = numpy.array(centroidList[i]) distance = calculateDistance(vecA, vecB) if distance < minDis: minDis = distance flag = i if flag not in clusterDict.keys(): clusterDict[flag] = list() clusterDict[flag].append(element) return clusterDict def calculate_Var(clusterDict, centroidList): sum = 0.0 for key in clusterDict.keys(): vecA = numpy.array(centroidList[key]) distance = 0.0 for item in clusterDict[key]: vecB = numpy.array(item) distance += calculateDistance(vecA, vecB) sum += distance return sum
def getCentroids(clusterDict):
 
    centroidList = list()
    for key in clusterDict.keys():
        centroid = numpy.mean(numpy.array(clusterDict[key]), axis=0)
        centroidList.append(centroid)
 
    return numpy.array(centroidList).tolist()

def showCluster(centroidList, clusterDict): colorMark
= ['or', 'ob', 'og', 'ok', 'oy', 'ow'] centroidMark = ['dr', 'db', 'dg', 'dk', 'dy', 'dw'] for key in clusterDict.keys(): plt.plot(centroidList[key][0], centroidList[key][1], centroidMark[key], markersize=12) for item in clusterDict[key]: plt.plot(item[0], item[1], colorMark[key]) plt.show() data = [[0.0, 0.0], [3.0, 8.0], [2.0, 2.0], [1.0, 1.0], [5.0, 3.0], [4.0, 8.0], [6.0, 3.0], [5.0, 4.0], [6.0, 4.0], [7.0, 5.0]] if __name__ == '__main__': centroidList = findCentroids(data, 3) clusterDict = minDistance(data, centroidList) newVar = calculate_Var(clusterDict, centroidList) oldVar = -0.0001 print('***** 第1次迭代 *****') for key in clusterDict.keys(): print('聚类中心: ', centroidList[key]) print('对应聚类: ',clusterDict[key]) print('平均均方误差: ', newVar) showCluster(centroidList, clusterDict) k = 2 while abs(newVar - oldVar) >= 0.0001: centroidList = getCentroids(clusterDict) clusterDict = minDistance(data, centroidList) oldVar = newVar newVar = calculate_Var(clusterDict, centroidList) print('***** 第%d次迭代 *****' % k) for key in clusterDict.keys(): print('聚类中心: ', centroidList[key]) print('对应聚类: ', clusterDict[key]) print('平均均方误差: ', newVar) showCluster(centroidList, clusterDict) k += 1

结果:

 

 

转载于:https://www.cnblogs.com/UniqueColor/p/10996269.html

<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、付费专栏及课程。

余额充值