主要内容

kmeans

k聚类则

描述

例子

idx= kmeans (Xk执行k聚类则对观测结果进行划分n——- - - - - -p数据矩阵Xk,并返回一个n-by-1向量(idx),包含每个观测值的聚类指数。行X对应点,列对应变量。

默认情况下,kmeans使用平方欧几里得距离度规和k——+ +算法用于初始化集群中心。

例子

idx= kmeans (Xk名称,值返回包含一个或多个指定的附加选项的群集索引名称,值对参数。

例如,指定余弦距离、使用新的初始值重复聚类的次数或使用并行计算的次数。

例子

idxC] = kmeans(___返回k的群集中心位置k——- - - - - -p矩阵C

例子

idxCsumd] = kmeans(___对象中点到质心距离的聚类内和k1的向量sumd

例子

idxCsumdD] = kmeans(___中每个点到每个质心的距离n——- - - - - -k矩阵D

例子

全部折叠

使用集群数据k-表示聚类,然后绘制聚类区域。

加载费雪的虹膜数据集。使用花瓣的长度和宽度作为预测指标。

负载fisheririsX = meas(:,3:4);图;情节(X (: 1) X (:, 2),“k *’“MarkerSize”5);标题“费希尔的虹膜数据”;包含“花瓣长度(厘米)”;ylabel“花瓣宽度(厘米)”

图中包含一个轴。标题为Fisher's Iris Data的轴包含一个类型为line的对象。

较大的聚类似乎分裂成一个低方差区域和一个高方差区域。这可能表明较大的集群是两个重叠的集群。

将数据聚类。指定k= 3个集群。

rng (1);%用于再现性[idx,C] = kmeans(X,3);

idx预测的聚类指数向量是否对应于XC是一个包含最终质心位置的3 × 2矩阵。

使用kmeans计算从每个质心到网格上的点的距离。为此,传递质心(C)和网格上的点到kmeans,并实现算法的一次迭代。

x1 = min(X(:,1)):0.01:max(X(:,1));x2 = min(X(:,2)):0.01:max(X(:,2));[x1G,x2G] = meshgrid(x1,x2);XGrid = [x1G(:),x2G(:)];在绘图上定义一个细网格idx2Region = kmeans(XGrid,3,“麦克斯特”,1,“开始”C);
警告:在1个迭代中收敛失败。
将网格中的每个节点分配到最近的质心

kmeans显示一个警告,说明算法没有收敛,这是您应该预料到的,因为软件只实现了一次迭代。

绘制集群区域。

图;gscatter (XGrid (: 1) XGrid (:, 2), idx2Region,...[0, 0.75, 0.75, 0.75, 0, 0.75, 0.75, 0.75, 0],“. .”);持有;情节(X (: 1) X (:, 2),“k *’“MarkerSize”5);标题“费希尔的虹膜数据”;包含“花瓣长度(厘米)”;ylabel“花瓣宽度(厘米)”;传奇(“地区1”《区域2》区域3的“数据”“位置”“东南”);持有

图中包含一个轴。标题为Fisher's Iris Data的轴包含4个类型行对象。这些对象分别表示区域1、区域2、区域3和数据。

随机生成样本数据。

rng默认的%用于再现性X = [randn(100,2)*0.75+ones(100,2);randn(100 2) * 0.5的(100 2)];图;情节(X (: 1) X (:, 2),“。”);标题“随机生成的数据”

图中包含一个轴。标题为随机生成数据的轴包含一个类型为line的对象。

数据中似乎有两个集群。

将数据划分为两个集群,并从五个初始化中选择最佳排列。显示最终输出。

Opts = statset(“显示”“最后一次”);[idx,C] = kmeans(X,2,“距离”“cityblock”...“复制”5,“选项”、选择);
重复1,3次迭代,总距离和= 201.533。重复2,5次迭代,总距离和= 201.533。重复3,3次迭代,总距离和= 201.533。重复4,3次迭代,总距离和= 201.533。复制5,2次迭代,总距离之和= 201.533。最佳总距离之和= 201.533

默认情况下,软件分别使用k——+ +。

绘制聚类和聚类质心。

图;情节(X (idx = = 1,1) X (idx = = 1、2),“r”。“MarkerSize”, 12)情节(X (idx = = 2, 1), X (idx = = 2, 2),“b”。“MarkerSize”12)情节(C (: 1), C (:, 2),“kx”...“MarkerSize”15岁的“线宽”3)传说(“集群1”《集群2》“重心”...“位置”“西北”)标题“聚类分配和质心”持有

图中包含一个轴。标题为Cluster Assignments和centrroids的轴包含3个类型为line的对象。这些对象代表簇1、簇2、形心。

您可以通过传递来确定集群的分离程度idx轮廓

聚类大型数据集可能需要一些时间,特别是在使用在线更新(默认设置)的情况下。如果您拥有并行计算工具箱™许可证,并且为并行计算设置了选项,那么kmeans并行运行每个集群任务(或复制)。而且,如果复制>1,那么并行计算减少收敛的时间。

由高斯混合模型随机生成一个大数据集。

Mu = bsxfun(@times,ones(20,30),(1:20)');%高斯混合平均Rn30 = randn(30,30);σ = rn30'*rn30;%对称和正定协方差Mdl = gmdistribution(Mu,Sigma);定义高斯混合分布rng (1);%用于再现性X = random(Mdl,10000);

Mdl是30维的gmdistribution有20个组件的模型。X是10000 × 30矩阵的数据生成Mdl

指定并行计算的选项。

流= RandStream(“mlfg6331_64”);%随机数流选项= statset(“UseParallel”,1,“UseSubstreams”,1,...“流”、流);

输入参数“mlfg6331_64”RandStream指定使用乘法滞后斐波那契生成器算法。选项是一个结构数组,其字段指定用于控制估计的选项。

使用以下方法对数据进行群集k——集群。指定有k=数据中的20个簇,增加迭代次数。通常,目标函数包含局部极小值。指定10个复制以帮助查找较低的本地最小值。

抽搐;启动秒表计时器[idx,C,sumd,D] = kmeans(X,20,“选项”选项,“麦克斯特”, 10000,...“显示”“最后一次”“复制”10);
使用“本地”配置文件启动并行池(parpool)…与6名工人相连。重复5次,72次迭代,总距离之和= 7.73161e+06。复制1,64次迭代,总距离之和= 7.72988e+06。复制3,68次迭代,总距离之和= 7.72576e+06。重复4,84次迭代,总距离之和= 7.72696e+06。重复6次,82次迭代,总距离之和= 7.73006e+06。重复7次,40次迭代,总距离之和= 7.73451e+06。重复2,194次迭代,总距离之和= 7.72953e+06。复制9,105次迭代,总距离之和= 7.72064e+06。 Replicate 10, 125 iterations, total sum of distances = 7.72816e+06. Replicate 8, 70 iterations, total sum of distances = 7.73188e+06. Best total sum of distances = 7.72064e+06
toc终止秒表计时器
运行时间为61.915955秒。

命令窗口表明有六个工作人员可用。在您的系统中,工作人员的数量可能会有所不同。命令窗口显示每个复制的迭代次数和终端目标函数值。输出参数包含复制9的结果,因为它具有最少的总距离和。

kmeans执行k-表示将数据划分为集群k集群。当您有一个新的数据集要集群时,您可以通过使用来创建包含现有数据和新数据的新集群kmeans.的kmeans函数支持C/ c+金宝app+代码生成,因此您可以生成接受训练数据并返回聚类结果的代码,然后将代码部署到设备上。在这个工作流中,您必须传递训练数据,这些数据可能相当大。为了节省设备内存,可以将训练和预测分开使用kmeans而且pdist2,分别。

使用kmeans在MATLAB®中创建集群并使用pdist2在生成的代码中为现有集群分配新数据。对于代码生成,定义一个入口点函数,该函数接受聚类质心位置和新数据集,并返回最近的聚类索引。然后,生成入口点函数的代码。

生成C/ c++代码需要MATLAB®Coder™。

执行k聚类则

使用三个分布生成一个训练数据集。

rng (“默认”%用于再现性X = [randn(100,2)*0.75+ones(100,2);randn(100 2) * 0.5的(100 2);randn (100 2) * 0.75);

将训练数据划分为三个聚类kmeans

[idx,C] = kmeans(X,3);

绘制聚类和聚类质心。

图gscatter (X (: 1), (:, 2), idx,“bgm”)举行情节(C (: 1), C (:, 2),“kx”)传说(“集群1”《集群2》“集群3”聚类质心的

图中包含一个轴。坐标轴包含4个line类型的对象。这些对象表示集群1、集群2、集群3和集群中心。

向现有集群分配新数据

生成一个测试数据集。

Xtest = [randn(10,2)*0.75+ones(10,2);randn(10, 2) * 0.5的(10,2);randn (10, 2) * 0.75);

使用现有的集群对测试数据集进行分类。使用,找到离每个测试数据点最近的质心pdist2

[~,idx_test] = pdist2(C,Xtest,“欧几里得”“最小”1);

用标绘测试数据并标记测试数据idx_test通过使用gscatter

gscatter (Xtest (: 1) Xtest (:, 2), idx_test,“bgm”“哦”)传说(“集群1”《集群2》“集群3”聚类质心的...“数据分类到集群1”“数据分类到群集2”...“数据分类到集群3”

图中包含一个轴。坐标轴包含7个line类型的对象。这些对象分别表示集群1、集群2、集群3、集群质心、集群1中的数据、集群2中的数据、集群3中的数据。

生成代码

生成将新数据分配给现有集群的C代码。注意,生成C/ c++代码需要MATLAB®Coder™。

定义名为findNearestCentroid它接受质心位置和新数据,然后通过使用找到最近的群集pdist2

添加% # codegen编译器指令(或pragma)到函数入口点之后的函数签名,以表明您打算为MATLAB算法生成代码。添加此指令将指导MATLAB代码分析器帮助您诊断和修复在代码生成过程中可能导致错误的违规行为。

类型findNearestCentroid显示“findNearestCentroid.m”的内容
函数idx = findNearestCentroid(C,X) %#codegen [~,idx] = pdist2(C,X,'欧几里得','最小',1);找到最近的质心

注意:如果单击该页右上方部分的按钮并在MATLAB®中打开此示例,则MATLAB®将打开示例文件夹。此文件夹包括入口点函数文件。

使用以下命令生成代码codegen(MATLAB编码器).因为C和c++都是静态类型语言,所以必须在编译时确定入口点函数中所有变量的属性。的输入的数据类型和数组大小findNearestCentroid,传递一个MATLAB表达式,该表达式表示具有特定数据类型和数组大小的值集arg游戏选择。详细信息请参见为代码生成指定可变大小的参数

codegenfindNearestCentroidarg游戏{C, Xtest}
代码生成成功。

codegen生成MEX函数findNearestCentroid_mex使用依赖于平台的扩展。

验证生成的代码。

myIndx = findNearestCentroid(C,Xtest);myIndex_mex = findnearestcentrroid_mex (C,Xtest);verifyMEX = isequal(idx_test, myindex,myIndex_mex)
verifyMEX =逻辑1

isequal返回逻辑1 (真正的),这意味着所有的输入都是相等的。这一比较证实了pdist2函数,findNearestCentroid函数,和MEX函数返回相同的索引。

您还可以使用GPU Coder™生成优化的CUDA®代码。

cfg = code . gpuconfig (墨西哥人的);codegen配置cfgfindNearestCentroidarg游戏{C, Xtest}

有关代码生成的更多信息,请参见通用代码生成工作流程.有关GPU编码器的更多信息,请参见开始使用GPU编码器(GPU编码器)而且金宝app支持功能(GPU编码器)

输入参数

全部折叠

数据,指定为数值矩阵。一排排的X对应于观察结果,列对应于变量。

如果X是数字向量吗kmeans把它当做n-by-1数据矩阵,不管它的方向如何。

软件处理年代X的任意行X至少包含一个.删除X减少样本量。的kmeans函数返回为输出参数中的相应值idx

数据类型:|

数据中的群集数目,指定为正整数。

数据类型:|

名称-值对参数

的可选逗号分隔对名称,值参数。的名字参数名称和价值对应的值。的名字必须出现在引号内。您可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家

例子:“距离”、“余弦”,“复制”,10日,“选项”,statset (UseParallel, 1)指定余弦距离,10以不同的初始值复制集群,并使用并行计算。

要在命令窗口中显示的输出级别,指定为逗号分隔的对,由“显示”以及以下选项之一:

  • “最后一次”—显示最终迭代的结果

  • “通路”—显示每次迭代的结果

  • “关闭”-不显示任何内容

例子:“显示”、“最后”

距离度量,单位为p-维空间,用于最小化,指定为逗号分隔的对,由“距离”而且“sqeuclidean”“cityblock”的余弦“相关”,或“汉明”

kmeans根据支持的距离度量,以不同的方式计算质心簇。金宝app下表总结了可用的距离度量。在公式中,x是观察(即一排X),c是质心(行向量)。

距离度量 描述 公式
“sqeuclidean”

欧式距离的平方(默认值)。每个质心是该聚类中点的平均值。

d x c x c x c

“cityblock”

绝对差的和,即l1的距离。每个质心是该聚类中点的分量中值。

d x c j 1 p | x j c j |

的余弦

1减去点间夹角的余弦(作为向量)。每个质心是该聚类中点的平均值,将这些点归一化为单位欧几里得长度。

d x c 1 x c x x c c

“相关”

1减去点之间的样本相关性(作为值序列处理)。每个质心是该聚类中点的分量均值,将这些点定心并归一化为零均值和单位标准差。

d x c 1 x x ¯ c c ¯ x x ¯ x x ¯ c c ¯ c c ¯

在哪里

  • x ¯ 1 p j 1 p x j 1 p

  • c ¯ 1 p j 1 p c j 1 p

  • 1 p 的行向量是p的人。

“汉明”

这个指标只适用于二进制数据。

它是不同比特的比例。每个质心是该聚类中点的分量中值。

d x y 1 p j 1 p x j y j

在哪里是指示器函数。

例子:“距离”、“cityblock”

当群集丢失其所有成员观察值时采取的操作,这些观察值指定为逗号分隔的对,由“EmptyAction”以及以下选项之一。

价值 描述
“错误”

将空集群视为错误。

“下降”

删除所有变为空的集群。kmeans中设置相应的返回值C而且D

“单”

创建一个由距离其质心最远的一个点(默认值)组成的新群集。

例子:“EmptyAction”、“错误”

最大迭代次数,指定为由逗号分隔的对组成的“麦克斯特”一个正整数。

例子:麦克斯特,1000年

数据类型:|

在线更新标志,指定为逗号分隔的对,由“OnlinePhase”而且“关闭”“上”

如果OnlinePhase,然后kmeans除批量更新阶段外,还执行在线更新阶段。对于大数据集,在线阶段可能很耗时,但保证了解决方案是距离准则的局部最小值。换句话说,软件会找到一个数据分区,其中将任何单个点移动到不同的聚类中都会增加距离的总和。

例子:“OnlinePhase”,“上”

用于控制用于最小化拟合条件的迭代算法的选项,指定为由逗号分隔的对组成“选项”和返回的结构数组statset.金宝app结构数组的受支持字段指定用于控制迭代算法的选项。

该表总结了支持的字段。金宝app请注意,受支持的字段需要Pa金宝apprallel Computing Toolbox™。

描述
“流”

一个RandStream对象或此类对象的单元格数组。如果您没有指定kmeans使用默认流或多个流。如果你指定,除非满足以下所有条件,否则使用单个对象:

  • 你有一个开放的平行泳池。

  • UseParallel真正的

  • UseSubstreams

在本例中,使用与并行池大小相同的单元格数组。如果并行池未打开,则必须提供单个随机数流。

“UseParallel”
  • 如果真正的而且复制> 1kmeans实现了k-means算法在每个并行复制。

  • 如果没有安装并行计算工具箱,则以串行模式进行计算。默认为,表示串行计算。

“UseSubstreams” 设置为真正的并行计算以可重复的方式并行计算默认为.若要可重复计算,请设置到允许子流的类型:“mlfg6331_64”“mrg32k3a”

为了确保更可预测的结果,使用parpool(并行计算工具箱)并在调用之前显式地创建一个并行池kmeans和设置“选项”,statset (UseParallel, 1)

例子:“选项”,statset (UseParallel, 1)

数据类型:结构体

使用新的初始聚类中心位置重复聚类的次数,指定为由逗号分隔的对组成的“复制”一个整数。kmeans返回最小值的解sumd

你可以设置“复制”的值隐式地提供一个三维数组“开始”名称-值对参数。

例子:“复制”,5

数据类型:|

选择初始聚类质心位置(或种子),指定为逗号分隔的对,由“开始”而且“集群”“+”“样本”“统一”一个数字矩阵,或一个数字数组。下表总结了可供选择的种子。

价值 描述
“集群”

的随机10%子样本上执行初步聚类阶段X当子样本中的观察数大于k.这个初始阶段本身就是使用“样本”

如果随机10%子样本中的观察数小于k,然后软件进行选择k观察从X在随机的。

“+”(默认) 选择k通过执行k——+ +算法用于初始化集群中心。
“样本” 选择k观察从X在随机的。
“统一” 选择k点在范围内均匀随机分布X.对汉明距离无效。
数字矩阵 k——- - - - - -p质心起始位置矩阵。一排排的开始对应种子。软件推断k从第一个维度开始,所以你可以进去[]k
数字数组 k——- - - - - -p——- - - - - -r质心起始位置数组。每页的行对应种子。第三维调用集群例程的复制。页面j包含用于复制的种子集j.该软件推断复制数(由“复制”名称-值对参数)从第三维的大小。

例子:“开始”、“样本”

数据类型:字符|字符串||

输出参数

全部折叠

群集索引,作为数值列向量返回。idx有多少行X,每一行表示对应观测值的聚类分配。

聚类中心位置,作为数字矩阵返回。C是一个k——- - - - - -p矩阵,其中行j是簇的质心吗j

点到质心距离的聚类内和,作为数值列向量返回。sumd是一个k-by-1向量,其中元素j是簇内点到质心距离的和吗j.默认情况下,kmeans使用平方欧几里得距离(见“距离”指标)。

从每个点到每个质心的距离,返回为数值矩阵。D是一个n——- - - - - -k矩阵,其中元素(j)为观测距离j为重心.默认情况下,kmeans使用平方欧几里得距离(见“距离”指标)。

更多关于

全部折叠

k聚类则

k - means聚类,或劳埃德算法[2],是一种迭代的数据分区算法n观察结果正好是其中之一k由质心定义的簇,其中k在算法开始之前选择。

算法进行如下:

  1. 选择k初始集群中心(重心).例如,选择k随机观察(用“开始”、“样本”)或使用k-means ++算法用于初始化集群中心(默认值)。

  2. 计算所有观测到每个质心的点到群集质心的距离。

  3. 有两种继续(由OnlinePhase):

    • 批量更新-将每个观测值分配到最近质心的群集。

    • 在线更新-如果重新分配减少了集群内点到集群质心距离的平方和,则单独将观测值分配到不同的质心。

    详情请参见算法

  4. 计算每个聚类中观测值的平均值,得到k新的质心位置。

  5. 重复步骤2到4,直到集群分配没有改变,或者达到最大迭代次数。

k——+ +算法

k——+ +算法使用启发式方法找到质心种子k——集群。根据亚瑟和瓦西里维茨基的说法[1]k- mean++提高了Lloyd 's算法的运行时间,以及最终解的质量。

k-means++算法选择种子如下,假设簇数为k

  1. 从数据集中均匀随机地选择一个观测值,X.所选观测值为第一质心,并记为c1

  2. 计算从每个观测点到c1.表示之间的距离cj观察结果作为 d x c j

  3. 选择下一个质心,c2随机地X的概率

    d 2 x c 1 j 1 n d 2 x j c 1

  4. 选择中心j

    1. 计算每个观测点到每个质心的距离,并将每个观测点分配到其最近的质心。

    2. = 1,…,n而且p= 1,…,j- 1,选择质心j随机地X的概率

      d 2 x c p h x h C p d 2 x h c p

      在哪里Cp所有观测值的集合是否最接近质心cp而且x属于Cp

      也就是说,选择每个后续的中心,其概率与它自身到你已经选择的最近的中心的距离成正比。

  5. 重复步骤4直到k选择质心。

亚瑟和瓦西里维茨基[1]使用几个簇方向的模拟研究来演示k-means++比Lloyd的算法更快地收敛到更低的聚类内点到聚类质心距离的平方和和。

算法

  • kmeans使用两阶段迭代算法来最小化点到质心距离的总和,对所有的总和k集群。

    1. 第一阶段使用批量更新,其中每次迭代都包括将点重新分配到最近的聚类质心,然后重新计算聚类质心。这个阶段偶尔不收敛到局部最小值的解。也就是说,在一个数据分区中,将任何单个点移动到不同的聚类会增加距离的总和。这对于小数据集更有可能。批处理阶段是快速的,但可能只是将解决方案作为第二个阶段的起点。

    2. 第二阶段使用在线更新,如果这样做减少了距离的总和,则单独重新分配点,并且在每次重新分配后重新计算聚类质心。这个阶段的每一次迭代都是通过所有的点。此相位收敛到局部最小值,尽管可能存在其他具有较低总距离和的局部最小值。一般来说,找到全局最小值是通过详尽的起点选择来解决的,但是使用具有随机起点的多个重复通常会得到全局最小值的解决方案。

  • 如果复制r> 1和开始+(默认值),然后软件进行选择r可能是不同种类的种子k——+ +算法

  • 如果您启用UseParallel选项选项而且复制> 1,则每个工蚁并行选择种子和集群。

参考文献

亚瑟,大卫和塞尔吉·瓦西里维茨基。“k -means++:仔细播种的优势。”SODA ' 07:第十八届ACM-SIAM离散算法研讨会论文集.2007,第1027-1035页。

[2] Lloyd, Stuart P.“PCM中的最小二乘量化”。IEEE信息论汇刊.第28卷,1982年,129-137页。

[3] Seber g.a.f.多变量的观察.霍博肯,新泽西州:约翰·威利父子公司,1984年。

[4]路径,H。聚类解剖与分析:理论,FORTRAN程序,例子.翻译:J. Goldschmidt纽约:霍尔斯特德出版社,1985年。

扩展功能

R2006a之前介绍