任何人都有使用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有什么意义呢?我认为它应该将一系列属性归结为坐标。
答案 0 :(得分:1)
多维缩放将距离转换为坐标 - 如果您已经在高维空间中拥有坐标并希望它们最佳地嵌入低维空间,则主成分分析(PCA)可能是您正在寻找的技术。
经典MDS和PCA密切相关:首先,MDS将输入距离转换为初步的高维坐标(尺寸与所描述的对象数一样高);第二,通过摆脱最不重要的轴,在类似PCA的步骤中减少了这些坐标的维数。
使用MDS的关键在于,在某些设置中,输入距离不是来自现有坐标,而是来自非几何的其他东西,例如人们做出的相异性评级。
你的3x3不相似矩阵不服从度量空间中所需的三角不等式(因为d [1] [0] + d [0] [2]&lt; d [1] [2])因此不能准确嵌入欧几里德空间。从技术上讲,第二维中的NaN值是由修正的相异矩阵的负第二特征值引起的。