输入中具有自定义距离矩阵的k-means实现


14

谁能指出我可以在输入中采用距离矩阵的k均值实现(如果在matlab中会更好)?标准的MATLAB实施需要输入中的观察矩阵,并且无法自定义更改相似性度量。


2
您可以尝试生成与您的欧几里得距离矩阵相对应的原始数据,并将其输入到K-Means中。另一种简单的方法可能是使用矩阵的层次聚类的Ward方法:K-Means和Ward在集群概念上有着相似的意识形态。
ttnphns 2011年


不是Matlab,但是python的页面可以使用scikits-learn-k-means指定自己的距离函数,可以使用scipy.spatial中20多种度量中的任何一种。距离。
denis

Answers:


13

由于k-手段需要能够找到办法要群集点的不同子集,它并没有真正意义的问一个版本的K-意味着需要一个距离矩阵作为输入。

您可以尝试使用k型医学。有一些可用的matlab实现


1
嗨,谢谢你的回答;而不是直接给出距离矩阵,有可能给出自定义距离度量作为输入吗?关键是我必须比较两种聚类方法,并且由于在第二种方法中使用了自定义相似性矩阵,因此我想对kmeans使用相同的方法,以便进行公平的比较。
Eugenio

2
ELKI允许您对k均值使用任意距离函数。请注意,该算法可能随后无法收敛。K-means实际上为平方欧几里德距离(平方和)设计的。在其他距离的情况下,均值可能不再优化,并且繁荣,该算法最终将不会收敛。认真地考虑使用k-medoids。实际上,编写它的目的是允许将k均值想法与任意距离一起使用。
已退出-Anony-Mousse 2013年

还有一个pyclustering的python / C ++库,可让您提供自定义指标功能:github.com/annoviko/pyclustering/issues/417
CpILL

8

您可以将距离矩阵转换为原始数据,并将其输入到K-Means聚类中。步骤如下:

1)您的N个点之间的距离必须是平方欧几里得。对矩阵执行“ 双重居中 ”:从每个元素中减去行均值;结果,减去每个元素的列均值;在结果中,将矩阵均值添加到每个元素;除以负2。您现在拥有的矩阵是点之间的SSCP(平方和和积),其中原点位于N个点的云的几何中心。(在此处阅读有关双重居中的说明。)

2)在该矩阵上执行PCA(主成分分析),并获得NxN成分加载矩阵。它的最后几列可能全为0,因此请切掉它们。您现在所剩下的实际上是主要成分分数,即您的N点在作为云轴通过的主要成分上的坐标。可以将该数据视为适合K均值输入的原始数据。

PS:如果距离不是几何上正确的平方欧氏距离,则可能会遇到问题:SSCP矩阵可能不是正的(半)定的。该问题可以通过几种方法来解决,但要降低精度。


感谢您的回答!实际上,我没有真实的距离矩阵,但是对象之间具有相似性矩阵(0 ... 1),并且相似度不是使用欧几里得距离精确计算得出的,而是使用考虑原始数据但不考虑原始数据的自定义算法来计算的标准方式。我想在这种情况下我无法执行您的程序,对吗?
Eugenio

将相似度转换为距离后,您仍然可以。后者可能不是真正的欧几里得(因此SSCP将具有一些负特征值);然后尝试向距离添加一个小的常数,直到SSCP取负。艾格 还存在其他方法来解决该问题。并且请记住,您将平方距离的中心矩阵加倍。
ttnphns 2011年

PS,顺便说一句。如果您的矩阵具有相似性,那么更好。您只是将其视为我正在谈论的SSCP矩阵,并对其进行PCA。仍然存在可能的负特征值的问题。
ttnphns 2011年

@ttnphns,对不起,我缺少你解释第1步的距离矩阵X(假设N * N)将是对称的,所以colMeans(X) =rowMeans(X) 一旦你减去行或山坳手段:Y=X-rowMeans(X)mean(Y)0
Zhubarb

1
@Zhubarb,当我说You could turn your matrix of distances into raw data(第1点和第2点)时,基本上指的是Torgerson的多维标度(MDS),其中双重居中是第一步。请在该网站(以及Google)上搜索有关该程序的信息。“双重居中”是将(平方的)距离转换成相应的标量积矩阵,该标量积矩阵定义在点云的质心上的原点上。
ttnphns

3

请看这篇由我的熟人之一写的文章;)

http://arxiv.org/abs/1304.6899

它是关于广义的k均值实现,它采用任意距离矩阵作为输入。它可以是对角线为零的任何对称非负矩阵。注意,对于奇怪的距离矩阵,它可能不会给出合理的结果。该程序是用C#编写的。

通过访问上面的链接,然后单击“其他格式”,然后单击“下载源代码”,可以获得源代码。然后,您将获得一个包含Program.cs的.tar.gz。另外,也可以从PDF复制源代码。


3

您可以使用Java Machine Learning Library。他们有一个K-Means实现。其中的构造函数接受三个参数

  1. K值。
  2. 该对象是DistanceMeasure类的实例。
  3. 迭代次数。

可以轻松地扩展DistanceMeasure类以实现所需的结果。这个想法是从此类的measure(Instance x,Instance y)方法中的自定义距离矩阵返回值。

假设距离度量的某些属性,保证K均值收敛。欧几里得距离,曼哈顿距离或其他标准度量标准满足这些假设。由于自定义距离度量可能无法满足这些假设,因此构造函数具有第三个参数,该参数指定要运行的用于构建集群器的迭代次数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.