Есть ли у кого-нибудь опыт работы с MDSJ? Следующий вход дает только результаты NaN, и я не могу понять, почему. Документация довольно скудная.Java 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
Возможно, я использую МДС неправильно. Каждый подрамник длиной 13 в input
предназначен для представления одного объекта, но MDSJ возвращает 13 пунктов.
Он также не для этого входа:
double[][] input = {
{3, 4, 3},
{5, 6, 1},
{0, 1, 2}
};
EDIT: Оказывается, что я использую это неправильно. Я давал ему вход, как это:
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) содержит значение для метрики (i, j), где метрика - это функция, которая принимает два вектора и возвращает double. В этот момент вы можете использовать MDS на A. – sdasdadas