kmeans
k聚类则
语法
描述
例子
训练k——聚类算法
集群的数据使用k-表示聚类,然后绘制聚类区域。
载入费雪的虹膜数据集。用花瓣的长度和宽度作为预测指标。
负载fisheririsX =量(:,3:4);图;情节(X (: 1) X (:, 2),“k *’,“MarkerSize”5);标题“费舍尔的虹膜数据”;包含“花瓣长度(厘米)”;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 (:));%在图形上定义精细网格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“花瓣宽度(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,“距离”,“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》,“重心”,...“位置”,“西北”)标题“集群分配和质心”持有从
您可以通过传递来确定集群的分离程度idx
来轮廓
.
使用并行计算群集数据
聚类大型数据集可能需要时间,特别是如果您使用在线更新(默认设置)。如果您有一个并行计算工具箱™许可证,并且为并行计算设置了选项,那么kmeans
并行运行每个集群任务(或复制)。而且,如果复制
>1,那么并行计算减少收敛时间。
从高斯混合模型随机生成大数据集。
μ= bsxfun (@times(20、30),(1:20)');%高斯混合平均值rn30 = randn(30、30);σ= rn30 ' * rn30;%对称和正定协方差Mdl = gmdistribution(μ、σ);定义高斯混合分布rng (1);%的再现性X =随机(Mdl, 10000);
Mdl
是一个30-dimensionalgmdistribution
模型包含20个组件。X
10000 × 30的数据矩阵是从哪里生成的Mdl
.
指定并行计算的选项。
流= RandStream (“mlfg6331_64”);%随机数流选择= statset (“UseParallel”, 1“UseSubstreams”, 1...“流”、流);
输入参数“mlfg6331_64”
的RandStream
指定使用乘法滞后斐波那契生成器算法。选项
是一个结构数组,其字段指定控制估计的选项。
使用以下方法将数据聚类k——集群。指定有k=数据中的20个集群,并增加迭代次数。通常,目标函数包含局部极小值。指定10个重复以帮助找到较低的局部最小值。
抽搐;启动秒表计时器(sumd idx, C, 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秒。
命令窗口指示有6个工作人员可用。在您的系统中,工作人员的数量可能不同。命令窗口显示迭代次数和每次复制的终端目标函数值。输出参数包含复制9的结果,因为它的总距离和最低。
向现有集群分配新数据并生成C/ c++代码
kmeans
执行k-表示聚类,将数据划分到k集群。当您有一个新的数据集要集群时,您可以通过使用kmeans
.的kmeans
函数支持C/ c++代码生成,可以生成接受训练数据并返回聚类结果的代码,然后将代码部署到设备上。在此工作流中,您必须传递训练数据,这些数据可能相当大。为了节省设备上的内存,可以使用将训练和预测分开kmeans
而且pdist2
,分别。
使用kmeans
在MATLAB®中创建集群并使用pdist2
在生成的代码中为现有集群分配新数据。对于代码生成,定义一个入口点函数,该函数接受聚类质心位置和新数据集,并返回最近的聚类的索引。然后,生成入口点函数的代码。
生成C/ c++代码需要MATLAB®Coder™。
执行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》,“集群3”,聚类质心的)
向现有集群分配新数据
生成一个测试数据集。
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》,“集群3”,聚类质心的,...“数据分类到群集1”,“数据分类到群集2”,...“数据分类到第三组”)
生成代码
生成将新数据分配给现有集群的C代码。注意,生成C/ c++代码需要MATLAB®Coder™。
定义一个名为findNearestCentroid
它接受质心位置和新数据,然后通过使用找到最近的群集pdist2
.
添加% # codegen
编译器指令(或pragma)添加到函数签名后的入口点函数,以表明您打算为MATLAB算法生成代码。添加此指令将指导MATLAB代码分析器帮助您诊断和修复代码生成过程中可能导致错误的违反。
类型findNearestCentroid显示findNearestCentroid.m的内容
function idx = findNearestCentroid(C,X) %#codegen [~,idx] = pdist2(C,X,'euclidean',' minimum ',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_test myIndx myIndex_mex)
verifyMEX =逻辑1
isequal
返回逻辑1 (真正的
),这意味着所有的输入是相等的。这一比较证实了pdist2
函数,findNearestCentroid
函数和MEX函数返回相同的索引。
您还可以使用GPU Coder™生成优化的CUDA®代码。
cfg = coder.gpuConfig (墨西哥人的);codegen配置cfgfindNearestCentroidarg游戏{C, Xtest}
有关代码生成的更多信息,请参见通用代码生成工作流.有关GPU编码器的更多信息,请参见开始使用GPU Coder(GPU编码器)而且支持功能(GPU编码器).
输入参数
X
- - - - - -数据
数字矩阵
数据,指定为数值矩阵。的行X
对应观察结果,列对应变量。
如果X
是数字向量吗kmeans
把它当作n-by-1的数据矩阵,不管它的方向。
该软件将南
年代X
的任何行X
它至少包含一个南
.删除行X
减少样本量。的kmeans
函数返回南
为输出参数中的对应值idx
.
数据类型:单
|双
k
- - - - - -数量的集群
正整数
数据中的集群数,指定为正整数。
数据类型:单
|双
名称-值参数
指定可选参数对为Name1 = Value1,…,以=家
,在那里的名字
参数名称和价值
对应的值。名-值参数必须出现在其他参数之后,但对的顺序并不重要。
在R2021a之前,名称和值之间用逗号隔开,并括起来的名字
在报价。
例子:“距离”、“余弦”,“复制”,10日,“选项”,statset (UseParallel, 1)
指定余弦距离,10
以不同的起始值复制集群,并使用并行计算。
显示
- - - - - -要显示的输出级别
“关闭”
(默认)|“最后一次”
|“通路”
要在命令窗口中显示的输出级别,指定为逗号分隔的对,由“显示”
和以下选项之一:
“最后一次”
—显示最终迭代的结果“通路”
—显示每次迭代的结果“关闭”
——显示什么
例子:“显示”、“最后”
距离
- - - - - -距离度量
“sqeuclidean”
(默认)|“cityblock”
|的余弦
|“相关”
|“汉明”
距离度量,p
-维空间,用于最小化,指定为逗号分隔的对,由“距离”
而且“sqeuclidean”
,“cityblock”
,的余弦
,“相关”
,或“汉明”
.
kmeans
为支持的距离度量以不同的方式计算质心群集。下表总结了可用的距离度量。在公式,x是观察(即一行?X
),c是一个质心(行向量)。
距离度量 | 描述 | 公式 |
---|---|---|
“sqeuclidean” |
欧几里得距离的平方(默认)。每个质心是该簇中各点的均值。 |
|
“cityblock” |
绝对差的和,即l1的距离。每个质心都是该簇中各点的分量中值。 |
|
的余弦 |
1减去点间夹角的余弦(作为向量处理)。每个质心是该簇中点的均值,将这些点归一化为单位欧氏长度。 |
|
“相关” |
1减去点之间的样本相关性(作为值序列处理)。每个质心是该簇中点的分量均值,在定心并将这些点归一化为零均值和单位标准差之后。 |
在哪里
|
“汉明” |
这个度量只适用于二进制数据。 不同的是比特的比例。每个质心是该集群中各个点的分量中值。 |
在哪里我是指标函数。 |
例子:“距离”、“cityblock”
麦克斯特
- - - - - -最大迭代次数
One hundred.
(默认)|正整数
最大迭代次数,指定为逗号分隔的对,由“麦克斯特”
一个正整数。
例子:麦克斯特,1000年
数据类型:双
|单
OnlinePhase
- - - - - -在线更新标志
“关闭”
(默认)|“上”
在线更新标志,指定为逗号分隔的对“OnlinePhase”
而且“关闭”
或“上”
.
如果OnlinePhase
是在
,然后kmeans
除执行批量更新阶段外,还执行在线更新阶段。对于大型数据集,在线阶段可能很耗时,但保证了一个解是距离准则的局部最小值。换句话说,软件找到一个数据分区,其中任何一个点移动到不同的集群都会增加距离的总和。
例子:“OnlinePhase”,“上”
选项
- - - - - -控制最小拟合准则迭代算法的选项
[]
(默认)|返回的结构数组statset
用于控制最小化拟合准则的迭代算法的选项,指定为逗号分隔的对,由“选项”
和返回的结构数组statset
.结构数组的支持字段指定了控制迭代算法的选项。
该表总结了支持的字段。注意,支持的字段需要并行计算工具箱™。
场 | 描述 |
---|---|
“流” |
一个
在本例中,使用与并行池相同大小的单元格数组。如果并行池未打开,则 |
“UseParallel” |
|
“UseSubstreams” |
设置为真正的 并行计算以可重复的方式并行计算默认值是假 .要重复计算,设置流 转换为允许子流的类型:“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聚类则
k - means聚类,即劳埃德算法[2],是一种迭代的数据分区算法n观察到的正好是其中之一k由质心定义的簇,其中k在算法开始之前选择。
算法过程如下:
k——+ +算法
的k——+ +算法使用启发式方法寻找质心种子k——集群。据亚瑟和瓦西里维茨基所说[1],k-means++提高了Lloyd 's算法的运行时间和最终解的质量。
的k-means++算法选择种子如下,假设簇数为k.
从数据集中随机选择一个观测值,X.所选观测点为第一质心,并记为c1.
计算从每个观测点到c1.表示距离cj和观察米作为 .
选择下一个质心,c2随机从X的概率
选择中心j:
计算从每个观测点到每个质心的距离,并将每个观测点分配到其最近的质心。
为米= 1,…,n而且p= 1,…,j- 1、选择质心j随机从X的概率
在哪里Cp是否所有的观察值集都最接近质心cp而且x米属于Cp.
也就是说,选择每个后续的中心,其概率与它到您已经选择的最近的中心的距离成正比。
重复步骤4,直到k选上的重心。
亚瑟和Vassilvitskii[1]通过对几个聚类方向的模拟研究,演示k- mean++比Lloyd的算法更快地收敛到更低的簇内和,点到簇中心距离的平方和。
算法
kmeans
使用两阶段迭代算法最小化点到质心距离的总和,对所有的总和k
集群。第一阶段使用批量更新,其中每次迭代都包括一次将点重新分配到它们最近的聚类质心,然后重新计算聚类质心。这个阶段有时不会收敛到局部极小值解。也就是说,在数据的一个分区中,将任何单个点移动到不同的集群都会增加距离的总和。这更适用于小型数据集。批处理阶段是快速的,但可能只是接近解决方案作为第二阶段的起点。
第二阶段使用在线更新,如果这样做可以减少距离的总和,则会单独重新分配点,并在每次重新分配后重新计算聚类质心。此阶段的每次迭代都包含通过所有点的一次迭代。该相位收敛到局部最小值,尽管可能存在其他具有较低总距离和的局部最小值。一般来说,寻找全局最小值是通过穷尽选择起始点来解决的,但使用多个具有随机起始点的重复通常会得到全局最小值的解。
如果启用
UseParallel
选项选项
而且复制
> 1,然后每个工蚁并行选择种子和集群。
参考文献
[1]亚瑟,大卫,塞尔吉·瓦西里维茨基。《k -means++:谨慎播种的优势》SODA ' 07:第18届离散算法ACM-SIAM年会论文集.2007年,页1027 - 1035。
[2] Lloyd, Stuart P. < PCM中的最小二乘量化>。《IEEE信息论汇刊》.1982年第28卷,第129-137页。
Seber, g.a.f。多变量的观察.霍博肯,新泽西州:约翰·威利父子公司,1984。
[4] Spath, H。聚类解剖与分析:理论,FORTRAN程序,例子.J. Goldschmidt译。纽约:霍尔斯特德出版社,1985年。
扩展功能
高大的数组
使用行数超过内存容量的数组进行计算。
使用注意事项和限制:
支持的语法是:
idx = kmeans (X, k)
[idx C] = kmeans (X, k)
[idx C sumd] = kmeans (X, k)
(___) = kmeans(___、名称、值)
受支持的名-值对参数及其区别是:
“显示”
—默认值为:“通路”
.“麦克斯特”
“选项”
—只支持“TolFun”
创建的结构数组的字段statset
.的默认值。“TolFun”
是1的军医
.的kmeans
函数使用的值“TolFun”
作为点到质心距离的簇内和的终止公差。例如,您可以指定“选项”,statset (e-8 TolFun, 1)
.“复制”
“开始”
——只支持“+”
,“样本”
和一个数字数组。
有关更多信息,请参见用于内存不足数据的高数组.
C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
如果
开始
方法采用随机选取,初始质心聚类位置可能与MATLAB不匹配®.如果行数
X
是固定的,代码生成不删除行吗X
包含一个南
.聚类质心位于
C
可以与MATLAB中的顺序不同。在本例中,集群索引在idx
有相应的差异。如果您提供
显示
,其值必须为“关闭”
.如果您提供
流
,它必须是空的和UseSubstreams
必须假
.当你设置
UseParallel
选项真正的
:为了节省部署生成代码的设备上的内存,可以使用
kmeans
而且pdist2
,分别。使用kmeans
在MATLAB中创建集群并使用pdist2
在生成的代码中为现有集群分配新数据。对于代码生成,定义一个入口点函数,该函数接受聚类质心位置和新数据集,并返回最近的聚类的索引。然后,生成入口点函数的代码。示例请参见向现有集群分配新数据并生成C/ c++代码.从R2020a开始,
kmeans
返回整数类型(int32
)索引,而不是在生成的独立C/ c++代码中使用双精度索引。因此,当您使用单精度输入时,该函数允许更严格的单精度支持。对于MEX代码生成,函数仍然返回双精度指标以匹配MATLAB行为。
自动并行支持
通过使用并行计算工具箱™自动并行运行计算来加速代码。
若要并行运行,请指定“选项”
参数中的名称-值参数,并设置“UseParallel”
选项结构的字段真正的
使用statset
.
例如:“选项”,statset (UseParallel,真的)
有关并行计算的更多信息,请参见运行MATLAB函数与自动并行支持(并行计算工具箱).
GPU数组
通过使用并行计算工具箱™在图形处理单元(GPU)上运行来加速代码。
该功能完全支持GPU阵列。有关更多信息,请参见在图形处理器上运行MATLAB函数(并行计算工具箱).
版本历史
之前介绍过的R2006a
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。