谁能指出我可以在输入中采用距离矩阵的k均值实现(如果在matlab中会更好)?标准的MATLAB实施需要输入中的观察矩阵,并且无法自定义更改相似性度量。
谁能指出我可以在输入中采用距离矩阵的k均值实现(如果在matlab中会更好)?标准的MATLAB实施需要输入中的观察矩阵,并且无法自定义更改相似性度量。
Answers:
您可以将距离矩阵转换为原始数据,并将其输入到K-Means聚类中。步骤如下:
1)您的N个点之间的距离必须是平方欧几里得。对矩阵执行“ 双重居中 ”:从每个元素中减去行均值;结果,减去每个元素的列均值;在结果中,将矩阵均值添加到每个元素;除以负2。您现在拥有的矩阵是点之间的SSCP(平方和和积),其中原点位于N个点的云的几何中心。(在此处阅读有关双重居中的说明。)
2)在该矩阵上执行PCA(主成分分析),并获得NxN成分加载矩阵。它的最后几列可能全为0,因此请切掉它们。您现在所剩下的实际上是主要成分分数,即您的N点在作为云轴通过的主要成分上的坐标。可以将该数据视为适合K均值输入的原始数据。
PS:如果距离不是几何上正确的平方欧氏距离,则可能会遇到问题:SSCP矩阵可能不是正的(半)定的。该问题可以通过几种方法来解决,但要降低精度。
X
(假设N * N)将是对称的,所以colMeans(X) =rowMeans(X)
一旦你减去行或山坳手段:Y=X-rowMeans(X)
, mean(Y)
0
You could turn your matrix of distances into raw data
(第1点和第2点)时,基本上指的是Torgerson的多维标度(MDS),其中双重居中是第一步。请在该网站(以及Google)上搜索有关该程序的信息。“双重居中”是将(平方的)距离转换成相应的标量积矩阵,该标量积矩阵定义在点云的质心上的原点上。
请看这篇由我的熟人之一写的文章;)
http://arxiv.org/abs/1304.6899
它是关于广义的k均值实现,它采用任意距离矩阵作为输入。它可以是对角线为零的任何对称非负矩阵。注意,对于奇怪的距离矩阵,它可能不会给出合理的结果。该程序是用C#编写的。
通过访问上面的链接,然后单击“其他格式”,然后单击“下载源代码”,可以获得源代码。然后,您将获得一个包含Program.cs的.tar.gz。另外,也可以从PDF复制源代码。
您可以使用Java Machine Learning Library。他们有一个K-Means实现。其中的构造函数接受三个参数
可以轻松地扩展DistanceMeasure类以实现所需的结果。这个想法是从此类的measure(Instance x,Instance y)方法中的自定义距离矩阵返回值。
假设距离度量的某些属性,保证K均值收敛。欧几里得距离,曼哈顿距离或其他标准度量标准满足这些假设。由于自定义距离度量可能无法满足这些假设,因此构造函数具有第三个参数,该参数指定要运行的用于构建集群器的迭代次数。