有没有人对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有什么意义呢?我以为它应该把一系列属性合并成坐标。

最佳答案

多维标度将距离转换为坐标-如果您已经在高维空间中拥有坐标,并且希望它们以最佳方式嵌入低维空间,那么主成分分析(PCA)可能是您正在寻找的技术。
经典的mds与pca有着密切的联系:首先,mds将输入距离转换成初始的高维坐标(维数与描述的对象数目一样高);其次,通过去掉最不重要的轴,这些坐标的维数在pca类的步骤中减小。
使用MDS的要点是,在一些设置中,输入距离不是来自现有坐标,而是来自其他非几何的,例如,由人做出的不同程度的评级。
3x3相异矩阵不服从度量空间所需的三角不等式(因为d[1][0]+d[0][2]

关于java - Java MDSJ产生NaN,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1857338/

10-11 21:53