k-均值聚类
使用群集数据k-表示聚类,然后绘制聚类区域。
载入费雪的虹膜数据集。使用花瓣的长度和宽度作为预测因素。
负载鱼腥草X =量(:,3:4);图;情节(X (: 1) X (:, 2),“k*”,“MarkerSize”,5);头衔“费舍尔的虹膜数据”;xlabel‘花瓣长度(厘米)’;ylabel“花瓣宽度(cm)”;
较大的簇似乎被分成一个低方差区域和一个高方差区域。这可能表明较大的簇是两个重叠的簇。
集群的数据。指定k= 3集群。
rng(1);%的再现性[idx,C]=kmeans(X,3);
idx
是与中的观测值相对应的预测聚类指数向量X
.C
是一个包含最终质心位置的3 × 2矩阵。
使用kmeans
计算从每个质心到网格上各点的距离。要做到这一点,通过质心(C
),并在网格上指向kmeans
,并实现算法的一次迭代。
x1 = min (X(: 1)): 0.01:马克斯(X (: 1));x2 = min (X(:, 2)): 0.01:马克斯(X (:, 2));[x1G, x2G] = meshgrid (x1, x2);XGrid = [x1G (:), x2G (:));在plot上定义一个精细的网格idx2Region = kmeans (XGrid 3“MaxIter”,1,“开始”C);
警告:未能在1次迭代中收敛。
%将栅格中的每个节点指定给最近的质心
kmeans
显示一条警告,指出算法没有收敛,这是您应该预料到的,因为软件只实现了一次迭代。
绘制集群区域。
图:gscatter(XGrid(:,1),XGrid(:,2),idx2区域,...[0, 0.75, 0.75, 0.75, 0, 0.75, 0.75, 0.75, 0],“. .”); 持有在;情节(X (: 1) X (:, 2),“k*”,“MarkerSize”,5);头衔“费舍尔的虹膜数据”;xlabel‘花瓣长度(厘米)’;ylabel“花瓣宽度(cm)”;传奇(“地区1”,《区域2》,区域3的,“数据”,“位置”,“东南”); 持有从;
随机生成样本数据。
rng违约;%的再现性X=[randn(100,2)*0.75+一(100,2);randn(100,2)*0.5-一(100,2)];图;图(X(:,1),X(:,2),“。”);标题随机生成的数据的;
数据中似乎有两个集群。
将数据划分为两个集群,并在五个初始化中选择最佳的安排。显示最终输出。
选择= statset (“显示”,“决赛”);[idx,C]=kmeans(X,2,“距离”,“城市街区”,...“复制品”5,“选项”,opts);
重复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”等一下在情节(X (idx = = 2, 1), X (idx = = 2, 2),“b”。,“MarkerSize”图(C(:,1),C(:,2),“kx”,...“MarkerSize”,15,“线宽”3)传说(“集群1”,“集群2”,“重心”,...“位置”,“西北”)标题“群集分配和质心”持有从
您可以通过传递来确定集群的分离程度idx
来轮廓
.
聚集大型数据集可能需要时间,特别是在使用在线更新(默认设置)的情况下。如果您有一个并行计算工具箱™许可,并且设置了并行计算的选项,那么kmeans
并行运行每个群集任务(或复制)。如果复制
>1,则并行计算减少了收敛时间。
从高斯混合模型中随机生成一个大数据集。
μ= bsxfun (@times(20、30),(1:20)');%高斯混合均值rn30=随机数(30,30);西格玛=rn30'*rn30;%对称正定协方差Mdl = gmdistribution(μ、σ);%定义高斯混合分布rng(1);%的再现性X =随机(Mdl, 10000);
Mdl
是一个30维的gmdistribution
模型包含20个组件。X
一个10000 × 30的数据矩阵是从哪里产生的Mdl
.
指定并行计算的选项。
流= RandStream (“mlfg6331_64”);%随机数流选择= statset (“UseParallel”,1,“使用子流”,1,...“溪流”、流);
输入参数“mlfg6331_64”
的兰德斯特朗
指定使用乘法滞后的斐波那契生成算法。选项
是一个结构数组,其字段指定用于控制估计的选项。
使用以下方法聚类数据k——集群。指定有k=数据中的20个群集,并增加迭代次数。通常,目标函数包含局部最小值。指定10个副本以帮助找到较低的局部最小值。
抽搐;启动秒表计时器[idx,C,sumd,D]=kmeans(X,20,“选项”选项,“MaxIter”, 10000,...“显示”,“决赛”,“复制品”10);
使用“local”配置文件启动并行池(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秒。
命令窗口表示有6个工作人员可用。在您的系统中,工作人员的数量可能会有所不同。命令窗口显示每个复制的迭代次数和终端目标函数值。输出参数包含复制9的结果,因为它的距离总和最低。
kmeans
执行k-表示聚类将数据划分为k集群。当您有一个新的数据集要集群时,您可以使用kmeans
这个kmeans
函数支持C/ c+万博1manbetx+代码生成,因此您可以生成接受训练数据并返回集群结果的代码,然后将代码部署到设备上。在这个工作流中,您必须通过训练数据,这些数据可能相当大。为了节省设备上的内存,您可以使用分离训练和预测kmeans
和pdist2
,分别。
使用kmeans
在MATLAB®中创建集群并使用pdist2
在生成的代码中将新数据分配给现有集群。对于代码生成,定义一个入口点函数,该函数接受集群质心位置和新的数据集,并返回最近的集群的索引。然后,生成入口点函数的代码。
生成C/C++代码需要MATLAB®编码器™.
执行k-均值聚类
使用三个分布生成一个训练数据集。
rng (“默认”)%的再现性X = [randn(100 2) * 0.75 +(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”,“第三组”,聚类质心的)
将新数据分配给现有集群
生成一个测试数据集。
Xtest = [randn(10, 2) * 0.75 +的(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”,“第三组”,聚类质心的,...“分类到群集1的数据”,“分类到群集2的数据”,...“分类到群集3的数据”)
生成代码
生成为现有集群分配新数据的C代码。请注意,生成C/C++代码需要MATLAB®编码器™.
定义一个入口点函数名为findNearestCentroid
它接受质心位置和新数据,然后通过使用pdist2
.
添加%#编码基因
编译器指令(或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=findNearestCentroid_-mex(C,Xtest);verifyMEX=isequal(idx_测试,myIndx,myIndex_-mex)
verifyMEX =逻辑1
isequal
返回逻辑1 (真正的
),这意味着所有的输入都是相等的。比较确认pdist2
功能findNearestCentroid
函数,而MEX函数返回相同的索引。
您还可以使用GPU编码器™生成优化的CUDA®代码。
cfg = coder.gpuConfig (墨西哥人的);codegen配置cfgfindNearestCentroidarg游戏{C,Xtest}
有关代码生成的更多信息,请参见通用代码生成工作流。有关GPU编码器的更多信息,请参阅开始与GPU编码器(GPU编码器)和万博1manbetx支持函数(GPU编码器).
X
- - - - - -数据数据,指定为数字矩阵X
对应于观察值,列对应于变量。
如果X
是数字向量吗kmeans
把它当作n-by-1数据矩阵,不管它的方向。
该软件将南
年代X
删除丢失的数据并删除X
至少包含一个南
.删除行X
减少样本量。的kmeans
函数返回南
获取输出参数中相应的值idx
.
数据类型:单
|双
k
- - - - - -数量的集群数据中的群集数,指定为正整数。
数据类型:单
|双
指定可选的逗号分隔的对名称,值
论据。的名字
参数名和价值
为对应值。的名字
必须出现在引号内。可以以任意顺序指定多个名称和值对参数名称1,值1,…,名称,值
.
“距离”、“余弦”,“复制”,10日,“选项”,statset (UseParallel, 1)
指定余弦距离,10
以不同的起始值复制集群,并使用并行计算。
显示
- - - - - -要显示的输出级别“关”
(默认)|“决赛”
|“通路”
要在命令窗口中显示的输出级别,指定为由逗号分隔的对组成“显示”
以及下列选项之一:
“决赛”
-显示最终迭代的结果
“通路”
-显示每个迭代的结果
“关”
-不显示任何内容
例子:“显示”,“最终”
距离
- - - - - -距离度量“平方欧几里德”
(默认)|“城市街区”
|的余弦
|“相关性”
|“汉明”
距离度量单位,单位为p
维空间,用于最小化,指定为由逗号分隔的对组成“距离”
和“平方欧几里德”
,“城市街区”
,的余弦
,“相关性”
,或“汉明”
.
kmeans
为支持的距离度量以不同的方式计算质心集群。万博1manbetx该表总结了可用的距离度量。在公式,x是一个观察(即,一行X
),c是质心(行向量)。
距离度量 | 描述 | 公式 |
---|---|---|
“平方欧几里德” |
平方欧氏距离(默认值)。每个质心是该簇中点的平均值。 |
|
“城市街区” |
绝对差值之和,即l1的距离。每个质心是该集群中各点的分量中值。 |
|
的余弦 |
1减去点之间夹角的余弦值(作为向量)。每个质心是该聚类中的点的均值,将这些点归一化为单位欧几里得长度。 |
|
“相关性” |
一减去点之间的样本相关性(作为值的序列处理)。每个质心是该聚类中各点的分量均值,对这些点进行中心和归一化,使其均值和单位标准差为零。 |
哪里
|
“汉明” |
这个度量仅适用于二进制数据。 它是不同位的比例。每个质心是该集群中各点的分量中值。 |
哪里我为指标函数。 |
例子:“距离”,“城市街区”
马克西特
- - - - - -最大迭代次数One hundred.
(默认)|正整数最大迭代次数,由逗号分隔对组成“MaxIter”
一个正整数。
例子:麦克斯特,1000年
数据类型:双
|单
OnlinePhase
- - - - - -在线更新标志“关”
(默认)|“上”
在线更新标志,指定为逗号分隔对,由“在线阶段”
和“关”
或“上”
.
如果OnlinePhase
是在
,然后kmeans
除批量更新阶段外,还执行在线更新阶段。对于大型数据集来说,在线阶段可能会很耗时,但可以保证解决方案是距离标准的局部最小值。换句话说,软件找到一个数据分区,在这个分区中,将任何一个单点移动到不同的集群中,都会增加距离的总和。
例子:“OnlinePhase”,“上”
选择权
- - - - - -用于控制最小化拟合准则的迭代算法的选项[]
(默认)|返回的结构数组statset
用于控制最小化拟合准则的迭代算法的选项,指定为由逗号分隔的对组成“选项”
和返回的结构数组statset
.万博1manbetx结构数组支持的字段指定控制迭代算法的选项。
该表总结了受支持的字段。万博1manbetx注意,受支持的字段需要Par万博1manbetxallel Computing Toolbox™。
场 | 描述 |
---|---|
“溪流” |
一个
在本例中,使用与并行池相同大小的单元格数组。如果并行池未打开,则 |
“UseParallel” |
|
“使用子流” |
设置为真正的 以可复制的方式并行计算。默认值为假 .要重复计算,请设置流 对于允许子流的类型:“mlfg6331_64” 或“mrg32k3a” . |
为了确保更可预测的结果,使用parpool
(并行计算工具箱)并在调用之前显式地创建并行池kmeans
和背景“选项”,statset (UseParallel, 1)
.
例子:“选项”,statset (UseParallel, 1)
数据类型:结构体
复制
- - - - - -使用新的初始群集质心位置重复群集的次数1
(默认)|正整数使用新的初始集群质心位置重复集群的次数,指定为逗号分隔的对组成“复制品”
和一个整数。kmeans
返回最低的解sumd
.
你可以设置“复制品”
方法的值可以隐式地提供一个3-D数组“开始”
名称-值对的论点。
例子:“复制品”,5
数据类型:双
|单
开始
- - - - - -初始簇质心位置的选择方法“加”
(默认)|“集群”
|“样本”
|“制服”
|数字矩阵|数字数组选择初始簇质心位置的方法(或种子),指定为逗号分隔的对,由“开始”
和“集群”
,“加”
,“样本”
,“制服”
,数字矩阵或数字数组。该表总结了选择种子的可用选项。
价值 | 描述 |
---|---|
“集群” |
对随机的10%子样本执行初步聚类阶段 如果10%的随机子样本中的观测数小于 |
“加” (默认) |
选择k 通过实现k——+ +算法用于集群中心初始化。 |
“样本” |
选择k 来自X 在随机的。 |
“制服” |
选择k 点的范围均匀地随机分布X .对于汉明距离无效。 |
数字矩阵 | k ——- - - - - -p质心起始位置矩阵。的行开始 对应于种子。软件的推断k 从第一个维度开始 ,所以你可以通过[] 为k . |
数字数组 | k ——- - - - - -p——- - - - - -r质心起始位置数组。每页的行对应种子。第三个维度调用集群例程的复制。页面j包含用于复制的种子集j.软件推断复制的数量(由“复制品” 名称-值对参数)从第三维的大小。 |
例子:“开始”、“样本”
数据类型:字符
|一串
|双
|单
idx
——集群指数作为数字列向量返回的群集索引。idx
有多少行X
,每行表示相应观测的群集分配。
C
-集群质心位置群集中心位置,以数字矩阵的形式返回。C
是一个k
——- - - - - -p矩阵,行j簇的质心是什么j.
k - means聚类,或劳埃德算法[2],是一种迭代的数据分区算法,用于分配n对其中一个的观测k由质心定义的簇,其中k在算法开始之前选择。
算法进行如下:
的k——+ +算法用启发式方法寻找质心种子k——集群。根据亚瑟和瓦西里维茨基的说法[1],k-means++提高了Lloyd 's算法的运行时间,以及最终解决方案的质量。
的k-means++算法选择种子如下,假设簇的数量为k.
从数据集中均匀随机选取一个观测值,X这个chosen observation is the first centroid, and is denotedc1.
计算从每个观测到的距离c1.表示距离cj和观察米作为 .
选择下一个质心,c2随机从X有可能
选择中心j:
计算从每个观测到每个质心的距离,并将每个观测分配到其最近的质心。
为米= 1,...,n和p= 1,...,j–1,选择质心j随机从X有可能
哪里Cp是最接近质心的所有观测值集cp和x米属于Cp.
也就是说,选择每个后续中心的概率与它自身到已经选择的最近中心的距离成正比。
重复步骤4,直到k选上的重心。
亚瑟和Vassilvitskii[1]通过对多个集群方向的模拟研究,证明k-means++比Lloyd算法更快地收敛到更低的簇内平方和点到簇质心距离。
kmeans
使用两阶段迭代算法最小化点到质心的距离之和,在所有情况下求和k
集群。
第一阶段使用批量更新,其中每次迭代包括一次将点重新分配到最近的簇质心,然后重新计算簇质心。此阶段偶尔不会收敛到局部最小值的解决方案。也就是说,将任何单个点移动到不同簇会增加距离的总和这更可能适用于小数据集。批处理阶段很快,但可能仅近似于作为第二阶段起点的解决方案。
第二阶段使用在线更新,如果这样做可以减少距离的总和,那么将单独重新分配点,并且在每次重新分配后重新计算聚类质心。在此阶段的每个迭代包含一次遍历所有点。这个相位收敛到一个局部最小值,尽管可能有其他具有更小的总距离和的局部最小值。一般来说,寻找全局最小值是通过穷尽地选择起始点来解决的,但是使用几个随机起始点的重复通常会得到一个全局最小值的解。
如果启用UseParallel
选择权选择权
和复制
> 1,然后每个工蜂并行选择种子和集群。
亚瑟,大卫和塞吉·瓦西里维茨基。" K-means++:小心播种的好处"SODA ' 07:第十八届ACM-SIAM年度离散算法研讨会论文集.2007年,页1027 - 1035。
[2] Lloyd, Stuart P. < PCM中的最小二乘量化>IEEE信息理论汇刊1982年第28卷,第129-137页。
[3] 塞伯,G.A.F。多变量观测.John Wiley & Sons, Inc., 1984。
[4] 斯帕特,H。聚类剖析与分析:理论,FORTRAN程序,实例.J.戈德施密特(J. Goldschmidt)翻译。纽约:霍尔斯特德出版社,1985年。
使用注意事项及限制:
万博1manbetx支持的语法包括:
idx=kmeans(X,k)
[idx C] = kmeans (X, k)
[idx,C,sumd]=kmeans(X,k)
[\\\\]=kmeans(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
万博1manbetx受支持的名称-值对参数及其区别如下:
“显示”
—默认值为“通路”
.
“MaxIter”
“选项”
-只万博1manbetx支持“托尔芬”
由创建的结构数组的字段statset
这个违约value of“托尔芬”
是1e-4
这个kmeans
函数使用“托尔芬”
作为点到质心距离的簇内和的终止公差。例如,您可以指定“选项”,statset (e-8 TolFun, 1)
.
“复制品”
“开始”
——万博1manbetx只支持“加”
,“样本”
,以及一个数字数组。
有关更多信息,请参见内存不足数据的高阵列.
使用注意事项及限制:
如果开始
该方法使用随机选择,初始质心簇位置可能与MATLAB不匹配®.
如果中的行数X
是固定的,代码生成不删除行X
包含一个南
.
簇心位置在C
可以有不同于MATLAB的顺序。在本例中,集群索引在idx
有相应的区别。
如果你提供显示
,它的价值必须是“关”
.
如果你提供流
,它必须是空的UseSubstreams
必须假
.
当你设定UseParallel
选项真正的
:
某些计算可以并行执行,即使在复制
是1
。对于大型数据集,当复制
是1
考虑设置UseParallel
选项真正的
.
kmeans
使用parfor
(MATLAB编码器)创建在支持的共享内存多核平台上并行运行的循环。并行运行的循环可能比在单个线程上运万博1manbetx行的循环快。如果编译器不支持OpenMultiprocessing(OpenMP)应用程序接口或禁用OpenMP库,MATLAB编码器™将parfor
循环,为
循环。要查找支持的编译万博1manbetx器,请参见万博1manbetx支持的编译器.
为了在您部署生成代码的设备上节省内存,您可以使用kmeans
和pdist2
,分别。使用kmeans
在MATLAB中创建集群并使用pdist2
在生成的代码中将新数据分配给现有集群。对于代码生成,定义一个入口点函数,该函数接受集群质心位置和新的数据集,并返回最近的集群的索引。然后,生成入口点函数的代码。例如,请参见将新数据分配给现有集群并生成C/ c++代码.
从R2020a开始,kmeans
返回整数类型(int32
)索引,而不是双精度索引,以生成独立的C/ c++代码。因此,当您使用单精度输入时,该函数允许更严格的单精度支持。万博1manbetx对于MEX代码生成,该函数仍然返回双精度索引以匹配MATLAB行为。
要并行运行,请指定“选项”
调用此函数时的名称-值参数,并设置“UseParallel”
字段的选项结构真正的
使用statset
.
例如:“选项”,statset (UseParallel,真的)
有关并行计算的更多信息,请参见运行MATLAB函数与自动并行支持万博1manbetx(并行计算工具箱).
该功能完全支持GPU阵列。万博1manbetx有关更多信息,请参见在GPU上运行MATLAB函数(并行计算工具箱).
你点击一个链接对应于这个MATLAB命令:
通过在MATLAB命令窗口中输入命令来运行命令。Web浏览器不支持MATLAB命令。万博1manbetx
您还可以从以下列表中选择网站:
选择中国网站(中文或英文)以获得最佳网站性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。