搜档网
当前位置:搜档网 › k-means聚类算法原理

k-means聚类算法原理

k-means聚类算法原理

k-means聚类算法原理:K-Means聚类算法是聚类算法之一,其中K表示类别的数量,也就是说,我们想要将数据分成几

个类别,Means表示均值。K值决定了初始质心(通常是随机选择的中心)的数量。K值是几,必须有几个质心。简而言之,K-Means聚类算法是一种通过均值聚类数据点的算法。

kmeans 聚类算法

kmeans 聚类算法 Kmeans聚类算法 Kmeans聚类算法是一种基于距离的无监督机器学习算法,它可以将数据集分为多个类别。Kmeans算法最初由J. MacQueen于1967年提出,而后由S. Lloyd和L. Forgy独立提出。目前,Kmeans算法已经成为了机器学习领域中最常用的聚类算法之一。 Kmeans算法的基本思想是将数据集划分为k个不同的簇,每个簇具有相似的特征。簇的数量k是由用户指定的,算法会根据数据集的特征自动将数据集分成k个簇。Kmeans算法通过迭代的方式来更新每个簇的中心点,以此来不断优化簇的划分。 Kmeans算法的步骤 Kmeans算法的步骤可以概括为以下几个步骤: 1. 随机选择k个点作为中心点; 2. 将每个数据点与离它最近的中心点关联,形成k个簇; 3. 对于每个簇,重新计算中心点; 4. 重复2-3步骤,直到簇不再变化或达到最大迭代次数。 Kmeans算法的优缺点 Kmeans算法的优点包括:

1. 算法简单易实现; 2. 能够处理大规模数据集; 3. 可以处理多维数据。 Kmeans算法的缺点包括: 1. 需要用户指定簇的数量; 2. 对于不规则形状的簇,效果不佳; 3. 对于包含噪声的数据集,效果不佳。 Kmeans算法的应用 Kmeans算法在机器学习和数据挖掘中有着广泛的应用。以下是Kmeans算法的一些应用: 1. 图像分割:将图像分为多个不同的区域; 2. 文本聚类:将文本数据划分为多个主题; 3. 市场分析:将消费者分为不同的群体,以便进行更好的市场分析; 4. 生物学研究:将生物数据分为不同的分类。 总结 Kmeans聚类算法是一种基于距离的无监督机器学习算法,它可以将数据集分为多个类别。Kmeans算法的步骤包括随机选择中心点、形成簇、重新计算中心点等。Kmeans算法的优缺点分别是算法简

k聚类方法

k聚类方法 K-means 聚类方法是机器学习中常用的聚类方法之一,主要应用于数据挖掘、图像分割、模式识别等领域。K-means 聚类是通过将数据集中的数据分为 k 个簇,每个簇内部的数据相似度较高,不同簇之间数据相似度较低,从而实现数据的聚类分析。 一、K-means算法的基本原理 (一)算法思想: K-means 算法首先需要从数据集中随机选取 k 个点作为初始的质心。接着计算每个点到这 k 个质心的距离,将每个点划分到距离最近的质心所在的簇中。然后重新计算每个簇中所有点的均值,将这个均值作为新的质心。不断重复这个过程,直到每个簇中心不再变化为止。最终得到 k 个簇,每个簇中的数据相似性最高,而不同簇之间的数据相似性最低。 (二)算法流程: 1.随机选择 k 个数据作为初始质心; 2.按照与质心距离最近的原则将每个数据划分到一个簇中; 3.重新计算每个簇的质心; 4.重复步骤 2 和步骤 3,直到质心不再改变; 5.得到 k 个簇,每个簇中的数据相似度最高。 (三)算法优缺点: 1.简单易用,计算速度快,可用于大规模数据的聚类分析; 2.仅需要知道簇的数量 k,不需要输入模型的参数; 3.对异常值和噪声敏感,容易受到选取初始质心的影响而陷入局部最优解; 4.当簇的数量 k 很大时,算法的效率会变得非常低,这时可以采用二分 K-means 或谱聚类等算法。 二、K-means算法的实现步骤 1.首先需要导入数据集,将数据集中的数据转换成数组形式,以便于计算距离和均值;

2.根据簇的数量 k 随机初始化质心; 3.计算每个数据点到质心的距离,将每个数据点归入距离最近的质心所在的簇; 4.重新计算每个簇的质心; 5.重复步骤 3 和步骤 4,直到质心不再改变或达到最大迭代次数; 6.得到 k 个簇,将数据进行可视化展示。 三、K-means算法的Python实现 以下是K-means算法的Python实现代码: ``` import numpy as np import matplotlib.pyplot as plt def kMeans(dataSet, k, maxIter): # 获取数据集的总数和特征值的长度 m, n = dataSet.shape # 随机初始化质心 centroids = np.array([]).reshape(n, 0) for i in range(k): # 从数据集中随机选择一个数据,作为初始化的质心 randIndex = int(np.random.uniform(0, m)) # 将这个质心添加到质心矩阵中 centroids = np.c_[centroids, dataSet[randIndex]] # 初始化簇划分矩阵 clusterAssment = np.mat(np.zeros((m, 2))) # 迭代计算 for i in range(maxIter): # 初始化标志变量

k-means聚类算法简介

k-means聚类算法简介 k-means 算法是一种基于划分的聚类算法,它以k 为参数,把n 个数据对象分成k 个簇,使簇内具有较高的相似度,而簇间的相似度较低。 1. 基本思想 k-means 算法是根据给定的n 个数据对象的数据集,构建k 个划分聚类的方法,每个划分聚类即为一个簇。该方法将数据划分为n 个簇,每个簇至少有一个数据对象,每个数据对象必须属于而且只能属于一个簇。同时要满足同一簇中的数据对象相似度高,不同簇中的数据对象相似度较小。聚类相似度是利用各簇中对象的均值来进行计算的。 k-means 算法的处理流程如下。首先,随机地选择k 个数据对象,每个数据对象代表一个簇中心,即选择k 个初始中心;对剩余的每个对象,根据其与各簇中心的相似度(距离),将它赋给与其最相似的簇中心对应的簇;然后重新计算每个簇中所有对象的平均值,作为新的簇中心。 不断重复以上这个过程,直到准则函数收敛,也就是簇中心不发生明显的变化。通常采用均方差作为准则函数,即最小化每个点到最近簇中心的距离的平方和。 新的簇中心计算方法是计算该簇中所有对象的平均值,也就是分别对所有对象的各个维度的值求平均值,从而得到簇的中心点。例如,一个簇包括以下 3 个数据对象{(6,4,8),(8,2,2),(4,6,2)},则这个簇的中心点就是((6+8+4)/3,(4+2+6)/3,(8+2+2)/3)=(6,4,4)。

k-means 算法使用距离来描述两个数据对象之间的相似度。距离函数有明式距离、欧氏距离、马式距离和兰氏距离,最常用的是欧氏距离。 k-means 算法是当准则函数达到最优或者达到最大的迭代次数时即可终止。当采用欧氏距离时,准则函数一般为最小化数据对象到其簇中心的距离的平方和,即 。 其中,k 是簇的个数,是第i 个簇的中心点,dist(,x)为X 到的距离。 2. Spark MLlib 中的k-means 算法 Spark MLlib 中的k-means 算法的实现类KMeans 具有以下参数。 1)MLlib 的k-means 构造函数 使用默认值构造MLlib 的k-means 实例的接口如下。

k-means聚类算法原理及python实现

k-means聚类算法原理及python实现 K-means聚类算法是一种无监督学习方法,被广泛应用于数据挖掘和机器学习领域。它的目的是将一组数据分成K个簇(cluster),使得同一个簇内的数据相似度较高,不同簇的数据相似度较低。K-means算法的基本原理是从初始的K 个质心(centroid)开始,迭代地执行以下两个步骤:(1)将每个数据点分配到离其最近的质心所在的簇中;(2)根据每个簇中数据点的平均值来更新该簇的质心。这两个步骤不断迭代,直到簇不再发生变化或达到预设的迭代次数为止。 在Python中,可以使用scikit-learn库实现K-means聚类算法。下面是一个简单的实现示例: ```python from sklearn.cluster import KMeans import numpy as np # 生成随机数据 X = np.random.rand(100,2) # 定义K-means模型 kmeans = KMeans(n_clusters=3)

# 拟合模型 kmeans.fit(X) # 打印簇的质心坐标 print(kmeans.cluster_centers_) # 打印每个数据点所属的簇 print(https://www.sodocs.net/doc/ca19070878.html,bels_) ``` 在上面的代码中,我们首先生成了100个二维随机数据点。然后,我们定义了一个K-means模型,设置簇的数量为3。接着,我们用数据拟合了该模型,并打印出了簇的质心坐标和每个数据点所属的簇。 需要注意的是,K-means算法的结果受到初始质心的影响。因此,为了得到较好的聚类结果,通常需要多次运行K-means算法,每次使用不同的初始质心,然后选择最优的结果。

k均值聚类的方法原理

k均值聚类的方法原理 k均值聚类是最常见的非层次聚类算法之一,它通过将数据点划分为k个聚类来对数据进行聚类分析,其中k是用户预先指定的聚类数量。在该算法中,数据点被分配给最接近的聚类,以此来形成聚类。 1. 选择k个初始聚类中心点:在一开始,需要选择k个点作为聚类的中心点。通常情况下,这些点被选择为随机的数据点。 2. 分配每个数据点到最近的聚类中心:每个数据点将被分配到最接近的聚类中心。这可以通过计算数据点与每个聚类中心之间的距离来完成。通常,欧氏距离是用于计算两点之间距离的最常用方法。 3. 更新聚类中心:在每个数据点被分配给最近的聚类中心后,需要更新聚类中心,以确保它们仍然代表该聚类中心的所有数据点。为此,需要通过计算每个聚类中心周围所有数据点的平均值来更新该中心点。 4. 重复以上步骤:以上三个步骤需要不断重复,直到聚类中心不再发生变化,或者指定的迭代次数达到预定值。 通过以上步骤,k均值聚类可以将数据点分成k个聚类,每个聚类中心代表该聚类的中心点。该聚类方法的优点在于它易于实现和可扩展性,而且对于大规模数据集具有较高的速度和良好的适应性。 1. 初始聚类中心的选择会影响聚类结果:如果初始聚类中心点选择的不够好,就有可能导致算法不能正确地将数据点分配到它们所属的聚类中。 3. 对于非球形分布的数据集,k均值聚类的效果会受到影响:如果数据点不是均匀分布在球形区域内,就有可能导致聚类结果不准确。 在实际使用k均值聚类算法时,需要根据具体数据集的特征选择最合适的k值和初始聚类中心点,以达到最佳的聚类效果。需要注意算法的局限性,避免使用不适合该算法的数据集。在进一步了解k均值聚类的方法原理之前,需要先了解什么是聚类分析。 聚类分析是一种常见的无监督学习方法,它可以将数据集中的每个数据点划分到不同的类别中,以便研究数据中的内在结构。聚类分析可用于各种各样的应用,如市场细分、图像分割、搜索引擎、信号处理、家庭健康研究等。 1. 选择k个初始聚类中心点 k均值聚类算法需要在一开始选择k个聚类中心点。这些聚类中心点代表聚类中的中心点。

k平均算法

k均值算法 引言 k均值算法(k-means algorithm)是一种常用的聚类算法,用于将一组数据分成k 个独立的类别。它是一种迭代的、无监督的算法,通过最小化数据点到其所属类别中心的距离来确定类别。本文将详细介绍k均值算法的原理、步骤以及应用领域。 原理 k均值算法的原理基于以下两个假设: 1. 每个类别的中心是该类别中所有数据点的平均值。 2. 每个数据点只属于一个类别。 根据这些假设,k均值算法通过迭代计算,将数据点逐步分配到最近的类别中心,然后更新类别中心的位置,直到达到收敛条件。 步骤 k均值算法的步骤如下: 1. 随机选择k个数据点作为初始的类别中心。 2. 将每个数据点分配到离其最近的类别中心。 3. 更新每个类别中心的位置为该类别中所有数据点的平均值。 4. 重复步骤2和3,直到类别中心不再发生变化或达到预定的迭代次数。 算法复杂度 k均值算法的时间复杂度为O(n * k * I * d),其中n是数据点的数量,k是类别的数量,I是迭代次数,d是数据的维度。由于需要进行多次迭代和计算每个数据点与类别中心的距离,算法的时间复杂度较高。因此,在处理大规模数据时,需要考虑算法的效率。 应用领域 k均值算法在各个领域都有广泛的应用,以下是一些常见的应用领域:

数据挖掘 k均值算法可以用于数据挖掘中的聚类分析,帮助发现数据中的隐藏模式和关联规则。通过将数据点分成不同的类别,可以更好地理解数据的结构和特征。 图像分割 在图像处理中,k均值算法可以用于图像分割,将图像中的像素点分成不同的区域。这对于图像分析、目标检测和图像压缩等任务非常有用。 推荐系统 k均值算法可以用于推荐系统中的用户分群,将用户分成不同的群体,从而提供个 性化的推荐。通过将具有相似兴趣和行为模式的用户归为一类,可以更好地理解用户需求并提供准确的推荐结果。 无监督学习 k均值算法是一种无监督学习算法,可以在没有标签的情况下对数据进行分类。这 对于探索数据的内在结构和特征非常有用,帮助我们理解数据的本质。 优缺点 k均值算法具有以下优点: - 简单、易于实现和理解。 - 可扩展性好,适用于大 规模数据。 - 对于各向同性分布的类别效果较好。 然而,k均值算法也存在一些缺点: - 对于不同大小、不同密度和非凸形状的类 别效果较差。 - 对于初始类别中心的选择敏感,可能会导致结果不稳定。 - 对于噪声和异常值较为敏感,可能会影响聚类结果的准确性。 总结 k均值算法是一种常用的聚类算法,通过迭代计算将数据点分成k个独立的类别。 它在数据挖掘、图像分割、推荐系统和无监督学习等领域有广泛的应用。虽然k均值算法具有简单、易于实现的优点,但也存在对初始类别中心选择敏感和对非凸形状类别效果较差等缺点。在实际应用中,我们需要根据具体情况选择合适的聚类算法,并进行参数调优和结果评估,以获得准确、稳定的聚类结果。

kmeans聚类算法代码实现

kmeans聚类算法代码实现 K-means聚类算法是一种常用的无监督学习算法,用于将数据集划分为多个类别。本文将介绍k-means聚类算法的原理,并使用Python编写代码实现。 一、K-means聚类算法原理 K-means聚类算法基于距离度量的思想,通过计算数据点之间的距离来确定它们的类别。算法的核心思想是将数据点划分为k个簇,使得同一簇内的数据点之间的距离较小,不同簇之间的距离较大。 具体实现步骤如下: 1. 随机选择k个初始中心点,即选取k个数据点作为初始聚类中心。 2. 将数据集中的每个数据点分配到距离最近的聚类中心。 3. 更新聚类中心,将每个簇的中心点更新为该簇内所有数据点的均值。 4. 重复步骤2和步骤3,直到聚类中心不再发生变化或达到预定的迭代次数。 二、K-means聚类算法代码实现 下面是使用Python编写的K-means聚类算法代码实现: ```python import numpy as np

def kmeans(data, k, max_iter): # 随机选择k个初始中心点 centers = data[np.random.choice(range(len(data)), k, replace=False)] for iter in range(max_iter): # 分配数据点到最近的聚类中心 labels = np.argmin(np.linalg.norm(data[:, np.newaxis] - centers, axis=-1), axis=-1) # 更新聚类中心 new_centers = np.array([data[labels == i].mean(axis=0) for i in range(k)]) # 判断聚类中心是否变化 if np.all(centers == new_centers): break centers = new_centers return labels, centers # 示例数据 data = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])

kmeans聚类算法相关定义

kmeans聚类算法相关定义 K-means聚类算法是一种常用的无监督学习算法,用于将数据样本划分为不同的类别。该算法是基于数据点之间的相似性度量进行聚类的。本文将从K-means聚类算法的定义、原理、步骤以及优缺点等方面进行详细介绍。 一、定义 K-means聚类算法是一种常用的迭代聚类算法,它将n个数据样本划分为k个互不相交的类别。每个类别由一个中心点(质心)代表,该中心点是该类别内所有数据点的均值。算法通过最小化数据点与所属类别中心点之间的距离来实现聚类的目标。 二、原理 K-means算法的原理是基于数据点之间的距离来计算相似性,其中距离通常使用欧氏距离来度量。算法通过迭代的方式不断调整类别的中心点,直到满足停止条件为止。具体步骤如下: 1. 初始化:随机选择k个数据点作为初始中心点。 2. 分配:将每个数据点分配到距离最近的中心点所代表的类别。 3. 更新:重新计算每个类别的中心点,即将该类别内所有数据点的均值作为新的中心点。 4. 重复2和3步骤,直到满足停止条件,如达到最大迭代次数或类别中心点不再发生变化。

三、步骤 K-means算法的步骤可以总结为以下几个关键步骤: 1. 选择聚类数k:根据具体问题的需求,选择合适的聚类数k。 2. 初始化中心点:随机选择k个数据点作为初始中心点。 3. 分配数据点:计算每个数据点与中心点之间的距离,将其分配到距离最近的中心点所代表的类别。 4. 更新中心点:重新计算每个类别的中心点,即将该类别内所有数据点的均值作为新的中心点。 5. 重复步骤3和4,直到满足停止条件。 四、优缺点 K-means算法有以下优点: 1. 简单易实现:K-means算法的原理和步骤相对简单,易于理解和实现。 2. 时间复杂度低:K-means算法的时间复杂度较低,适用于大规模数据集。 3. 可解释性强:K-means算法的结果较为直观,每个样本都会被分配到一个类别中。 然而,K-means算法也存在以下缺点: 1. 对初始中心点敏感:K-means算法对初始中心点的选择较为敏感,不同的初始点可能导致不同的聚类结果。

试述k均值聚类的方法原理

试述k均值聚类的方法原理 k均值聚类是一种经典的无监督学习算法,主要用于对数据集进行聚类分析。k均值聚类算法的基本思想是采用欧氏距离度量样本之间的相似度,将数据集分成k个簇(cluster),使得每个样本点与其所在簇内的点的欧氏距离的平方和最小。k均值聚类的求解过程可以 分为如下几个步骤: 1. 初始化:首先在数据集中随机地选择k个初始中心点作为簇的质心。这些中心点通常会根据数据的分布情况,使用随机选取的方法确定。 2. 分配:对于每个数据点,计算它与所有簇质心的距离,并将其归为距离最近的簇。该过程可以通过计算欧氏距离完成。 3. 更新:对于每个簇,重新计算其质心。这个质心是该簇内所有数据点的平均值。 通过不断进行分配和更新操作,可以使得簇内的数据点更加紧密地聚合到簇心周围。 4. 重新分配:将所有数据点重新分配到簇中。如果任意一个数据点的簇分配发生了 改变,那么就需要重新计算所有簇的质心,将过程返回到步骤2,否则该算法停止。 在对数据集进行聚类分析时,k均值聚类算法的结果通常包括k个聚类簇,每个簇中 包含若干个数据点。在实际应用中,需要根据聚类结果对每个簇进行分析、研究或处理。 聚类分析可以帮助人们对数据集进行更加深入的理解,提供数据检索、数据分类、图像识 别等领域的支持。 k均值聚类算法的优点包括: 1. 算法简单易实现。该算法的实现过程不需要特别复杂的理论知识,只需要简单的 数学计算即可。 2. 聚类速度较快。由于k均值聚类算法的求解过程中只需要进行有限次的迭代操作,因此其聚类速度较快。 3. 适用于大规模数据集。对于大规模数据集,k均值聚类算法也可以进行高效的聚类分析。 4. 适用于数值型数据。由于k均值聚类算法采用欧氏距离度量样本之间的相似度,因此其对数值型数据具有很好的适应性。 1. 聚类数目需要预先设定。由于k均值聚类算法需要指定聚类的数量k,因此需要提前了解数据集的特征,否则可能会得到较差的聚类结果。

kmeans聚类算法与熵聚类算法

K-means聚类算法与熵聚类算法是机器学习和数据挖掘领域常用的无监督学习方法。它们都是通过对数据进行分组来寻找数据内在的结构和模式。 一、 K-means聚类算法的原理和流程 1.1 K-means算法的原理 K-means聚类算法是一种基于中心点的聚类算法。它的基本思想是将数据集划分为K个簇,每个簇内的数据点与该簇的中心点具有最小的距离,而不同簇之间的数据点的距离较大。K-means算法的目标是最小化簇内数据点与其对应中心点之间的距离之和。 1.2 K-means算法的流程 K-means算法的流程大致可以分为以下几步: (1)初始化K个中心点,可以随机选择数据集中的K个样本作为中心点; (2)对每个样本,计算其与K个中心点的距离,并将其归类到距离最近的簇中; (3)更新每个簇的中心点,将其设置为该簇内所有样本的平均值;(4)重复步骤(2)和(3),直到簇内数据点的分配不再发生变化或达到预设的迭代次数。 1.3 K-means算法的优缺点 K-means算法的优点包括简单易实现、计算效率高等。但其也存在一

些缺点,例如K值需事先确定、对初始中心点敏感等。 二、熵聚类算法的原理和流程 2.1 熵聚类算法的原理 熵聚类算法是一种基于信息论的聚类方法。其基本思想是通过最小化簇内数据点的信息熵来进行聚类。熵聚类算法可以分为两种:簇内熵最小化算法和簇间熵最大化算法。 2.2 簇内熵最小化算法 簇内熵最小化算法的目标是使得每个簇内的数据点相似度较高,即簇内的数据点之间的差异较小。这可以通过最小化每个簇的熵来实现。 2.3 簇间熵最大化算法 簇间熵最大化算法的目标是使得不同簇之间的差异较大,即簇之间的数据点之间的差异较大。这可以通过最大化不同簇之间的信息熵来实现。 2.4 熵聚类算法的流程 熵聚类算法的流程主要包括以下几步: (1)计算簇内每个数据点的信息熵; (2)将数据点归类到信息熵最小的簇中; (3)重复步骤(1)和(2),直到满足停止条件。

简述k均值算法的原理

简述k均值算法的原理 K均值算法是一种常用的聚类算法,它的主要目标是将数据集划分成k个不相交的簇,使得各个簇内的数据点之间的距离尽可能小,而不同簇之间的数据点之间的距离尽可能大。K均值算法的结果是由k个聚类中心所组成的簇中心位置和每个数据点所属的簇标签。 K均值算法的基本原理是通过以聚类中心为基础进行迭代的过程,来动态地调整聚类中心的位置,直到满足收敛条件为止。首先,在算法的开始阶段,需要先选择k个初始聚类中心,可以是随机选择或基于一定的指导。然后,将数据集中的每个数据点分配到最近的聚类中心,形成k个初始的簇。接下来,根据簇内数据点的均值更新聚类中心的位置,并重新分配数据点到更新后的聚类中心。循环迭代以上两个步骤,直到满足指定的收敛条件,例如聚类中心的位置变化小于某个预设的阈值。 K均值算法的具体步骤如下: Step 1: 选择k个初始聚类中心 在这个步骤中,需要选择k个初始聚类中心。可以采用随机选择的方法,也可以使用预先设定的方法,如选择数据集中k个离散的点或者是使用一些领域知识来指导选择初始聚类中心。 Step 2: 计算每个数据点与聚类中心之间的距离,将其分配到最近的簇

对于每个数据点,计算其与每个聚类中心之间的距离,并将其分配到距离最近的簇中。通常可以采用欧氏距离作为距离度量的方式。 Step 3: 根据簇内数据点的均值更新聚类中心的位置 对于每个簇,计算其内所有数据点的均值,作为该簇新的聚类中心。这一步骤可以使用算数平均、几何平均或其他平均方法来计算。 Step 4: 重新分配数据点到更新后的聚类中心 根据更新后的聚类中心,重新计算每个数据点与聚类中心之间的距离,并将其分配到距离最近的簇中。 Step 5: 判断聚类中心是否满足收敛条件 判断聚类中心位置的变化是否小于某个预设的阈值,如果是则认为聚类已经收敛,结束迭代。否则,返回Step 3。 K均值算法的优缺点: K均值算法有以下优点: 1. 算法简单且易于实现,计算效率高,适用于处理大规模数据集; 2. 结果易于解释,聚类中心的位置可以作为簇的代表,方便进行后续的数据分析和理解; 3. 可以对各个簇进行计算均值、方差等统计性质的分析。

KMeans聚类原理Java实现

KMeans聚类原理Java实现 KMeans K-means(k均值)算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。 基本算法: 1.选择K个点作为初始质心。 2.Repeat 3.将每个点指派到最近的质心,形成K个簇。 4.重新计算每个簇的质心。 Until 质心不再发生变化。 1.初始点的选择策略 随机选取K个点、均匀抽样选取K个点、最大最小法选取、Canopy算法选取。 2.指派点到最近的质心 对欧式空间的点可以使用欧氏距离。 对文档采用余弦相似度。 可以使用曼哈顿距离,jaccard度量来降低计算度。 3.质心和目标函数 邻近性度量采用欧氏距离时,使用误差的平方和(SSE)来作为度量聚类质量的目标函数。使其最小化来得到最优解。 邻近性度量采用余弦相似度时,使用凝聚度来作为度量聚类质量的目标函数。使其最大化来得到最优解。 4. 算法停止条件 计算准则函数,原中心点与新中心点距离小于或等于一定阀值等等 设置最大迭代次数 K-MEANS算法的缺点:产生聚类的大小相差不会很大,对于脏数据很敏感。 KMedoids K中心点算法(K-medoids)提出了新的质点选取方式,而不是简单像k-means算法采用均值计算法。在K中心点算法中,每次迭代后的质点都是从聚类的样本点中选取,而选取的标准就是当该样本点成为新的质点后能提高类簇的聚类质量,使得类簇更紧凑。该算法使用绝对误差标准来定义一个类簇的紧凑程度。

如果某样本点成为质点后,绝对误差能小于原质点所造成的绝对误差,那么K中心点算法认为该样本点是可以取代原质点的,在一次迭代重计算类簇质点的时候,我们选择绝对误差最小的那个样本点成为新的质点。较好的解决了对离群点/噪声数据的敏感,但时间复杂度上升至O(k(m-k)^2)。计算量显然要比KMeans 要大,一般只适合小数据量。 二分KMeans 二分KMeans是对基本KMeans的直接扩充,它基于一种简单想法:为了得到K个簇,将所有点集合分裂成两个簇,从这些簇中选取一个继续分裂,直到产生K个簇。 二分k均值(bisecting k-means)算法的主要思想是:首先将所有点作为一个簇,然后将该簇一分为二。之后选择能最大程度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇。以此进行下去,直到簇的数目等于用户给定的数目k为止。 以上隐含着一个原则是:因为聚类的误差平方和能够衡量聚类性能,该值越小表示数据点月接近于它们的质心,聚类效果就越好。所以我们就需要对误差平方和最大的簇进行再一次的划分,因为误差平方和越大,表示该簇聚类越不好,越有可能是多个簇被当成一个簇了,所以我们首先需要对这个簇进行划分。 二分k均值算法的伪代码如下: 将所有数据点看成一个簇 当簇数目小于k时 对每一个簇 计算总误差 在给定的簇上面进行k-均值聚类(k=2) 计算将该簇一分为二后的总误差 选择使得误差最小的那个簇进行划分操作 下面用Java来简单实现算法,考虑简单,点只用了二维。 public class KMeansCluster extends AbstractCluster { public static final double THRESHOLD = 1.0; public List initData() { List points = new ArrayList(); InputStream in = null; BufferedReader br = null; try { in = KMeansCluster.class.getClassLoader().getResourceAsStream("kmeans1.txt"); br = new BufferedReader(new InputStreamReader(in)); String line = br.readLine(); while (null != line && !"".equals(line)) { StringTokenizer tokenizer = new StringTokenizer(line); double x = Double.parseDouble(tokenizer.nextToken()); double y = Double.parseDouble(tokenizer.nextToken());

相关主题