Java MDSJ производит NaN - PullRequest
       24

Java MDSJ производит NaN

3 голосов
/ 07 декабря 2009

Кто-нибудь имеет опыт работы с 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 в input предназначен для представления одного объекта, однако 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? Я думал, что это должно было свести массив атрибутов в координаты.

1 Ответ

1 голос
/ 07 декабря 2009

Многомерное масштабирование превращает расстояния в координаты - если у вас уже есть координаты в многомерном пространстве и вы хотите, чтобы они оптимально встраивались в низкоразмерное пространство, возможно, вам нужен метод анализа основных компонентов (PCA).

Классические MDS и PCA тесно связаны: во-первых, MDS преобразует входные расстояния в предварительные многомерные координаты (размерность которых равна числу описанных объектов); во-вторых, размерность этих координат уменьшается на шаге, подобном PCA, путем избавления от наименее важных осей.

Смысл использования MDS заключается в том, что в некоторых настройках входные расстояния получены не из существующих координат, а из чего-то другого, что не является геометрическим, например, оценки различий, сделанные людьми.

Ваша матрица различий 3x3 не подчиняется неравенству треугольника, необходимому в метрических пространствах (потому что d [1] [0] + d [0] [2]

...