首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何理解Matlab中的函数"kmeans"?

如何理解Matlab中的函数"kmeans"?
EN

Stack Overflow用户
提问于 2015-08-05 22:50:34
回答 2查看 1.7K关注 0票数 1

假设我有一个矩阵A,它的大小是2000*1000 double。然后将Matlab在函数"kmeans"中的构建应用于矩阵A

代码语言:javascript
运行
复制
k = 8;
[idx,C] = kmeans(A, k, 'Distance', 'cosine');

我得到C = 8*1000 doubleidx = 2000*1 double,值从1到8;根据文档,C返回k-by-p (8 by 1000)矩阵中的k个集群质心位置。idx返回一个包含每个观测结果的集群索引的n-by-1 vector。我的问题是:

1)我不知道如何理解C,质心的位置。地点应该表示为(x,y),对吗?如何正确理解矩阵C

( 2)最终的中心c1, c2,...,ck是什么?它们只是价值还是地点?

3)对于每个簇,如果我只想得到离这个簇中心最近的向量,如何计算和得到它?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-06 00:04:04

在回答这三部分之前,我将只解释MATLAB对k-均值(http://www.mathworks.com/help/stats/kmeans.html)的解释中使用的语法。

  • A是您的数据矩阵(它在链接中表示为X )。有n行(在本例中是2000),它们表示您拥有的观察/数据点的数量。还有p列(在本例中是1000),它们表示每个数据点所具有的“特性”的数量。例如,如果数据由2D点组成,那么p将等于2。
  • k是要将数据分组到的集群数量。根据您给出的C的维度,k必须是8。

现在我将回答以下三部分:

  1. C矩阵具有维数k x p。每一行代表一个质心。质心位置根本不必是(x,y)。质心位置的尺寸等于p。换句话说,如果你有2D点,你可以把质心画成(x,y)。如果你有3D点,你可以把质心画成(x,y,z)。因为A中的每个数据点都有1000个特性,所以质心有1000个维度。
  2. 这在不知道你的数据是什么的情况下是很难解释的。质心当然不仅仅是价值观,它们也不一定是地点。如果您的数据A是坐标点,您当然可以将质心表示为位置。然而,我们可以更广泛地看待这一问题。如果您有一个集群质心i和与该质心一起分组的数据点v,则质心表示与其集群中的数据点最相似的数据点。希望这是有意义的,如果有必要的话,我可以给出更清楚的解释。
  3. K均值方法实际上给了我们一个很好的方法来实现这一点。这个函数实际上有4个可能的输出,但我会把重点放在第四个,我称之为Didx,C,sumd,D= kmeans(A,k,‘距离’,‘余弦’); D具有维数n x k。对于数据点iD矩阵中的行i给出了从该点到每个质心的距离。因此,对于每个质心,您只需找到与其最接近的数据点,并返回相应的数据点。如果你需要的话,我可以提供简短的代码。

还有,只是个提示。您可能应该使用kmeans++方法初始化质心。它更快,也更好。您可以这样称呼它:

代码语言:javascript
运行
复制
[idx,C,sumd,D] = kmeans(A, k, 'Distance', 'cosine', 'Start', 'plus');

编辑:

以下是第3部分所需的代码:

代码语言:javascript
运行
复制
[~, min_idxs] = min(D, [], 1);
closest_vecs = A(min_idxs, :);

每一行i of closest_vecs都是最接近质心i的向量。

票数 2
EN

Stack Overflow用户

发布于 2015-08-05 23:54:50

好的,在我们讨论细节之前,让我们先简要介绍一下什么是K-的聚类。

-means clustering的工作方式是,对于您拥有的某些数据,您希望将它们分组为k组。您最初在数据中选择k个随机点,这些点将具有来自1,2,...,k的标签。这就是我们所称的质心。然后,确定其余数据与这些点中的每一点有多近。然后对这些点进行分组,以便无论哪一个点最接近这些k点,都可以将这些点分配给属于该特定组(1,2,...,k)的点。然后,对于每个组的所有点,更新质心,它实际上被定义为每个组的代表点。对于每个组,计算每个k组中所有点的平均值。它们成为下一次迭代的新的质心。在下一次迭代中,确定数据中的每个点与每个质心的距离有多近。你不断地重复这个行为,直到质心不再移动,或者它们很少移动。

在MATLAB中使用kmeans函数的方法是,假设您有一个数据矩阵(在您的示例中是A),那么每一行都是一个样本,每一列都是一个样本的特征/维度。例如,我们可以在2D或3D中使用笛卡尔坐标的N x 2N x 3数组。在彩色图像中,我们可以使用N x 3阵列,其中每一列都是图像中的颜色分量--红色、绿色或蓝色。

在MATLAB中调用kmeans的方式如下:

代码语言:javascript
运行
复制
[IDX, C] = kmeans(X, K);

X是我们讨论过的数据矩阵,K是您希望看到的集群/组的总数,输出IDXC分别是索引质心矩阵。IDX是一个N x 1数组,其中N是输入函数的样本总数。IDX中的每个值都告诉您,哪个质心X中的样本/行最匹配。您还可以覆盖用于度量点之间距离的距离度量。默认情况下,这是欧几里德距离,但您在调用中使用了余弦距离。

CK行,其中每一行都是质心。因此,对于笛卡尔坐标的情况,这将是一个K x 2K x 3数组。因此,您可以将IDX解释为在计算k-方法时告诉哪个组/质心点是最接近的。因此,如果我们得到一个点的IDX=1值,这意味着这个点与第一个质心(也就是C的第一行)最匹配。类似地,如果我们得到一个点的IDX=1值,这意味着这个点与第三个质心(也就是C的第三行)最匹配。

现在回答你的问题:

  1. 我们刚才谈到了CIDX,所以这一点应该很清楚。
  2. 最后的中心存储在C中。每一行都会给出一个代表一个组的质心/中心。
  3. 听起来,除了实际的质心本身之外,您还想找到数据中每个集群最接近的点。如果使用knnsearch,通过提供一组点来执行K-最近邻搜索,并且它在数据中输出接近查询点的K最近点,那么这是很容易做到的。因此,您提供集群作为输入,数据作为输出,然后使用K=2并跳过第一点。第一个点的距离为0,因为这将等于质心本身,第二个点将给出离集群最近的点。 假设您已经运行了kmeans,您可以这样做: out = knnsearch(A,C,'k',2);out = out(:,2); 运行knnsearch,然后抛出最接近的点,因为它的距离实质上是0。第二列是您所追求的,它给出了离集群最近的点(不包括实际的质心)。out将给出数据矩阵A中与每个质心最近的点。要获得实际积分,请执行以下操作: pts = A(out,:);

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31844108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档