【发布时间】:2010-12-23 20:40:32
【问题描述】:
有人对MDSJ 有任何经验吗?以下输入仅产生 NaN 结果,我不知道为什么。文档很少。
import mdsj.Data;
import mdsj.MDSJ;
public class MDSJDemo {
public static void main(String[] args) {
double[][] input = {
{78.0, 60.0, 30.0, 25.0, 24.0, 7.125, 1600.0, 1.4953271028037383, 15.0, 60.0, 0.0, 0.0, 50.0},
{63.1578947368421, 51.81818181818182, 33.0, 30.0, 10.714285714285715, 6.402877697841727, 794.2857142857143, 0.823045267489712, 15.0, 20.0, 2.8571428571428568, 0.0, 75.0},
{55.714285714285715, 70.0, 16.363636363636363, 27.5, 6.666666666666666, 5.742574257425742, 577.1428571428571, 0.6542056074766355, 12.857142857142856, 10.0, 17.142857142857142, 0.0, 25.0}
};
int n=input[0].length; // number of data objects
double[][] output=MDSJ.classicalScaling(input); // apply MDS
System.out.println(Data.format(output));
for(int i=0; i<n; i++) { // output all coordinates
System.out.println(output[0][i]+" "+output[1][i]);
}
}
}
这是输出:
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
也许我错误地使用了 MDS。 input 中的每个长度为 13 的子数组旨在表示一个对象,但 MDSJ 返回 13 个点。
这个输入也失败了:
double[][] input = {
{3, 4, 3},
{5, 6, 1},
{0, 1, 2}
};
编辑:看来我用错了。我一直在给它这样的输入:
Object A: {30d, 1d, 0d, 4.32, 234.1}
Object B: {45d, 3.21, 45, 91.2, 9.9}
Object C: {7.7, 93.1, 401, 0d, 0d}
但它真正想要的是这样的距离矩阵:
A B C
A 0 3 1
B 3 0 5
C 1 5 0
但不完全是,因为对于这个输入:
double[][] input = {
{0, 3, 1},
{3, 0, 5},
{1, 5, 0}
};
我得到这个结果:
0.8713351726043931 -2.361724203891451 2.645016918006963
NaN NaN NaN
0.8713351726043931 NaN
-2.361724203891451 NaN
2.645016918006963 NaN
但如果它确实需要一个距离数组,那么首先使用 MDS 有什么意义呢?我认为它应该将一组属性归结为坐标。
【问题讨论】:
-
这可能晚了四年——但您必须定义一个比较两个对象的指标。这将为您提供一个数组 A,其中每个条目 (A_i,j) 包含 metric(i, j) 的值,其中 metric 是一个接受两个向量并返回一个双精度值的函数。此时,您可以在 A 上使用 MDS。
标签: java nan multi-dimensional-scaling