MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: Similar matrices->similar eigenvectors?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg80537] Re: [mg80519] Re: Similar matrices->similar eigenvectors?
  • From: DrMajorBob <drmajorbob at bigfoot.com>
  • Date: Sun, 26 Aug 2007 02:50:45 -0400 (EDT)
  • References: <14594541.1187598542998.JavaMail.root@m35> <29244674.1187940243127.JavaMail.root@m35>
  • Reply-to: drmajorbob at bigfoot.com

If there were a standard way to make Eigensystem stable in that sense, I 
suspect WRI would be using it already. What those guys don't know about 
algebra is rarely worth knowing.

Bobby

On Fri, 24 Aug 2007 00:58:23 -0500, Yaroslav Bulatov  
<yaroslavvb at gmail.com> wrote:

> 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
>
>
>
>



-- 

DrMajorBob at bigfoot.com


  • Prev by Date: ExportString[NumberForm@5,"MathML","Semantics"->False]
  • Next by Date: Re: FindFit and complex function?
  • Previous by thread: Re: Similar matrices->similar eigenvectors?
  • Next by thread: But is it worth to use Mathematica ?