K.聚类则
表演K.聚类则划分观察N-经过-P.数据矩阵idx
= kemans(X
那K.
)X
进入K.
群集,并返回一个N1向量(idx
)包含每个观测值的聚类索引X
对应于点,列对应于变量。
默认情况下,威彻斯
使用平方欧几里德距离度量和K.-means ++算法用于集群中心初始化。
集群的数据使用K.-表示集群,然后绘制集群区域。
加载Fisher的虹膜数据集。使用花瓣长度和宽度作为预测值。
负载fisheririsX =量(:,3:4);图;情节(X (: 1) X (:, 2),“k *’那“MarkerSize”5);标题'fisher'的虹膜数据';包含“花瓣长度(厘米)”;ylabel.“花瓣宽度(厘米)”;
较大的聚类似乎分成了一个低方差区域和一个高方差区域。这可能表明较大的星团是两个重叠的星团。
对数据进行聚类。具体说明K.=3簇。
rng (1);重复性的%[idx C] = kmeans (X, 3);
idx
中预测的聚类指数向量是否与观测值相对应X
。C
是包含最终质心位置的3×2矩阵。
用威彻斯
计算每个质心到网格上各点的距离。为此,请传递质心(C
)和网格上的点威彻斯
并实现算法的一个迭代。
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次迭代中收敛失败。
%将网格中的每个节点分配到最近的质心
威彻斯
显示一个警告,说明算法没有收敛,这是您应该预料到的,因为软件只实现了一个迭代。
绘制集群区域。
图;gscatter (XGrid (: 1) XGrid (:, 2), idx2Region,...[0,0.75,0.75; 0.75,0.75; 0.75,0.75,0],'..');持有在…上;绘图(X(:,1),X(:,2),“k *’那“MarkerSize”5);标题'fisher'的虹膜数据';包含“花瓣长度(厘米)”;ylabel.“花瓣宽度(厘米)”; 传奇(“区域1”那“区域2”那“区域3”那'数据'那“位置”那‘东南’);持有关;
随机生成样本数据。
rng默认的;重复性的%X = [randn(100 2) * 0.75 +(100 2)的;randn(100 2) * 0.5的(100 2)];图;情节(X (: 1) X (:, 2),'。'); 标题随机生成的数据的;
数据中似乎有两组。
将数据分组为两个群集,并选择最佳排列在五种初始化中。显示最终输出。
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》那'质心'那...“位置”那“西北”)头衔“集群分配和质心”持有关
您可以通过传递来确定集群的分离程度idx
来轮廓
。
群集大数据集可能需要时间,特别是如果使用在线更新(默认设置)。如果您有一个并行计算工具箱™许可证,请设置并行计算的选项,然后威彻斯
并行地运行每个集群任务(或复制)。而且,如果复制
> 1,然后并行计算降低收敛时间。
从高斯混合模型随机生成一个大数据集。
mu = bsxfun(@次,那些(20,30),(1:20)');%高斯混合均值rn30 = randn(30、30);σ= rn30 ' * rn30;%对称正定协方差mdl = Gmdistribution(mu,sigma);定义高斯混合分布rng (1);重复性的%x =随机(MDL,10000);
Mdl
是一个30-dimensionalgm分布
模型有20个组件。X
是一个10000 x 30的数据矩阵,由Mdl
。
指定并行计算的选项。
流= RandStream (“mlfg6331_64”);%随机数流选项= statset(“使用并行”,1,“UseSubstreams”,1,...“流”,溪流);
输入参数“mlfg6331_64”
属于RandStream
指定使用乘法滞后的Fibonacci生成器算法。选项
是一个结构数组,其中包含指定用于控制估计的选项的字段。
使用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。重复2194次迭代,距离总和=7.72953e+06。重复9105次迭代,距离总和=7.72064e+06。重复10125次迭代,距离总和=7.72816e+06。重复8次,70次迭代,距离总和=7.72816e+06距离=7.73188e+06。最佳距离总和=7.72064e+06
toc%终止秒表计时器
运行时间为61.915955秒。
命令窗口表示六个工作人员可用。工作人员的数量可能会有所不同。命令窗口显示每个复制的迭代次数和终端目标函数值。输出参数包含复制9的结果,因为它具有最低的距离总和。
威彻斯
表演K.-意味着将数据划分为K.集群。将新数据集设置为群集后,可以使用创建包含现有数据和新数据的新群集威彻斯
。这威彻斯
函数支持C / C金宝app ++代码生成,因此您可以生成接受培训数据并返回群集结果的代码,然后将代码部署到设备。在此工作流程中,您必须通过培训数据,这可以具有相当大的尺寸。要将内存保存在设备上,您可以通过使用分离培训和预测威彻斯
和PDIST2.
, 分别。
用威彻斯
在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];
通过使用将培训数据分为三个集群威彻斯
。
[idx C] = kmeans (X, 3);
绘制集群和集群质心。
图g箭头(x(:,1),x(:,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_检验]=pdist2(C,Xtest,“欧几里得”那“最小”,1);
绘制测试数据并使用测试数据标记idx_test.
利用gscatter
。
gscatter(Xtest(:,1),Xtest(:,2),idx_测试,'BGM'那“哦”)传说(“集群1”那《集群2》那“集群3”那聚类质心的那...“数据分类为第一组”那“数据分类为第二组”那...“数据分类为第3组”)
生成代码
生成C代码,将新数据分配给现有的集群。请注意,生成C/ c++代码需要MATLAB®Coder™。
定义一个名为findnearestcentroid.
接受质心位置和新数据,然后通过使用找到最近的集群PDIST2.
。
添加% # codegen
编译器指令(或Pragma)到函数签名后的入门点函数,表示您打算为Matlab算法生成代码。添加此指令指示MATLAB代码分析仪帮助您诊断和修复在代码生成期间会导致错误的违规。
类型findnearestcentroid.%显示findNearestCentroid.m的内容
函数idx=findNearestCentroid(C,X)%#codegen[~,idx]=pdist2(C,X,'euclidean','minimable',1);%找到最近的质心
注意:如果你点击这个页面右上角的按钮,并在MATLAB®中打开这个示例,那么MATLAB®将打开示例文件夹。这个文件夹包括入口点函数文件。
通过使用生成代码codegen
(MATLAB编码器)。因为C和c++都是静态类型语言,所以必须在编译时确定入口点函数中所有变量的属性。的输入的数据类型和数组大小findnearestcentroid.
,通过使用- args.
选项有关详细信息,请参阅为代码生成指定可变大小参数。
codegenfindnearestcentroid.- args.{C, Xtest}
代码生成成功。
codegen
生成MEX函数findNearestCentroid_mex
具有平台依赖的扩展。
验证生成的代码。
myIndx = findNearestCentroid (C, Xtest);myIndex_mex = findNearestCentroid_mex (C, Xtest);verifyMEX = isequal (idx_test myIndx myIndex_mex)
验证ex =.逻辑1
是平等的
返回逻辑1(真的
),这意味着所有的输入都是相等的。比较证实了PDIST2.
函数,findnearestcentroid.
函数和MEX函数返回相同的索引。
您还可以使用GPU编码器生成优化的CUDA®代码™.
cfg = coder.gpuconfig('mex');codegen-配置CFG.findnearestcentroid.- args.{C, Xtest}
有关代码生成的详细信息,请参见通用代码生成工作流。有关GPU编码器的更多信息,请参见开始使用GPU编码器(GPU编码器)和金宝app支持功能(GPU编码器)。
X
-数据数据,指定为数字矩阵。的行X
对应观察值,列对应变量。
如果X
是一个数字矢量,然后威彻斯
将其视为N-1-1数据矩阵,无论其方向如何。
软件处理南
in.X
作为缺少数据并删除任何行X
其中包含至少一个南
。去除行X
减少样本大小。这威彻斯
函数返回南
对于输出参数中的相应值idx
。
数据类型:单一的
|双倍的
K.
-簇数量数据中的集群数量,指定为正整数。
数据类型:单一的
|双倍的
指定可选的逗号分离对名称,价值
参数。的名字
是参数名和价值
是对应的值。的名字
必须出现在引号内。您可以按任意顺序指定多个名称和值对参数,如下所示:Name1, Value1,…,的家
。
'距离','余弦','复制',10,'选项',statset('deverpecallellel',1)
指定余弦距离,10
以不同的起始值复制集群,并使用并行计算。
“显示”
-要显示的输出水平“关闭”
(默认)|“最后一次”
|'iter'
在命令窗口中显示的输出级别,指定为逗号分隔对组成“显示”
以及以下选项之一:
“最后一次”
—显示最后一次迭代的结果
'iter'
—显示每次迭代的结果
“关闭”
——显示什么
例子:“显示”、“最后”
“距离”
-距离度量“sqeuclidean”
(默认)|“cityblock”
|'余弦'
|“相关”
|“哈明”
距离度量,P.
用于最小化的实数空间,指定为逗号分隔的配对组成“距离”
和“sqeuclidean”
那“cityblock”
那'余弦'
那“相关”
或“哈明”
。
威彻斯
为支持的距离度量计算不同的质心簇。此表总结了可用的距离度量。在公式中,金宝appX是一种观察(即一排X
) 和C为质心(行向量)。
距离度量 | 描述 | 公式 |
---|---|---|
“sqeuclidean” |
欧几里得距离的平方(默认)。每个质心都是该簇中各点的均值。 |
|
“cityblock” |
绝对差的和,即L.1距离。每个质心都是该簇中各点的分量中值。 |
|
'余弦' |
一减去点之间夹角的余弦(视为向量)。每个质心是将这些点归一化为单位欧几里德长度后该簇中点的平均值。 |
|
“相关” |
一个减去点之间的样本相关性(作为值序列)之间的样本相关性。每个质心是该集群中的点的组成均值平均值,以后居中并将这些指向标准化为零平均值和单位标准偏差。 |
在哪里
|
“哈明” |
此度量标准仅适用于二进制数据。 它是不同的比例的比例。每个质心都是该群集中的分量中位数。 |
在哪里一世是指示器功能。 |
例子:“距离”、“cityblock”
“麦克斯特”
-最大迭代次数100
(默认)|正整数指定为逗号分隔对的最大迭代次数“麦克斯特”
和一个正整数。
例子:“MaxIter”,1000
数据类型:双倍的
|单一的
“OnlinePhase”
-在线更新标志“关闭”
(默认)|'在'
联机更新标志,指定为逗号分隔对,由“OnlinePhase”
和“关闭”
或'在'
。
如果在线
是在…上
那么威彻斯
除了批量更新阶段,还执行在线更新阶段。在线阶段可以对大数据集耗时,但保证是距离标准的局部最小值的解决方案。换句话说,该软件发现数据的分区,其中将任何单点移动到不同的簇增加了总距离和。
例子:'在线','开'
“选项”
-为最小化拟合准则而控制迭代算法的选项[]
(默认)|返回的结构数组实例化
用于控制用于最小化拟合标准的迭代算法的选项,指定为逗号分隔对,由“选项”
和返回的结构阵列实例化
。金宝app支持的结构阵列的字段指定用于控制迭代算法的选项。
此表总结了支持的字段。金宝app请注意,支持的字段需要并行计金宝app算工具箱™。
领域 | 描述 |
---|---|
“流” |
一种
在这种情况下,请使用与并行池大小相同的单元格数组 |
“使用并行” |
|
“UseSubstreams” |
设置真的 并行计算以可复制的方式并行计算默认值是假的 。若要重复计算,请设置溪流 到允许子流的类型:“mlfg6331_64” 或“mrg32k3a” 。 |
要确保更可预测的结果,请使用parpool.
(并行计算工具箱)并在调用之前显式创建并行池威彻斯
和设置'选项',statset('deverpecallellel',1)
。
例子:'选项',statset('deverpecallellel',1)
数据类型:塑造
“复制”
-使用新的初始群集质心位置重复群集的次数1
(默认)|正整数使用新的初始簇质心位置重复聚类的次数,指定为逗号分隔的对组成“复制”
和一个整数。威彻斯
用最低的返回解决方案sum
。
你可以设置“复制”
隐式地提供一个3-D数组作为'开始'
名称值对参数。
例子:“复制”,5
数据类型:双倍的
|单一的
'开始'
-群集初始质心位置的选择方法“+”
(默认)|“集群”
|“样本”
|“统一”
|数字矩阵|数字数组选择初始群集质心位置的方法(或种子),指定为逗号分隔对,由'开始'
和“集群”
那“+”
那“样本”
那“统一”
,数值矩阵或数值数组。此表总结了用于选择种子的可用选项。
价值 | 描述 |
---|---|
“集群” |
对随机的10%子样本执行初步聚类阶段 如果随机10%子样本中的观察数小于 |
“+” (默认) |
选择K. 通过实施K.-means ++算法用于集群中心初始化。 |
“样本” |
选择K. 观察从X 随意的。 |
“统一” |
选择K. 在以下范围内均匀随机点:X 。对汉明距离无效。 |
数字矩阵 | K. -经过-P.质心起始位置的矩阵开始 对应于种子。软件推断K. 从第一维度开始 ,这样你就可以通过了[] 对于K. 。 |
数字数组 | K. -经过-P.-经过-R.质心起始位置数组。每个页面的行对应于种子。第三个维度调用群集例程的复制。页j包含用于复制的一组种子j。该软件推断复制的数量(由“复制” 名称-值对参数)从第三维的大小。 |
例子:“开始”,“样本”
数据类型:char
|字符串
|双倍的
|单一的
idx
-聚类指数群集指数,作为数字列向量返回。idx
行数与行数相同X
,每一行表示相应观测的聚类分配。
C
- 集群质心位置群集质心位置,作为数字矩阵返回。C
是一个K.
-经过-P.矩阵,其中行j是簇的质心j。
k-均值聚类,或劳埃德算法[2],是一种迭代的数据分区算法N观察结果正好是K.由质心定义的簇,其中K.在算法开始之前选择。
算法继续如下:
选择K.初始集群中心(封面).例如,选择K.随机观察(通过使用“开始”,“样本”
)或者使用K.-means++算法用于群集中心初始化(默认值)。
计算所有观测到每个质心的点到簇质心的距离。
有两种方法可以继续(由在线
):
批量更新-将每个观测值分配给具有最近质心的簇。
在线更新-如果重新分配减少了簇内、平方和点到簇质心距离之和,则单独将观测值分配到不同的质心。
有关更多详细信息,请参阅算法。
计算每个集群中观测值的平均值来获得K.新的质心位置。
重复步骤2到步骤4,直到集群分配没有改变,或者达到最大的迭代次数。
这K.-means ++算法使用一个启发式方法来查找种子的质心K.- eans集群。根据Arthur和Vassilvitskii的说法[1]那K.-means++提高了Lloyd算法的运行时间和最终解的质量。
这K.-means++算法选择种子如下,假设集群数量为K.。
从数据集中均匀随机选取一个观测值,X.所选观测值为第一个质心,并表示为C1。
从每次观察到的距离C1。表示之间的距离Cj和观察m作为 。
选择下一个质心,C2随意从X的概率
选择中心j:
计算每个观测点到每个质心的距离,并将每个观测点指定给其最近的质心。
对于m= 1,…,N和P.= 1,…,j- 1,选择质心j随意从X的概率
在哪里CP.所有观测值的集合是否最接近质心CP.和Xm属于CP.。
也就是说,选择每个后续中心的概率与自中心到已选择的最近中心的距离成比例。
重复步骤4直到K.选择质心。
Arthur和Vassilvitskii.[1]通过对几个集群方向的模拟研究来证明K.-means++实现更快的收敛到一个更低的簇内,平方和点到簇心的距离比Lloyd的算法。
威彻斯
采用两阶段迭代算法最小化点到质心距离的和,求和K.
集群。
第一阶段使用批量更新,每次迭代包括将点全部重新分配到它们最近的簇心,然后重新计算簇心。这个阶段有时不收敛于局部最小解。也就是说,在数据的分区中,将任何一个点移动到不同的集群中,都会增加距离的总和。这对于小数据集来说更有可能。批处理阶段是快速的,但可能只近似于作为第二阶段起点的解决方案。
第二阶段使用在线更新如果执行此操作,则单独重新分配点,从而减少距离之和,并且在每个重新分配后重新计算群集质心。在此阶段的每次迭代都是由所有点传递的。该阶段会聚到局部最小值,尽管可能存在其他局部最小值,但距离较低。通常,通过详尽的起点选择来解决全局最小值,但是使用随机起点的几个复制通常会导致作为全局最小的解决方案。
如果复制
=R.> 1,开始
是加
(默认值),然后软件选择R.根据的可能不同的种子K.-means ++算法。
如果您启用使用并行
选项选项
和复制
>1,然后每个辅助进程并行选择种子和簇。
[1] Arthur,David和Sergi Vassilvitskii.“K-means++:小心播种的优势。”SODA'07:第十八届ACM-SIAM年度离散算法研讨会论文集。2007年,页1027 - 1035。
[2] 《PCM中的最小二乘量化》IEEE信息论学报。1982年第28卷,129-137页。
g.a. F. Seber多变量的观察。John Wiley & Sons, Inc., 1984。
[4] Spath, H。聚类解剖和分析:理论,Fortran计划,例子。由J. Goldschmidt翻译。纽约:Halsted Press,1985年。
使用说明和限制:
金宝app支持的语法是:
idx = kmeans (X, k)
[idx,C]=kmeans(X,k)
[idx C sumd] = kmeans (X, k)
(___) = kmeans(___、名称、值)
金宝app受支持的名称-值对参数及其区别如下:
“显示”
- 默认值是'iter'
。
“麦克斯特”
“选项”
—仅金宝app支持“TolFun”
创建的结构数组的字段实例化
。默认值“TolFun”
是1的军医
。这威彻斯
函数使用的值“TolFun”
为点到质心距离的簇内和的终止容差。例如,可以指定“选项”,statset('TolFun',1e-8)
。
“复制”
'开始'
-仅金宝app支持“+”
那“样本”
和数字阵列。
有关更多信息,请参阅用于内存不足数据的高数组。
使用说明和限制:
如果开始
方法采用随机选择,初始质心簇位置可能与MATLAB不匹配®。
如果行数X
是固定的,代码生成不会删除X
包含A.南
。
集群质心位置C
可以比matlab有不同的顺序。在这种情况下,集群指数idx
有相应的差异。
如果您提供显示
,其值必须为“关闭”
。
如果您提供溪流
,它必须是空的Userumstreams.
必须是假的
。
当你设置使用并行
选择真的
:
有些计算可以并行执行,即使复制
是1
。对于大数据集,当复制
是1
,考虑设置使用并行
选择真的
。
威彻斯
用途议案
(MATLAB编码器)创建在受支持的共享内存多核平台上并行运行的循环。金宝app并行运行的循环可能比在单个线程上运行的循环更快。如果您的编译器不支持开放多处理(OpenMP)应用程金宝app序接口或禁用OpenMP库,MATLAB编码器™对待议案
-循环作为对于
-要查找支持的编译器,请参阅金宝app金宝app支持编译器。
要在部署生成代码的设备上保存内存,可以通过使用分离培训和预测威彻斯
和PDIST2.
, 分别。用威彻斯
在MATLAB中创建集群并使用PDIST2.
在生成的代码中,将新数据分配给现有集群。对于代码生成,定义一个入口点函数,该函数接受簇质心位置和新数据集,并返回最近簇的索引。然后,为入口点函数生成代码。例如,看到将新数据分配给现有集群并生成C/C++代码。
从R2020a开始,威彻斯
返回整数类型(INT32.
)在生成的独立C/C++代码中使用索引,而不是双精度索引。因此,当您使用单精度输入时,该功能允许更严格的单精度支持。对于MEX代码生成,该函数仍然返回双精度索引以匹配MATLAB行为。金宝app
要并行运行,请指定“选项”
命名此函数调用中的值参数,并设置“使用并行”
要删除的选项结构的字段真的
使用实例化
。
例如:'选项',statset('deverypallellel',true)
有关并行计算的更多信息,请参阅使用自动并行支持运行MATLAB函数金宝app(并行计算工具箱)。
此功能完全支持GPU阵列。金宝app有关更多信息,请参阅在GPU上运行matlab函数(并行计算工具箱)。
您单击了与此MATLAB命令对应的链接:
在MATLAB命令窗口中输入它来运行命令。Web浏览器不支持MATLAB命令。金宝app
你也可以从以下列表中选择一个网站:
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家/地区站点不适合您所在位置的访问。