谁能指出一个可以将距离矩阵作为输入的k-means实现(如果在matlab中会更好)?标准的 matlab 实现需要输入中的观察矩阵,并且无法自定义更改相似度度量。
在输入中使用自定义距离矩阵的 k-means 实现
由于 k- means需要能够找到要聚类的点的不同子集的均值,因此要求使用距离矩阵作为输入的 k-means 版本实际上没有意义。
您可以尝试使用 k-medoids。有一些可用的 matlab 实现。
您可以将距离矩阵转换为原始数据并将其输入到 K-Means 聚类中。步骤如下:
N 点之间的距离必须是欧几里得的平方。执行矩阵的“双重居中”:
从每个元素中减去其元素的行均值,减去其元素的列均值,加上元素的矩阵均值,然后除以-2。(行、列和矩阵均值来自初始平方距离矩阵。当然,行均值和列均值包含相同的值,因为距离矩阵是对称的。矩阵均值标量应基于所有矩阵元素,包括对角线元素。)
您现在拥有的矩阵是您的点之间的 SSCP(平方和和叉积)矩阵,其中原点位于 N 点云的几何中心。(在这里阅读双中心的解释。)
对该矩阵执行 PCA(主成分分析)并获得 NxN 分量加载矩阵。它的一些最后一列可能全为 0,所以将它们切断。你现在留下的实际上是主成分分数,你的 N 个点在主成分上的坐标,作为轴,穿过你的云。该数据可以被视为适合 K-Means 输入的原始数据。
PS如果您的距离不是几何上正确的欧几里得平方,您可能会遇到问题:SSCP 矩阵可能不是正(半)定的。这个问题可以通过多种方式解决,但会降低精度。
很容易证明的减数[rowmean + colmean - matrixmean] 等于欧几里德空间余弦定律的:,其中是两个向量之间的标量积相似度。因此,双中心操作是通过该定律将(欧几里德)距离反转为相应的角度相似性。具体来说,这是该定律的一个特殊情况,即我们将原点(通过特定的减数)放入点束的质心(向量的端点)的情况。
请参阅这篇文章,由我的一位熟人撰写;)
http://arxiv.org/abs/1304.6899
它是关于一个广义的 k-means 实现,它以任意距离矩阵作为输入。它可以是任何对角为零的对称非负矩阵。请注意,对于奇怪的距离矩阵,它可能无法给出合理的结果。该程序是用 C# 编写的。
源代码可以通过访问上面的链接,然后点击其他格式,然后点击下载源代码。然后你会得到一个包含 Program.cs 的 .tar.gz。或者,也可以从 PDF 中复制源代码。
您可以使用 Java 机器学习库。他们有一个 K-Means 实现。其中一个构造函数接受三个参数
- K 值。
- 其中一个对象是DistanceMeasure类的一个实例。
- 迭代次数。
可以很容易地扩展 DistanceMeasure 类来实现所需的结果。这个想法是从此类的 measure(Instance x, Instance y) 方法中的自定义距离矩阵中返回值。
假设距离度量的某些属性,保证 K-Means 收敛。欧几里得距离、曼哈顿距离或其他标准度量满足这些假设。由于自定义距离度量可能不满足这些假设,因此构造函数具有第三个参数,指定为构建聚类器运行的迭代次数。