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),“。”);标题随机生成的数据的;
似乎有两个集群数据。
数据分割成两个集群,选择最好的安排5初始化。显示最终的输出。
选择= 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
是由- 30 10000 -矩阵的生成的数据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工人。复制72个迭代,总额= 7.73161 e + 06年的距离。复制64个迭代,总额= 7.72988 e + 06年的距离。复制68迭代,总额= 7.72576 e + 06年的距离。复制84迭代,总额= 7.72696 e + 06年的距离。复制82个迭代,总额= 7.73006 e + 06年的距离。复制7,40迭代,总额的距离= 7.73451 e + 06。复制194个迭代,总额= 7.72953 e + 06年的距离。复制105迭代,总额= 7.72064 e + 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®编码器™。
执行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》,…集群的数据分类3 ')
生成代码
生成C代码,将新数据赋给现有的集群。注意,生成C / c++代码需要MATLAB®编码器™。
定义一个入口点函数命名findNearestCentroid
接受质心位置和新数据,然后找到最近的集群使用pdist2
。
添加% # codegen
编译器指令(或编译指示)的入口点函数函数签名后,表明您打算为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
生成墨西哥人的功能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
功能,墨西哥人返回相同的指数函数。
你还可以生成优化的CUDA®代码使用GPU编码器™。
cfg = coder.gpuConfig (墨西哥人的);codegen配置cfgfindNearestCentroidarg游戏{C, Xtest}
代码生成的更多信息,请参阅通用代码生成工作流。GPU编码器的更多信息,请参阅开始使用GPU编码器(GPU编码器)和金宝app支持功能(GPU编码器)。
X
- - - - - -数据数据,指定为一个数字矩阵。的行X
对应于观测,列对应的变量。
如果X
是一个数值向量,然后呢kmeans
把它作为一个n1数据矩阵,无论其取向。
该软件将南
年代X
缺失的数据和删除任何行X
包含至少一个南
。删除行X
减少了样本容量。的kmeans
函数返回南
对应值的输出参数idx
。
数据类型:单
|双
k
- - - - - -数量的集群集群的数量数据,指定为一个正整数。
数据类型:单
|双
指定可选的逗号分隔条名称,值
参数。的名字
参数名称和吗价值
相应的价值。的名字
必须出现在引号。您可以指定几个名称和值对参数在任何顺序Name1, Value1,…,的家
。
“距离”、“余弦”,“复制”,10日,“选项”,statset (UseParallel, 1)
指定了余弦距离,10
在不同的起始值集群复制,使用并行计算。
显示
- - - - - -要显示产出水平“关闭”
(默认)|“最后一次”
|“通路”
产出水平显示在命令窗口中,指定为逗号分隔组成的“显示”
下列选项之一:
“最后一次”
——显示最后一个迭代的结果
“通路”
:显示每个迭代的结果
“关闭”
——显示什么
例子:“显示”、“最后”
距离
- - - - - -距离度量“sqeuclidean”
(默认)|“cityblock”
|的余弦
|“相关”
|“汉明”
距离度量,p
维空间,用于最小化,指定为逗号分隔组成的“距离”
和“sqeuclidean”
,“cityblock”
,的余弦
,“相关”
,或“汉明”
。
kmeans
计算质心集群支持的不同距离度量。金宝app这个表总结了可用的距离度量。在公式,x是一个观察(即一行吗X
),c是一个重心(一个行向量)。
距离度量 | 描述 | 公式 |
---|---|---|
“sqeuclidean” |
平方欧氏距离(默认)。每个质心点的均值,集群。 |
|
“cityblock” |
的绝对差异,即。,l1的距离。每个重心点,集群的特定组件的值。 |
|
的余弦 |
1 -之间的夹角的余弦值点(视为向量)。每个重心是集群的均值点,这些点正常化后欧几里得长度单位。 |
|
“相关” |
1 -样本点之间的相关性(作为序列的值)。每个质心点的特定组件的意思是集群,定心和正常化后这些点为零均值和标准偏差单元。 |
在哪里
|
“汉明” |
这个指标只适用于二进制数据。 这是部分的比例是不同的。每个质心点在集群的特定组件的值。 |
在哪里我指标函数。 |
例子:“距离”、“cityblock”
麦克斯特
- - - - - -最大迭代次数One hundred.
(默认)|正整数最大迭代次数,指定为逗号分隔组成的“麦克斯特”
和一个正整数。
例子:麦克斯特,1000年
数据类型:双
|单
OnlinePhase
- - - - - -在线更新标志“关闭”
(默认)|“上”
在线更新标志,指定为逗号分隔组成的“OnlinePhase”
和“关闭”
或“上”
。
如果OnlinePhase
是在
,然后kmeans
执行一个在线更新阶段除了批量更新阶段。在线阶段可以为大型数据集耗费时间,但保证解决方案,它是一个局部最小值的距离标准。换句话说,软件发现一个分区的数据,任何单点移动到另一个集群增加距离的总和。
例子:“OnlinePhase”,“上”
选项
- - - - - -选择控制迭代算法最小化拟合标准[]
(默认)|结构数组返回statset
选项控制迭代算法最小化拟合标准,指定为逗号分隔组成的“选项”
和一个结构数组返回statset
。金宝app支持结构数组中指定的字段选项控制迭代算法。
这个表总结了支持字段。金宝app注意,字段需要并行计算工具箱金宝app™的支持。
场 | 描述 |
---|---|
“流” |
一个
在这种情况下,使用一个单元阵列大小相同的平行池。如果不开放、平行池 |
“UseParallel” |
|
“UseSubstreams” |
设置为真正的 以可再生的方式并行计算。默认值是假 。计算重复性良好流 一种允许substreams:“mlfg6331_64” 或“mrg32k3a” 。 |
为了确保更可预测的结果,使用parpool
(并行计算工具箱)和显式地创建一个并行调用前池kmeans
和设置“选项”,statset (UseParallel, 1)
。
例子:“选项”,statset (UseParallel, 1)
数据类型:结构体
复制
- - - - - -多次重复使用新的初始聚类质心位置聚类1
(默认)|正整数集群多次重复使用新的初始聚类质心位置,指定为逗号分隔组成的“复制”
和一个整数。kmeans
返回最低的解决方案sumd
。
你可以设置“复制”
隐式地通过提供一个三维数组的值“开始”
名称-值对的论点。
例子:“复制”,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——集群。亚瑟和Vassilvitskii[1],k——+ +提高劳埃德算法的运行时间,并最终解决方案的质量。
的k——+ +算法选择种子,如下所示,假设集群的数量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——+ +实现更快的收敛到一个较低的within-cluster之和,平方和point-to-cluster-centroid距离比劳埃德算法。
kmeans
使用一个两阶段迭代算法来最小化point-to-centroid距离的总和,求和k
集群。
这第一阶段使用批量更新每次迭代,包括重新分配点最近的聚类质心,一下子,紧随其后的是重新计算的集群重心。这个阶段有时不收敛到解决方案,是一个局部最小值。即一个分区的数据,任何单点移动到另一个集群增加距离的总和。这是更有可能对小数据集。批处理阶段是快,但可能只有接近解决方案作为第二阶段的起点。
这个第二阶段使用在线更新,点分别重新分配如果这样做减少了距离的总和,和集群重心后重新计算每个重新分配。每次迭代在此阶段由一个通过所有的点。这一阶段收敛于一个局部最小值,尽管可能有其他局部最小值总额较低的距离。一般来说,找到全局最小值由一个详尽的解决选择起点,但使用几个复制随机起点通常导致一个解决方案,是全球最低。
如果你使UseParallel
选项选项
和复制
> 1,那么每个工人选择种子和并行集群。
[1]阿瑟,大卫,以及塞尔吉Vassilvitskii。“k - means + +:小心播种的优势。”苏打水' 07:《十八年ACM-SIAM研讨会上离散算法。2007年,页1027 - 1035。
[2]劳埃德,斯图亚特·p·“最小二乘在PCM量化。”IEEE信息理论。28卷,1982年,页129 - 137。
[3]seb, g·a·F。多变量的观察。新泽西州霍博肯:约翰·威利& Sons Inc ., 1984年。
[4]Spath, H。集群解剖和分析:理论,FORTRAN程序,例子。由j . Goldschmidt翻译。纽约:霍尔斯特德出版社,1985年。
使用笔记和限制:
金宝app支持的语法是:
idx = kmeans (X, k)
[idx C] = kmeans (X, k)
[idx C sumd] = kmeans (X, k)
(___)= kmeans(___、名称、值)
金宝app名称-值对的论据支持,任何差异,有:
“显示”
默认值是“通路”
。
“麦克斯特”
“选项”
——金宝app只支持“TolFun”
字段的结构数组创建的statset
。的默认值“TolFun”
是1的军医
。的kmeans
函数使用的价值“TolFun”
作为within-cluster终止宽容的point-to-centroid距离。例如,您可以指定“选项”,statset (e-8 TolFun, 1)
。
“复制”
“开始”
——金宝app只支持“+”
,“样本”
和一个数字数组。
有关更多信息,请参见高内存不足数据数组。
使用笔记和限制:
如果开始
方法使用随机选择,MATLAB集群初始质心位置可能不匹配®。
如果中的行数X
是固定的,代码生成不删除的行吗X
包含一个南
。
在集群的质心位置C
比MATLAB可以有一个不同的顺序。在这种情况下,集群指数idx
有相应的差异。
如果您提供显示
,其值必须“关闭”
。
如果您提供流
,它必须是空的UseSubstreams
必须假
。
当你设置UseParallel
选项真正的
:
有些即使并行计算可以执行复制
是1
。对于大型的数据集,当复制
是1
,可以考虑设置UseParallel
选项真正的
。
kmeans
使用parfor
(MATLAB编码器)创建循环,支持共享内存多核平台上并行运行。金宝app循环可以并行运行速度比循环运行在单独的线程中。如果你的编译器不支持开放的多处理(OpenMP)应用金宝app程序接口或禁用OpenMP库,MATLAB编码器™将parfor
循环,为
循环。找到支持的编译器金宝app,看看金宝app支持编译器。
为了节省内存的设备部署生成的代码,您可以通过使用单独的训练和预测kmeans
和pdist2
,分别。使用kmeans
在MATLAB中创建集群和使用pdist2
在生成的代码将新数据分配给现有的集群。代码生成,定义一个入口点函数接受集群质心位置和新的数据集,并返回该指数最近的集群。然后,生成代码的入口点函数。例如,看到的将新数据分配给现有的集群和生成C / c++代码。
从R2020a开始,kmeans
返回整数类型(int32
)指标,而不是双精度指标,在独立的C / c++代码生成。因此,更严格的单精度的函数允许支持当你使用单精确输入。金宝app墨西哥人的代码生成的函数仍然返回双精度指标与MATLAB的行为。
并行运行,指定“选项”
名称-值参数在调用这个函数,设置“UseParallel”
选择结构领域真正的
使用statset
。
例如:“选项”,statset (UseParallel,真的)
关于并行计算的更多信息,请参阅MATLAB函数自动并行支持运行金宝app(并行计算工具箱)。
这个函数完全支持GPU数组。金宝app有关更多信息,请参见运行在GPU MATLAB函数(并行计算工具箱)。
链接
|clusterdata
|轮廓
|parpool
(并行计算工具箱)|statset
|gmdistribution
|kmedoids
如果dispone di una versione modificata di questo esempio。Desideri aprire questo esempio con le modifiche星期二吗?
海脂肪clic苏联合国collegamento切corrisponde questo第一MATLAB:
Esegui il第一inserendolo所以nella隙缝di第一MATLAB。我浏览器web非supportano金宝app comandi MATLAB。
你也可以从下面的列表中选择一个网站:
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。