【问题标题】:K-means in MatlabMatlab中的K均值
【发布时间】:2016-01-21 23:26:57
【问题描述】:

我有一个由矩阵 A=(100x15) 表示的知识库 (KB),我必须将此 KB 聚类为 5 个聚类。

我在 Matlab 中使用了代码:

idx=kmeans(A,5)

我得到了一个结果 idx,其中包含矩阵 A 每一行的簇索引。

现在我有一个新向量 B=(1x15) 一种新条目,我必须从先前获得的聚类开始对这个新向量进行聚类。

当我将新条目 B 添加到 KB 时,我回忆起带有 C 的函数(由 A 和 B 组成)

idx1=kmeans(C,5)

我获得了一个新的 idx1,所有结果都与 idx 不同。

我的范围是了解 B 的集群相对于聚类 KB 获得的集群。

你能帮我吗?

提前致谢。

【问题讨论】:

  • 那你在问什么?您是在问为什么集群会发生变化?
  • 亲爱的 Dan,我知道为什么集群会发生变化,我想知道,如何修复集群以便从 KB 集群开始对未来的条目进行集群。
  • idx 已经告诉你了
  • 好的,谢谢,但现在我有另一个向量(除了 KB),我必须知道它的集群,基于用 KB 获得的前一个集群。
  • 如果您不希望集群发生变化,那么即使您添加了额外的功能,idx 仍然有效

标签: matlab cluster-analysis k-means


【解决方案1】:

听起来您想将新数据点与已识别的集群进行比较。我不确定这会总是 给出您期望的结果,但您可以计算到每个集群 质心 的欧几里得距离并选择最小的。

示例

原始数据,构造成有四个簇:

%// original data
A=[randn(25,1),   randn(25,1);
   randn(25,1)+5, randn(25,1);
   randn(25,1)+5, randn(25,1)+5;
   randn(25,1),   randn(25,1)+5];
plot(A(:,1),A(:,2),'k.');
hold on;

K-means 聚类,K=4 个聚类:

K=4;
[idx,centroids]=kmeans(A,K);
for n=1:K
    plot(A(idx==n,1),A(idx==n,2),'o');
end

请注意,kmeans 的第二个输出返回每个集群的质心坐标。

随机新点:

%// new point:
B=2*randn(1,2);
plot(B(1),B(2),'rx');

新点到所有质心的距离:

dist2cent = sqrt(sum((repmat(B,[K,1])-centroids).^2,2));

最小距离索引:

[~,closest] = min(dist2cent);

plot([centroids(closest,1), B(1)],...
     [centroids(closest,2), B(2)],...
     'r-');

【讨论】:

  • 亲爱的 Geoff,感谢您的建议,我认为这对我的问题非常有用。但主要问题是从与矩阵 A 关联的簇开始了解点 B 的数字簇。我们可以想象将矩阵 A 作为静态矩阵,在 Matlab 函数 [idx centroids]=kmeans(A,4) 之后,我们知道idx 应该是 A 的每个行条目的簇数,现在我有一个新向量 B 我必须知道知道 idx e 质心的 B 的簇,如果 A 的 idx=[1 3 2 1 4 1] 结果与 B 应该是 idx1=[1 3 2 1 4 1 3] 与 B 的“3”簇。我该怎么办?
  • 如果我理解正确,我的解决方案会为您提供您正在寻找的信息。变量closest 是新向量B 的簇号。换句话说,如果idx = [1 3 2 1 4 1] 那么idx1=[1 3 2 1 4 1 closest]
  • 非常棒。我借此机会提出另一个问题。获得了基于 A 的 A 的集群和 B 的集群,现在每次我用 A 和B 固定(因此没有随机数)我怎样才能获得始终相同的集群索引(基本上向量 idx 必须始终保持相同)。?提前致谢
猜你喜欢
  • 2023-03-29
  • 2013-10-10
  • 2012-06-27
  • 2012-07-28
  • 2012-01-28
  • 2013-12-23
  • 2012-06-18
  • 2019-10-14
  • 1970-01-01
相关资源
最近更新 更多