Re: How to plot a graph, using a distance matrix
- To: mathgroup at smc.vnet.net
- Subject: [mg89035] Re: How to plot a graph, using a distance matrix
- From: Ray Koopman <koopman at sfu.ca>
- Date: Sat, 24 May 2008 03:54:01 -0400 (EDT)
- References: <g15qni$pdj$1@smc.vnet.net>
On May 23, 12:11 am, Eric Heiman <ehei... at mailinator.com> wrote:
> My dilemna is as such:
>
> I have a matrix (it happens to be 21x21, but don't worry about that) which contains distances between points.
> So column 1 has distances from point 1 to every other point, with row 1 being 0 (because the distance to itself is zero).
>
> What I am wondering is how I would be able to get mathematica to plot a graph of these points.
>
> Thanks in advance!
First the algebra:
Let C = (-1/2)(I - uu'/n)B(I - uu'/n), where
B is the matrix of squared distances among the n points,
I is the identity matrix,
u is a column vector whose elements are all 1s,
and ' denotes transposition.
If the points lie in an m-dimensional space
then C will be positive semidefinite, with rank m.
Let F be any factoring of such a C, so that FF' = C.
Then F contains the coordinates of the points.
This is a well-known result in multidimensional scaling.
In Mathematica code, if dis is the matrix of distances, let
{vals,vex} = Eigensystem[-.5 (#-Mean@#&) /@
Transpose[#-Mean@#& /@ (dis^2)]];
The first m elements of vals should be positive;
the rest should be approximate zeros. Then
f = Transpose[Sqrt[Take[vals,m]]*Take[vex,m]]
will contain the coordinates of the points. However, this assumes
that the eigenvectors are orthonormal, which is usually true, but I
have not been able to find it in the documentation, so caveat user.