【问题标题】:Java MDSJ produces NaNJava MDSJ 产生 NaN
【发布时间】: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


【解决方案1】:

多维缩放将距离转化为坐标 - 如果您已经在高维空间中拥有坐标并希望它们以最佳方式嵌入到低维空间中,那么主成分分析 (PCA) 可能就是您正在寻找的技术。

经典MDS和PCA密切相关:首先,MDS将输入距离转化为初步的高维坐标(维度与描述的对象数量一样高);其次,通过去除最不重要的轴,在类似 PCA 的步骤中降低这些坐标的维数。

使用 MDS 的意义在于,在某些设置中,输入距离不是从现有坐标中得出的,而是从其他非几何坐标中得出的,例如,人们对不同程度的评级。

您的 3x3 相异矩阵不符合度量空间中所需的三角不等式(因为 d[1][0]+d[0][2]

【讨论】:

  • 好吧,也许你是对的。你有推荐使用的 Java 包吗?我一直在环顾四周,似乎没有什么是我需要的。
猜你喜欢
  • 2017-11-26
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 2018-05-28
  • 2018-08-20
  • 1970-01-01
  • 2015-11-20
  • 2021-06-04
相关资源
最近更新 更多