Re: Similar matrices->similar eigenvectors?
- To: mathgroup at smc.vnet.net
- Subject: [mg80519] Re: Similar matrices->similar eigenvectors?
- From: Yaroslav Bulatov <yaroslavvb at gmail.com>
- Date: Fri, 24 Aug 2007 01:58:23 -0400 (EDT)
- References: <14594541.1187598542998.JavaMail.root@m35>
I've tried both approaches, and they seem to remove some of the
jittering, but now I realize that the problem is more fundamental --
spectral decomposition of a matrix with degenerate eigenvalues is ill-
posed. As a result, Eigenvectors, and SingularValueDecomposition are
unstable for inputs in the vicinity of those points.
Is there a standard approach for regularizing the problem so that
eigenvector finding becomes stable?
Yaroslav
On Aug 21, 2:15 am, DrMajorBob <drmajor... at bigfoot.com> wrote:
> I don't think it's possible to eliminate all discontinuities, but this may
> improve things:
>
> Clear[normalize, eigensystem]
> normalize[v : {(0.) ..., x_?Negative, ___}] := -v/Norm[v]
> normalize[v_?VectorQ] := v/Norm[v]
> normalize[m_?MatrixQ] := normalize /@ m
> eigensystem[m_?MatrixQ] := Module[{e, vecs, vals, o},
> {vals, vecs} = Eigensystem[m];
> vecs = normalize@vecs;
> o = Reverse@Ordering@vals;
> {vals[[o]], vecs[[o]]}
> ]
> eigensystem[m_?MatrixQ, k_Integer?Positive] :=
> eigensystem[m][[All, ;; k]]
>
> distances2points[d_] := (n = Length[d];
> h = IdentityMatrix[n] - Table[1, {n, n}]/n;
> b = -h.(d*d/2).h;
> {vals, vecs} = eigensystem[b, 2];
> Point[Re[#]] & /@ Transpose[vecs*Sqrt[vals]])
> Clear[d1, d2, d3, d4, d5, d6]; limits = {{{d1, 0, "1->2"}, 0,
> 1}, {{d2, 0, "1->3"}, 0, 1}, {{d3, 0, "1->4"}, 0,
> 1}, {{d4, 0, "2->3"}, 0, 1}, {{d5, 0, "2->4"}, 0,
> 1}, {{d6, 0, "3->4"}, 0, 1}};
> Manipulate[
> Graphics[distances2points[{{0, d1, d2, d3}, {d1, 0, d4, d5}, {d2, d4,
> 0, d6}, {d3, d5, d6, 0}}], PlotRange -> {{-1, 1}, {-1, 1}}],
> Evaluate[Sequence @@ limits], LocalizeVariables -> False]
>
> Replace eigensystem with Eigensystem in "distances2points", to get the
> original behavior.
>
> Bobby
>
> On Mon, 20 Aug 2007 02:38:50 -0500, Yaroslav Bulatov
>
>
>
> <yarosla... at gmail.com> wrote:
> > In the default implementation of "Eigenvectors", the orientations seem
> > arbitrary. Changing the matrix slightly could end up flipping the
> > eigenvectors 180 degrees. A simple fix of telling eigenvectors to
> > always be on one side of some arbitrary plane doesn't work because it
> > will flip eigenvectors that are near-parallel to the plane with small
> > changes in the matrix.
>
> > I'm trying to make a demo of multi-dimensional scaling, and the result
> > is that as I drag the slider, the points flip back and forth
> > erratically.
>
> > Basically I'd like to get a function g[mat] which returns eigenvectors
> > of mat, and is continuous, what is the simplest way of achieving this?
>
> > -----------
> > distances2points[d_] := (n = Length[d];
> > (*nxn matrix of ones*)j = Table[1, {n, n}];
> > (*centering matrix*)h = IdentityMatrix[n] - j/n;
> > a = -d*d/2;
> > b = h.a.h;
> > (*Eigenvectors are returned with arbitrary orientation,
> > orient them to point in the same halfplane*)
> > orient[v_, orientvec_] := ((*1,1,1,1 halfplane is often ambiguous,
> > use random halfplane*)(*SeedRandom[0];
> > orientvec=RandomReal[{0,1},Length[v]];*)
> > If[Round[v, .1].orientvec > 0, -v, v]);
> > vecs = Eigenvectors[b][[1 ;; 2]];
> > (*vecs=orient[#,b[[1]]]&/@vecs;*)
> > vals = Eigenvalues[b][[1 ;; 2]];
> > Point[Re[#]] & /@ Transpose[vecs*Sqrt[vals]])
> > Clear[d1, d2, d3, d4, d5, d6]; limits = {{{d1, 0, "1->2"}, 0,
> > 1}, {{d2, 0, "1->3"}, 0, 1}, {{d3, 0, "1->4"}, 0,
> > 1}, {{d4, 0, "2->3"}, 0, 1}, {{d5, 0, "2->4"}, 0,
> > 1}, {{d6, 0, "3->4"}, 0, 1}};
> > Manipulate[
> > Graphics[distances2points[{{0, d1, d2, d3}, {d1, 0, d4, d5}, {d2, d4,
> > 0, d6}, {d3, d5, d6, 0}}], PlotRange -> {{-1, 1}, {-1, 1}}],
> > Evaluate[Sequence @@ limits], LocalizeVariables -> False]
>
> --
>
> DrMajor... at bigfoot.com