The answers based on angles are cumbersome to implement and can't be easily generalized to data in higher dimensions. A better approach is that mentioned in my and WimC's answers here: given the distance matrix D(i, j)
, define
M(i, j) = 0.5*(D(1, j)^2 + D(i, 1)^2 - D(i, j)^2)
which should be a positive semi-definite matrix with rank equal to the minimal Euclidean dimension k
in which the points can be embedded. The coordinates of the points can then be obtained from the k
eigenvectors v(i)
of M
corresponding to non-zero eigenvalues q(i)
: place the vectors sqrt(q(i))*v(i)
as columns in an n x k
matrix X
; then each row of X
is a point. In other words, sqrt(q(i))*v(i)
gives the i
th component of all of the points.
The eigenvalues and eigenvectors of a matrix can be obtained easily in most programming languages (e.g., using GSL in C/C++, using the built-in function eig
in Matlab, using Numpy in Python, etc.)
Note that this particular method always places the first point at the origin, but any rotation, reflection, or translation of the points will also satisfy the original distance matrix.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…