有人对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。每个长度为 13 ininput
的子数组旨在表示一个对象,但 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 有什么意义呢?我认为它应该将一组属性归结为坐标。