MN12: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przykry (dyskusja | edycje)
Nie podano opisu zmian
 
(Nie pokazano 10 wersji utworzonych przez 2 użytkowników)
Linia 14: Linia 14:
nazywanym też <strong>liniowym zadaniem najmniejszych kwadratów</strong>.   
nazywanym też <strong>liniowym zadaniem najmniejszych kwadratów</strong>.   
Jest ono uogólnieniem zadania rozwiązywania kwadratowych układów  
Jest ono uogólnieniem zadania rozwiązywania kwadratowych układów  
równań liniowych do przypadku, gdy układ jest nadokreślony --- to znaczy, jest więcej równań niż niewiadomych. W takim przypadku nie należy liczyć na to, że uda się nam wskazać rozwiązanie spełniające ''wszystkie'' równania (jest ich za dużo!), dlatego będziemy szukać rozwiązania <math>\displaystyle x</math>, które minimalizuje resztę,
równań liniowych do przypadku, gdy układ jest nadokreślony --- to znaczy, jest więcej równań niż niewiadomych. W takim przypadku nie należy liczyć na to, że uda się nam wskazać rozwiązanie spełniające ''wszystkie'' równania (jest ich za dużo!), dlatego będziemy szukać rozwiązania <math>x</math>, które minimalizuje resztę,


<center><math>\displaystyle ||b-Ax||_2.
<center><math>||b-Ax||_2</math></center>
</math></center>


Jest to praktycznie bardzo często pojawiające się zadanie, a autorem pierwszego
Jest to praktycznie bardzo często pojawiające się zadanie, a autorem pierwszego
Linia 24: Linia 23:
[[grafika:Gauss.jpg|thumb|right||Carl Friedrich Gauss<br>  [[Biografia Gauss|Zobacz biografię]]]]
[[grafika:Gauss.jpg|thumb|right||Carl Friedrich Gauss<br>  [[Biografia Gauss|Zobacz biografię]]]]


Okazuje się bowiem, że jeśli np. potraktować <math>\displaystyle b</math> jako dane eksperymentalne (obarczone pewnym losowym błędem pomiaru o rozkładzie normalnym), a <math>\displaystyle x</math> --- parametrami zależności liniowej dla punktów pomiaru zadanych w macierzy <math>\displaystyle A</math>, to <math>\displaystyle x</math> minimalizujący <math>\displaystyle ||b-Ax||_2</math> (właśnie w ''tej'' normie!) jest jednocześnie najbardziej prawdopodobnym zestawem współczynników tej zależności. W języku statystyki takie zadanie nazywa się zadaniem regresji liniowej i jest w tym kontekście bardzo często znajdowane w najrozmaitszych gałęziach nauki --- wszędzie tam, gdzie zachodzi potrzeba dopasowania parametrów liniowego modelu do wyników uzyskanych na drodze eksperymentu.
Okazuje się bowiem, że jeśli np. potraktować <math>b</math> jako dane eksperymentalne (obarczone pewnym losowym błędem pomiaru o rozkładzie normalnym), a <math>x</math> --- parametrami zależności liniowej dla punktów pomiaru zadanych w macierzy <math>A</math>, to <math>x</math> minimalizujący <math>||b-Ax||_2</math> (właśnie w ''tej'' normie!) jest jednocześnie najbardziej prawdopodobnym zestawem współczynników tej zależności. W języku statystyki takie zadanie nazywa się zadaniem regresji liniowej i jest w tym kontekście bardzo często znajdowane w najrozmaitszych gałęziach nauki --- wszędzie tam, gdzie zachodzi potrzeba dopasowania parametrów liniowego modelu do wyników uzyskanych na drodze eksperymentu.


Stąd zresztą nazwa zadania: wygładzanie liniowe, bo chodzi nam o to, by dopasowując parametry krzywej do wyników eksperymentu, wygładzić ewentualne błędy pomiarowe.
Stąd zresztą nazwa zadania: wygładzanie liniowe, bo chodzi nam o to, by dopasowując parametry krzywej do wyników eksperymentu, wygładzić ewentualne błędy pomiarowe.
Linia 35: Linia 34:


Przypuśćmy, że dla pewnej funkcji   
Przypuśćmy, że dla pewnej funkcji   
<math>\displaystyle f:[a,b]\toR</math> obserwujemy jej wartości <math>\displaystyle f_i</math> (dokładne lub  
<math>f:[a,b]\to R</math> obserwujemy jej wartości <math>f_i</math> (dokładne lub  
zaburzone) w punktach <math>\displaystyle t_i</math>, <math>\displaystyle 1\le i\le m</math>. Funkcję tę
zaburzone) w punktach <math>t_i</math>, <math>1\le i\le m</math>. Funkcję tę
chcielibyśmy przybliżyć inną funkcją <math>\displaystyle w</math> należącą do  
chcielibyśmy przybliżyć inną funkcją <math>w</math> należącą do  
pewnej <math>\displaystyle n</math> wymiarowej przestrzeni liniowej <math>\displaystyle W</math>, np. przestrzeni  
pewnej <math>n</math> wymiarowej przestrzeni liniowej <math>W</math>, np. przestrzeni  
wielomianów stopnia mniejszego niż <math>\displaystyle n</math>. Jakość przybliżenia  
wielomianów stopnia mniejszego niż <math>n</math>. Jakość przybliżenia  
mierzymy, sprawdzając, ''jak dokładnie spełniona jest przybliżona równość <math>\displaystyle f_i \approx w(t_i)</math>'', dokładniej, badając tzw. <strong>błąd średniokwadratowy</strong>,
mierzymy, sprawdzając, ''jak dokładnie spełniona jest przybliżona równość <math>f_i \approx w(t_i)</math>'', dokładniej, badając tzw. <strong>błąd średniokwadratowy</strong>,


<center><math>\displaystyle
<center><math>
   \frac{1}{m}\sum_{i=1}^m (f_i-w(t_i))^2.
   \frac{1}{m}\sum_{i=1}^m (f_i-w(t_i))^2</math></center>
</math></center>


Wybierając pewną bazę <math>\displaystyle (w_j)_{j=1}^n</math> w <math>\displaystyle W</math> i rozwijając <math>\displaystyle w</math>  
Wybierając pewną bazę <math>(w_j)_{j=1}^n</math> w <math>W</math> i rozwijając <math>w</math>  
w tej bazie, <math>\displaystyle w(t)=\sum_{j=1}^n c_jw_j(t)</math>, sprowadzamy problem  
w tej bazie, <math>w(t)=\sum_{j=1}^n c_jw_j(t)</math>, sprowadzamy problem  
do minimalizacji  
do minimalizacji  


<center><math>\displaystyle \sum_{i=1}^m\left(f_i-\sum_{j=1}^n c_jw_j(t_i)\right)^2  
<center><math>\sum_{i=1}^m\left(f_i-\sum_{j=1}^n c_jw_j(t_i)\right)^2  
</math></center>
</math></center>


względem <math>\displaystyle c_j</math>, a więc do zadania wygładzania liniowego.  
względem <math>c_j</math>, a więc do zadania wygładzania liniowego.  


Rzeczywiście, kładąc  
Rzeczywiście, kładąc  
<math>\displaystyle A=(a_{i,j})\inR^{m\times n}</math> z <math>\displaystyle a_{i,j}=w_j(t_i)</math>,  
<math>A=(a_{i,j})\in R^{m\times n}</math> z <math>a_{i,j}=w_j(t_i)</math>,  
<math>\displaystyle  b=(f_i)_{i=1}^m</math> i <math>\displaystyle  x=(c_j)_{j=1}^n</math>, reszta jest równa <math>\displaystyle \| b-A x\|_2^2</math>, a minimalizacja reszty jest oczywiście równoważna minimalizacji błędu średniokwadratowego.  
<math>b=(f_i)_{i=1}^m</math> i <math>x=(c_j)_{j=1}^n</math>, reszta jest równa <math>\| b-A x\|_2^2</math>, a minimalizacja reszty jest oczywiście równoważna minimalizacji błędu średniokwadratowego.  


[[Image:MNaproksymacjal2.png|thumb|550px|center|Wielomian <math>\displaystyle w</math> (czerwony) stopnia 3, aproksymujący 7 zadanych wartości (zaznaczone na zielono) danej funkcji <math>\displaystyle f</math> w sensie minimalizacji błędu średniokwadratowego]]
[[Image:MNaproksymacjal2.png|thumb|550px|center|Wielomian <math>w</math> (czerwony) stopnia 3, aproksymujący 7 zadanych wartości (zaznaczone na zielono) danej funkcji <math>f</math> w sensie minimalizacji błędu średniokwadratowego]]


Powyższe zadanie aproksymacji średniokwadratowej w zadanych węzłach <math>\displaystyle (x_i,y_i)</math>, <math>\displaystyle i=1,\ldots,m</math>. wielomianem stopnia ''co najwyżej'' <math>\displaystyle N</math>, realizuje w Octave funkcja <code style="color: #006">polyfit(x,y,N)</code>. (Co dostaniemy, gdy <math>\displaystyle N=m-1</math>?)
Powyższe zadanie aproksymacji średniokwadratowej w zadanych węzłach <math>(x_i,y_i)</math>, <math>i=1,\ldots,m</math>. wielomianem stopnia ''co najwyżej'' <math>N</math>, realizuje w Octave funkcja <code style="color: #006">polyfit(x,y,N)</code>. (Co dostaniemy, gdy <math>N=m-1</math>?)


Można pokazać, że rozwiązanie minimalizujące błąd średniokwadratowy jest najbardziej prawdopodobnym zestawem parametrów naszego (liniowego) modelu, gdy zmierzone wartości <math>\displaystyle f_i</math> mogą być zaburzone losowym błędem pomiarowym.
Można pokazać, że rozwiązanie minimalizujące błąd średniokwadratowy jest najbardziej prawdopodobnym zestawem parametrów naszego (liniowego) modelu, gdy zmierzone wartości <math>f_i</math> mogą być zaburzone losowym błędem pomiarowym.


</div></div>
</div></div>


W kontekście nie-statystycznym, możemy myśleć o zadaniu wygładzania liniowego jako sposobie skrócenia listy parametrów <math>\displaystyle x</math> modelu przy zachowaniu przybliżonego spełnienia warunków modelu, tzn. <math>\displaystyle Ax\approx b</math>.
W kontekście nie-statystycznym, możemy myśleć o zadaniu wygładzania liniowego jako sposobie skrócenia listy parametrów <math>x</math> modelu przy zachowaniu przybliżonego spełnienia warunków modelu, tzn. <math>Ax\approx b</math>.


Dodajmy, że spotyka się uogólnienie tego zadania w formie następującej: dla danych wartości <math>\displaystyle b\in R^m</math>, i danej funkcji <math>\displaystyle F:R^n\rightarrow R^m</math>, znaleźć <math>\displaystyle x\in R^n</math> minimalizujący resztę:
Dodajmy, że spotyka się uogólnienie tego zadania w formie następującej: dla danych wartości <math>b\in R^m</math>, i danej funkcji <math>F:R^n\rightarrow R^m</math>, znaleźć <math>x\in R^n</math> minimalizujący resztę:


<center><math>\displaystyle ||b-F(x)||_2.
<center><math>||b-F(x)||_2</math></center>
</math></center>


Właśnie tego typu <strong>nieliniowe zadanie najmniejszych kwadratów</strong> rozwiązują np. nasze przenośne [  odbiorniki GPS]... Na marginesie zauważmy, że gdy <math>\displaystyle F</math> jest liniowa, zadanie sprowadza się do poprzedniego. W niniejszym wykładzie ograniczymy się wyłącznie do liniowego zadania najmniejszych kwadratów, nieliniowe jest omówiane na [[Metody optymalizacji|wykładzie z metod optymalizacji]].  
Właśnie tego typu <strong>nieliniowe zadanie najmniejszych kwadratów</strong> rozwiązują np. nasze przenośne [  odbiorniki GPS]... Na marginesie zauważmy, że gdy <math>F</math> jest liniowa, zadanie sprowadza się do poprzedniego. W niniejszym wykładzie ograniczymy się wyłącznie do liniowego zadania najmniejszych kwadratów, nieliniowe jest omówiane na [[Metody optymalizacji|wykładzie z metod optymalizacji]].


==Układ równań normalnych==
==Układ równań normalnych==


Niech <math>\displaystyle A</math> będzie daną macierzą o <math>\displaystyle m</math> wierszach i <math>\displaystyle n</math> kolumnach,  
Niech <math>A</math> będzie daną macierzą o <math>m</math> wierszach i <math>n</math> kolumnach,  
<math>\displaystyle A\inR^{m\times n}</math>, taką, że  
<math>A\in R^{m\times n}</math>, taką, że  


<center><math>\displaystyle m\,\ge\,n\,=\, \mbox{rank} (A),  
<center><math>m\,\ge\,n\,=\, \mbox{rank} (A),  
</math></center>
</math></center>


albo równoważnie, taką że jej wektory kolumny są liniowo  
albo równoważnie, taką że jej wektory kolumny są liniowo  
niezależne. Niech także dany będzie wektor <math>\displaystyle  b\inR^m</math>.  
niezależne. Niech także dany będzie wektor <math>b\in R^m</math>.  
Jasne jest, że wtedy układ równań <math>\displaystyle A x= b</math> nie zawsze  
Jasne jest, że wtedy układ równań <math>A x= b</math> nie zawsze  
ma rozwiązanie - mówimy, że układ jest <strong>nadokreślony</strong>.  
ma rozwiązanie - mówimy, że układ jest <strong>nadokreślony</strong>.  


<strong>Zadanie wygładzania liniowego</strong> polega na znalezieniu wektora  
<strong>Zadanie wygładzania liniowego</strong> polega na znalezieniu wektora  
<math>\displaystyle  x^*\inR^n</math>, który minimalizuje <strong>wektor residualny</strong> (wektor reszty)
<math>x^*\in R^n</math>, który minimalizuje <strong>wektor residualny</strong> (wektor reszty)
<math>\displaystyle  r= b-A x</math> w normie drugiej, tzn.
<math>r= b-A x</math> w normie drugiej, tzn.


<center><math>\displaystyle \| b\,-\,A x^*\|_2\,=\,\min_{ x\inR^n}
<center><math>\| b\,-\,A x^*\|_2\,=\,\min_{ x\in R^n}
     \| b\,-\,A x\|_2.
     \| b\,-\,A x\|_2</math></center>
</math></center>


{{lemat|||
{{lemat|||
Zadanie wygładzania liniowego ma jednoznaczne  
Zadanie wygładzania liniowego ma jednoznaczne  
rozwiązanie <math>\displaystyle  x^*</math>, które można scharakteryzować jako rozwiązanie układu równań  
rozwiązanie <math>x^*</math>, które można scharakteryzować jako rozwiązanie układu równań  


<center><math>\displaystyle
<center><math>
A^TA x\,=\,A^T\, b.
A^TA x\,=\,A^T\, b</math></center>
</math></center>


}}
}}


Zauważmy, że jeśli macierz <math>\displaystyle A</math> jest kwadratowa, <math>\displaystyle m=n</math>, to  
Zauważmy, że jeśli macierz <math>A</math> jest kwadratowa, <math>m=n</math>, to  
rozwiązaniem jest <math>\displaystyle  x^*=A^{-1} b</math> i residuum jest zerem.  
rozwiązaniem jest <math>x^*=A^{-1} b</math> i residuum jest zerem.  
Zadanie wygładzania liniowego jest więc uogólnieniem  
Zadanie wygładzania liniowego jest więc uogólnieniem  
rozwiązywania kwadratowych układów równań liniowych.  
rozwiązywania kwadratowych układów równań liniowych.  
Linia 114: Linia 109:
Równanie powyższe nazywa się <strong>układem równań normalnych</strong>.  
Równanie powyższe nazywa się <strong>układem równań normalnych</strong>.  
Może ono nam sugerować sposób rozwiązania zadania wygładzania  
Może ono nam sugerować sposób rozwiązania zadania wygładzania  
liniowego. Wystarczy bowiem pomnożyć macierz <math>\displaystyle A^T</math> przez <math>\displaystyle A</math> i  
liniowego. Wystarczy bowiem pomnożyć macierz <math>A^T</math> przez <math>A</math> i  
rozwiązać układ normalny. Zauważmy ponadto, że macierz <math>\displaystyle A^TA</math>  
rozwiązać układ normalny. Zauważmy ponadto, że macierz <math>A^TA</math>  
jest symetryczna i dodatnio określona, bo <math>\displaystyle (A^TA)^T=A^TA</math> i dla  
jest symetryczna i dodatnio określona, bo <math>(A^TA)^T=A^TA</math> i dla  
<math>\displaystyle  x\ne 0</math> mamy  
<math>x\ne 0</math> mamy  
<math>\displaystyle  x^T(A^TA) x=(A x)^T(A x)=\|A x\|_2>0</math>, przy  
<math>x^T(A^TA) x=(A x)^T(A x)=\|A x\|_2>0</math>, przy  
czym ostatnia nierówność wynika z faktu, że kolumny macierzy <math>\displaystyle A</math>  
czym ostatnia nierówność wynika z faktu, że kolumny macierzy <math>A</math>  
są liniowo niezależne i dlatego <math>\displaystyle A x\ne 0</math>. Przy mnożeniu  
są liniowo niezależne i dlatego <math>A x\ne 0</math>. Przy mnożeniu  
<math>\displaystyle A^T</math> przez <math>\displaystyle A</math> wystarczy więc obliczyć tylko elementy na głównej  
<math>A^T</math> przez <math>A</math> wystarczy więc obliczyć tylko elementy na głównej  
przekątnej i pod nią, a do rozwiązania równania z macierzą  
przekątnej i pod nią, a do rozwiązania równania z macierzą  
<math>\displaystyle A^TA</math> można zastosować [[MN05LAB|algorytm Cholesky'ego-Banachiewicza]]. Jak łatwo się przekonać, koszt takiego  
<math>A^TA</math> można zastosować [[MN05LAB|algorytm Cholesky'ego-Banachiewicza]]. Jak łatwo się przekonać, koszt takiego  
algorytmu wynosi <math>\displaystyle n^2(m+n/3)</math>, przy czym dominuje koszt mnożenia  
algorytmu wynosi <math>n^2(m+n/3)</math>, przy czym dominuje koszt mnożenia  
obliczenia macierzy <math>\displaystyle A^TA</math>.  
obliczenia macierzy <math>A^TA</math>.  


Ma on jednak pewne wady. Mnożenie macierzy powoduje w <math>\displaystyle fl_\nu</math>  
Ma on jednak pewne wady. Mnożenie macierzy powoduje w <math>fl_\nu</math>  
powstanie po drodze dodatkowych błędów, które mogą nawet  
powstanie po drodze dodatkowych błędów, które mogą nawet  
zmienić rząd macierzy. Na przykład, dla macierzy  
zmienić rząd macierzy. Na przykład, dla macierzy  


<center><math>\displaystyle A\,=\,\left(\begin{array} {cccc}
<center><math>A\,=\,\left(\begin{array} {cccc}
     1  &  1  &  1  &  1  \\
     1  &  1  &  1  &  1  \\
   \epsilon  \\
   \epsilon  \\
Linia 141: Linia 136:
mamy  
mamy  


<center><math>\displaystyle A^TA\,=\,\left(\begin{array} {cccc}
<center><math>A^TA\,=\,\left(\begin{array} {cccc}
     1+\epsilon^2 & 1 & 1 & 1 \\
     1+\epsilon^2 & 1 & 1 & 1 \\
     1 & 1+\epsilon^2 & 1 & 1 \\
     1 & 1+\epsilon^2 & 1 & 1 \\
     1 & 1 & 1+\epsilon^2 & 1 \\
     1 & 1 & 1+\epsilon^2 & 1 \\
     1 & 1 & 1 & 1+\epsilon^2 \end{array} \right).
     1 & 1 & 1 & 1+\epsilon^2 \end{array} \right)</math></center>
</math></center>


Jeśli <math>\displaystyle \epsilon^2<\nu</math> to <math>\displaystyle fl_\nu(1+\epsilon^2)=1</math>, co implikuje  
Jeśli <math>\epsilon^2<\nu</math> to <math>fl_\nu(1+\epsilon^2)=1</math>, co implikuje  
<math>\displaystyle  \mbox{rank} (fl_\nu(A^TA))=1</math>, podczas, gdy <math>\displaystyle  \mbox{rank} (fl_\nu(A))=4</math>.  
<math>\mbox{rank} (fl_\nu(A^TA))=1</math>, podczas, gdy <math>\mbox{rank} (fl_\nu(A))=4</math>.  
Inne potencjalne wady układu równań normalnych wymieniamy w dalszej części wykładu.
Inne potencjalne wady układu równań normalnych wymieniamy w dalszej części wykładu.


Poniżej przedstawimy inną metodę rozwiązywania zadania  
Poniżej przedstawimy inną metodę rozwiązywania zadania  
wygładzania liniowego, która oparta jest na specjalnych  
wygładzania liniowego, która oparta jest na specjalnych  
przekształceniach zwanych odbiciami Householdera.  
przekształceniach zwanych odbiciami Householdera.


==Odbicia Householdera==
==Odbicia Householdera==


Dla danego wektora <math>\displaystyle  w\inR^m</math> o normie  
Dla danego wektora <math>w\in R^m</math> o normie  
<math>\displaystyle \| w\|_2=\sqrt{ w^T w}=1</math>,  
<math>\| w\|_2=\sqrt{ w^T w}=1</math>,  
<strong>odbicie</strong> (macierz) <strong>Householdera</strong> zdefiniowane jest jako  
<strong>odbicie</strong> (macierz) <strong>Householdera</strong> zdefiniowane jest jako  


<center><math>\displaystyle H\,=\,I\,-\,2 w w^T.
<center><math>H\,=\,I\,-\,2 w w^T</math></center>
</math></center>


Zauważmy, że  
Zauważmy, że  


<center><math>\displaystyle H x\,=\, x\,-\,2( w^T x) w,
<center><math>H x\,=\, x\,-\,2( w^T x) w</math>,</center>
</math></center>


a ponieważ <math>\displaystyle ( w^T x) w=( x, w)_2 w</math>  
a ponieważ <math>( w^T x) w=( x, w)_2 w</math>  
jest rzutem prostopadłym <math>\displaystyle  x</math> na kierunek wektora <math>\displaystyle  w</math>
jest rzutem prostopadłym <math>x</math> na kierunek wektora <math>w</math>
(<math>\displaystyle (\cdot,\cdot)_2</math> oznacza iloczyn skalarny), to <math>\displaystyle H x</math> jest  
(<math>(\cdot,\cdot)_2</math> oznacza iloczyn skalarny), to <math>H x</math> jest  
odbiciem lustrzanym wektora <math>\displaystyle  x</math> względem hiperpłaszczyzny  
odbiciem lustrzanym wektora <math>x</math> względem hiperpłaszczyzny  
(wymiaru <math>\displaystyle m-1</math>) prostopadłej do <math>\displaystyle  w</math>.  
(wymiaru <math>m-1</math>) prostopadłej do <math>w</math>.  


Odbicia Householdera są przekształceniami nieosobliwymi  
Odbicia Householdera są przekształceniami nieosobliwymi  
spełniającymi  
spełniającymi  


<center><math>\displaystyle H^{-1}\,=\,H\,=\,H^T.
<center><math>H^{-1}\,=\,H\,=\,H^T</math></center>
</math></center>


Rzeczywiście, ponieważ <math>\displaystyle  w</math> ma normę jednostkową, mamy  
Rzeczywiście, ponieważ <math>w</math> ma normę jednostkową, mamy  


<center><math>\displaystyle H^2 \,=\, (I-2 w w^T)^2\,=\,
<center><math>H^2 \,=\, (I-2 w w^T)^2\,=\,
   I-4 w w^T+4 w( w^T w) w^T \,=\, I,
   I-4 w w^T+4 w( w^T w) w^T \,=\, I</math>,</center>
</math></center>


oraz  
oraz  


<center><math>\displaystyle H^T\,=\,(I-2 w w^T)^T\,=\,I-2( w^T)^T w^T\,=\,I.  
<center><math>H^T\,=\,(I-2 w w^T)^T\,=\,I-2( w^T)^T w^T\,=\,I.  
</math></center>
</math></center>


W szczególności <math>\displaystyle H</math> jest więc przekształceniem <strong>ortogonalnym</strong>,  
W szczególności <math>H</math> jest więc przekształceniem <strong>ortogonalnym</strong>,  
<math>\displaystyle H^{-1}=H^T</math>, czyli nie zmienia długości wektora,  
<math>H^{-1}=H^T</math>, czyli nie zmienia długości wektora,  


<center><math>\displaystyle \|H x\|_2\,=\,\sqrt{(H x)^T(H x)}\,=\,
<center><math>\|H x\|_2\,=\,\sqrt{(H x)^T(H x)}\,=\,
     \sqrt{ x^T(H^TH) x}\,=\,\sqrt{ x^T x}\,=\,
     \sqrt{ x^T(H^TH) x}\,=\,\sqrt{ x^T x}\,=\,
     \| x\|_2.
     \| x\|_2</math></center>
</math></center>


Odbicia Householdera zastosujemy do przeprowadzenia danego wektora  
Odbicia Householdera zastosujemy do przeprowadzenia danego wektora  
<math>\displaystyle  x\ne 0</math> na kierunek innego niezerowego wektora, powiedzmy  
<math>x\ne 0</math> na kierunek innego niezerowego wektora, powiedzmy  
<math>\displaystyle  e</math>, tzn.  
<math>e</math>, tzn.  


<center><math>\displaystyle H x\,=\,(I-2 w w^T) x\,=\,\alpha\, e.
<center><math>H x\,=\,(I-2 w w^T) x\,=\,\alpha\, e</math></center>
</math></center>


<!--  
<!--  
Linia 212: Linia 200:
-->
-->
   
   
<div class="center"><div class="thumb tnone"><div style="width:552px;"><flash>file=Wektor.swf\PIPEREAD width=550\PIPEREAD height=300|width=550|height=300</flash> <div class="thumbcaption">Odbicie Householdera</div></div></div></div>
Załóżmy dla uproszczenia, że <math>\| e\|_2=1</math>.
Aby wyznaczyć <math>H</math> zauważmy, że


Załóżmy dla uproszczenia, że <math>\displaystyle \| e\|_2=1</math>.
<center><math>w\,=\,\frac{ x-\alpha e}{2( w^T x)},  
Aby wyznaczyć <math>\displaystyle H</math> zauważmy, że
 
<center><math>\displaystyle w\,=\,\frac{ x-\alpha e}{2( w^T x)},  
</math></center>
</math></center>


a ponieważ <math>\displaystyle \alpha=\pm\| x\|_2</math> i <math>\displaystyle \| w\|_2=1</math> to  
a ponieważ <math>\alpha=\pm\| x\|_2</math> i <math>\| w\|_2=1</math> to  


<center><math>\displaystyle w\,=\,\frac{ x\mp\| x\|_2 e}
<center><math>w\,=\,\frac{ x\mp\| x\|_2 e}
                 {\| x\mp\| x\|_2 e\|_2}.
                 {\| x\mp\| x\|_2 e\|_2}</math></center>
</math></center>


W szczególności, jeśli <math>\displaystyle  e= e_1</math> jest pierwszym  
W szczególności, jeśli <math>e= e_1</math> jest pierwszym  
wersorem, powyższe wzory dają  
wersorem, powyższe wzory dają  


<center><math>\displaystyle H\,=\,I\,-\,\frac{ u u^T}{\gamma},  
<center><math>H\,=\,I\,-\,\frac{ u u^T}{\gamma},  
</math></center>
</math></center>


gdzie  
gdzie  


<center><math>\displaystyle u_i\,=\,\left\{\begin{array} {ll}
<center><math>u_i\,=\,\left\{\begin{array} {ll}
         x_1\mp\| x\|_2  &\quad i=1, \\
         x_1\mp\| x\|_2  &\quad i=1, \\
                       x_i  &\quad 2\le i\le m,  
                       x_i  &\quad 2\le i\le m,  
         \end{array} \right.
         \end{array} \right.</math></center>
</math></center>


oraz  
oraz  


<center><math>\displaystyle \aligned \gamma &= \frac 12\| u\|_2^2\,=\,
<center><math>\begin{align} \gamma &= \frac 12\| u\|_2^2\,=\,
       \frac 1 2\Big((x_1\mp\| x\|_2)^2+\sum_{i=2}^m x_i^2\Big) \\
       \frac 1 2\Big((x_1\mp\| x\|_2)^2+\sum_{i=2}^m x_i^2\Big) \\
   &= \frac 1 2 \Big(\sum_{i=1}^m x_i^2\,+\,\| x\|_2^2\,\mp\,
   &= \frac 1 2 \Big(\sum_{i=1}^m x_i^2\,+\,\| x\|_2^2\,\mp\,
       2 x_1\|x\|_2\Big) \,=\,\|x\|_2^2\,\mp\,x_1 \|x\|_2.  
       2 x_1\|x\|_2\Big) \,=\,\|x\|_2^2\,\mp\,x_1 \|x\|_2.  
\endaligned</math></center>
\end{align}</math></center>


Otrzymaliśmy dwa odbicia Householdera przekształcające dany wektor  
Otrzymaliśmy dwa odbicia Householdera przekształcające dany wektor  
<math>\displaystyle  x</math> na kierunek pierwszego wersora, w zależności od wybranego  
<math>x</math> na kierunek pierwszego wersora, w zależności od wybranego  
znaku przy <math>\displaystyle \| x\|_2</math>. Ustalimy ten znak na plus gdy <math>\displaystyle x_1\ge 0</math>   
znaku przy <math>\| x\|_2</math>. Ustalimy ten znak na plus gdy <math>x_1\ge 0</math>   
oraz na minus gdy <math>\displaystyle x_1<0</math>, co pozwoli na obliczenie <math>\displaystyle u_1</math> i <math>\displaystyle \gamma</math>  
oraz na minus gdy <math>x_1<0</math>, co pozwoli na obliczenie <math>u_1</math> i <math>\gamma</math>  
z małym błędem względem w <math>\displaystyle fl_\nu</math>. Wtedy bowiem mamy  
z małym błędem względem w <math>fl_\nu</math>. Wtedy bowiem mamy  


<center><math>\displaystyle u_1\,=\,\left\{\begin{array} {ll}
<center><math>u_1\,=\,\left\{\begin{array} {ll}
       x_1+\|x\|_2 & \quad x_1\ge 0, \\
       x_1+\|x\|_2 & \quad x_1\ge 0, \\
       x_1-\|x\|_2 & \quad x_1<0, \end{array} \right.
       x_1-\|x\|_2 & \quad x_1<0, \end{array} \right.</math></center>
</math></center>


oraz <math>\displaystyle \gamma=\| x\|_2^2+|x_1|\,\| x\|_2</math>, czyli zawsze  
oraz <math>\gamma=\| x\|_2^2+|x_1|\,\| x\|_2</math>, czyli zawsze  
dodajemy liczby tych samych znaków. Ponadto pierwsza współrzędna  
dodajemy liczby tych samych znaków. Ponadto pierwsza współrzędna  
wektora <math>\displaystyle H x</math> jest równa <math>\displaystyle -\| x\|_2</math>, gdy <math>\displaystyle x_1\ge 0</math>, a  
wektora <math>H x</math> jest równa <math>-\| x\|_2</math>, gdy <math>x_1\ge 0</math>, a  
<math>\displaystyle +\| x\|_2</math> jeśli <math>\displaystyle x_1<0</math>.  
<math>+\| x\|_2</math> jeśli <math>x_1<0</math>.
 
 
==Rozkład QR==
==Rozkład QR==


Odbić Householdera można użyć do rozkładu macierzy  
Odbić Householdera można użyć do rozkładu macierzy  
<math>\displaystyle A\inR^{m\times n}</math> na iloczyn ortogonalno-trójkątny.  
<math>A\in R^{m\times n}</math> na iloczyn ortogonalno-trójkątny.  


Niech <math>\displaystyle A=( a_1, a_2,\ldots, a_n)</math>, gdzie <math>\displaystyle  a_j</math> są  
Niech <math>A=( a_1, a_2,\ldots, a_n)</math>, gdzie <math>a_j</math> są  
wektorami-kolumnami macierzy <math>\displaystyle A</math>. Wybierzmy pierwsze odbicie  
wektorami-kolumnami macierzy <math>A</math>. Wybierzmy pierwsze odbicie  
Householdera <math>\displaystyle H_1=I_m- u_1 u_1^T/\gamma_1</math> tak, aby  
Householdera <math>H_1=I_m- u_1 u_1^T/\gamma_1</math> tak, aby  
przekształcało pierwszy wektor-kolumnę macierzy <math>\displaystyle A</math> na kierunek  
przekształcało pierwszy wektor-kolumnę macierzy <math>A</math> na kierunek  
<math>\displaystyle  e_1</math>. Efektem pomnożenia macierzy <math>\displaystyle A</math> z lewej strony przez  
<math>e_1</math>. Efektem pomnożenia macierzy <math>A</math> z lewej strony przez  
<math>\displaystyle H_1</math> będzie wtedy macierz  
<math>H_1</math> będzie wtedy macierz  


<center><math>\displaystyle A^{(1)}\,=\,( a^{(1)}_1,\ldots, a^{(1)}_n)
<center><math>A^{(1)}\,=\,( a^{(1)}_1,\ldots, a^{(1)}_n)
   \,=\,(H_1 a_1,\ldots, H_1 a_n),
   \,=\,(H_1 a_1,\ldots, H_1 a_n)</math>,</center>
</math></center>


w której pierwsza kolumna <math>\displaystyle  a^{(1)}_1</math> ma niezerową tylko  
w której pierwsza kolumna <math>a^{(1)}_1</math> ma niezerową tylko  
pierwszą współrzędną. W następnym kroku wybieramy drugie  
pierwszą współrzędną. W następnym kroku wybieramy drugie  
przekształcenie Householdera   
przekształcenie Householdera   
<math>\displaystyle \bar H_2=I_{m-1}- v_2 v_2^T/\gamma_2</math> wymiaru <math>\displaystyle m-1</math> tak,  
<math>\bar H_2=I_{m-1}- v_2 v_2^T/\gamma_2</math> wymiaru <math>m-1</math> tak,  
aby przeprowadzało wektor <math>\displaystyle (a^{(1)}_{i,2})_{i=2}^m</math> na kierunek  
aby przeprowadzało wektor <math>(a^{(1)}_{i,2})_{i=2}^m</math> na kierunek  
pierwszego wersora w <math>\displaystyle R^{m-1}</math>. Rozszerzając <math>\displaystyle  v_2\inR^{m-1}</math>  
pierwszego wersora w <math>R^{m-1}</math>. Rozszerzając <math>v_2\in R^{m-1}</math>  
do wektora <math>\displaystyle  u_2\inR^m</math> przez dodanie zera jako pierwszej  
do wektora <math>u_2\in R^m</math> przez dodanie zera jako pierwszej  
współrzędnej, <math>\displaystyle u_2=(0, v_2)^T</math>, otrzymujemy  
współrzędnej, <math>u_2=(0, v_2)^T</math>, otrzymujemy  
przekształcenie (macierz) Householdera  
przekształcenie (macierz) Householdera  
<math>\displaystyle H_2=I_m- u_2 u_2^T/\gamma_2</math> w <math>\displaystyle R^m</math> postaci  
<math>H_2=I_m- u_2 u_2^T/\gamma_2</math> w <math>R^m</math> postaci  


<center><math>\displaystyle H_2\,=\,\left(\begin{array} {cccc}
<center><math>H_2\,=\,\left(\begin{array} {cccc}
     1 &  0^T \\
     1 &  0^T \\
       0 & \bar H_2  \end{array} \right).
       0 & \bar H_2  \end{array} \right)</math></center>
</math></center>


Pomnożenie macierzy <math>\displaystyle A^{(1)}</math> z lewej strony przez <math>\displaystyle H_2</math> spowoduje  
Pomnożenie macierzy <math>A^{(1)}</math> z lewej strony przez <math>H_2</math> spowoduje  
teraz wyzerowanie drugiej kolumny macierzy pod elementem  
teraz wyzerowanie drugiej kolumny macierzy pod elementem  
<math>\displaystyle a^{(1)}_{2,2}</math>, przy czym pierwszy wiersz i pierwsza kolumna  
<math>a^{(1)}_{2,2}</math>, przy czym pierwszy wiersz i pierwsza kolumna  
pozostaną niezmienione. Postępując tak dalej <math>\displaystyle n</math> razy  
pozostaną niezmienione. Postępując tak dalej <math>n</math> razy  
(albo <math>\displaystyle n-1</math> razy gdy <math>\displaystyle m=n</math>) otrzymujemy  
(albo <math>n-1</math> razy gdy <math>m=n</math>) otrzymujemy  


<center><math>\displaystyle H_nH_{n-1}\cdots H_2H_1A\,=\,R,
<center><math>H_nH_{n-1}\cdots H_2H_1A\,=\,R</math>,</center>
</math></center>


gdzie <math>\displaystyle R\inR^{m\times n}</math> jest uogólnioną macierzą trójkątną  
gdzie <math>R\in R^{m\times n}</math> jest uogólnioną macierzą trójkątną  
górną, tzn. <math>\displaystyle r_{i,j}=0</math> dla <math>\displaystyle i>j</math>. Stąd, podstawiając  
górną, tzn. <math>r_{i,j}=0</math> dla <math>i>j</math>. Stąd, podstawiając  
<math>\displaystyle Q=H_1H_2\cdots H_n</math>, dostajemy rozkład macierzy na iloczyn  
<math>Q=H_1H_2\cdots H_n</math>, dostajemy rozkład macierzy na iloczyn  
ortogonalno-trójkątny  
ortogonalno-trójkątny  


<center><math>\displaystyle
<center><math>
   A\,=\,Q\cdot R.  
   A\,=\,Q\cdot R.  
</math></center>
</math></center>


Rzeczywiście, macierz <math>\displaystyle Q\inR^{m\times m}</math> jest ortogonalna, bo  
Rzeczywiście, macierz <math>Q\in R^{m\times m}</math> jest ortogonalna, bo  


<center><math>\displaystyle \aligned Q^{-1} &= (H_1H_2\cdots H_n)^{-1}\,=\,
<center><math>\begin{align} Q^{-1} &= (H_1H_2\cdots H_n)^{-1}\,=\,
     H_n^{-1}\cdots H_2^{-1}H_1^{-1} \\
     H_n^{-1}\cdots H_2^{-1}H_1^{-1} \\
   &= H_n^T\cdots H_2^TH_1^T \,=\,
   &= H_n^T\cdots H_2^TH_1^T \,=\,
     (H_1H_2\cdots H_n)^T\,=\,Q^T.
     (H_1H_2\cdots H_n)^T\,=\,Q^T.
\endaligned</math></center>
\end{align}</math></center>


Dyspunując rozkładem ([[##orttr|Uzupelnic: orttr ]]) zadanie wygładzania liniowego  
Dyspunując rozkładem QR, zadanie wygładzania liniowego  
można rozwiązać następująco. Ponieważ mnożenie przez macierz  
można rozwiązać następująco. Ponieważ mnożenie przez macierz  
ortogonalną nie zmienia normy drugiej wektora, mamy  
ortogonalną nie zmienia normy drugiej wektora, mamy  


<center><math>\displaystyle \aligned \| r\|_2 &= \| b-A x\|_2\;=\;\| b-QR x\|_2 \\
<center><math>\begin{align} \| r\|_2 &= \| b-A x\|_2\;=\;\| b-QR x\|_2 \\
     &= \|Q(Q^T b-R x)\|_2 \;=\;\| c-R x\|_2,
     &= \|Q(Q^T b-R x)\|_2 \;=\;\| c-R x\|_2,
\endaligned</math></center>
\end{align}</math></center>


gdzie <math>\displaystyle  c=Q^T b=H_n\cdots H_2H_1 b</math>.  
gdzie <math>c=Q^T b=H_n\cdots H_2H_1 b</math>.  
Rozbijając wektor <math>\displaystyle  c</math> na <math>\displaystyle  c=( c_I, c_{II})^T</math>,  
Rozbijając wektor <math>c</math> na <math>c=( c_I, c_{II})^T</math>,  
gdzie <math>\displaystyle  c_I\inR^n</math> i <math>\displaystyle  c_{II}\inR^{m-n}</math>, oraz macierz  
gdzie <math>c_I\in R^n</math> i <math>c_{II}\in R^{m-n}</math>, oraz macierz  
<math>\displaystyle R</math> na  
<math>R</math> na  


<center><math>\displaystyle R\,=\,\left(\begin{array} {c} R_I \\ 0\end{array} \right),
<center><math>R\,=\,\left(\begin{array} {c} R_I \\ 0\end{array} \right)</math>,</center>
</math></center>


gdzie <math>\displaystyle R_I\inR^{n\times n}</math> jest macierzą trójkątną górną, a
gdzie <math>R_I\in R^{n\times n}</math> jest macierzą trójkątną górną, a
<math>\displaystyle 0</math> jest macierzą zerową wymiaru <math>\displaystyle (m-n)\times n</math>, otrzymujemy  
<math>0</math> jest macierzą zerową wymiaru <math>(m-n)\times n</math>, otrzymujemy  


<center><math>\displaystyle \| r\|_2^2\;=\;\| c_I-R_I x\|_2^2\,+\,
<center><math>\| r\|_2^2\;=\;\| c_I-R_I x\|_2^2\,+\,
     \| c_{II}\|_2^2.  
     \| c_{II}\|_2^2.  
</math></center>
</math></center>


Rozwiązanie <math>\displaystyle  x^*</math> zadania wygładzania jest więc  
Rozwiązanie <math>x^*</math> zadania wygładzania jest więc  
rozwiązaniem układu liniowego trójkątnego,  
rozwiązaniem układu liniowego trójkątnego,  


<center><math>\displaystyle x^*\,=\,R_I^{-1} c_I,
<center><math>x^*\,=\,R_I^{-1} c_I</math>,</center>
</math></center>


oraz <math>\displaystyle \| r^*\|_2=\| b-A x^*\|_2=\| c_{II}\|_2</math>.  
oraz <math>\| r^*\|_2=\| b-A x^*\|_2=\| c_{II}\|_2</math>.  


Zastanówmy się nad praktyczną realizacją tego algorytmu. Każde  
Zastanówmy się nad praktyczną realizacją tego algorytmu. Każde  
z kolejnych przekształceń Householdera <math>\displaystyle H_k</math> wyznaczamy przez  
z kolejnych przekształceń Householdera <math>H_k</math> wyznaczamy przez  
obliczenie <math>\displaystyle \gamma_k</math> oraz współrzędnych wektora <math>\displaystyle  u_k</math>.  
obliczenie <math>\gamma_k</math> oraz współrzędnych wektora <math>u_k</math>.  
Wektor ten ma tylko <math>\displaystyle m-k+1</math> współrzędnych niezerowych, a ponadto  
Wektor ten ma tylko <math>m-k+1</math> współrzędnych niezerowych, a ponadto  
<math>\displaystyle u_{k,i}=a^{(k-1)}_{i,k}</math> dla <math>\displaystyle k+1\le i\le m</math>. Dzięki takiej  
<math>u_{k,i}=a^{(k-1)}_{i,k}</math> dla <math>k+1\le i\le m</math>. Dzięki takiej  
reprezentacji <math>\displaystyle H_k</math>, mnożenia <math>\displaystyle H_k x</math> możemy dla dowolnego  
reprezentacji <math>H_k</math>, mnożenia <math>H_k x</math> możemy dla dowolnego  
<math>\displaystyle  x</math> realizować według wzoru
<math>x</math> realizować według wzoru


<center><math>\displaystyle (H_k x)_i\,=\,x_i\,-\,s\,u_{k,i},  
<center><math>(H_k x)_i\,=\,x_i\,-\,s\,u_{k,i},  
</math></center>
</math></center>


gdzie <math>\displaystyle s= u_k^T x/\gamma_k</math>.  
gdzie <math>s= u_k^T x/\gamma_k</math>.  


Uwzględnizjąc obecność zerowych elementów w <math>\displaystyle  u_k</math>,  
Uwzględnizjąc obecność zerowych elementów w <math>u_k</math>,  
przejście od macierzy <math>\displaystyle A^{(k-1)}</math> do <math>\displaystyle A^{(k)}</math> kosztuje rzędu  
przejście od macierzy <math>A^{(k-1)}</math> do <math>A^{(k)}</math> kosztuje rzędu  
<math>\displaystyle 4(m-k+1)(n-k)</math> operacji arytmetycznych i obliczenie jednego  
<math>4(m-k+1)(n-k)</math> operacji arytmetycznych i obliczenie jednego  
pierwiastka kwadratowego. Cały rozkład <math>\displaystyle A=QR</math> kosztuje więc  
pierwiastka kwadratowego. Cały rozkład <math>A=QR</math> kosztuje więc  
rzędu (dla dużych <math>\displaystyle m</math> i <math>\displaystyle n</math>)
rzędu (dla dużych <math>m</math> i <math>n</math>)


<center><math>\displaystyle \sum_{k=1}^n 4(m-k+1)(n-k)\,\approx\,\frac 43n^3+2n^2(m-n)
<center><math>\sum_{k=1}^n 4(m-k+1)(n-k)\,\approx\,\frac 43n^3+2n^2(m-n)
   \,=\,2n^2(m-n/3)
   \,=\,2n^2(m-n/3)
</math></center>
</math></center>


operacji arytmetycznych i <math>\displaystyle n</math> pierwiastków kwadratowych. Zauważmy,  
operacji arytmetycznych i <math>n</math> pierwiastków kwadratowych. Zauważmy,  
że w przypadku <math>\displaystyle m=n</math>, a więc dla kwadratowego układu równań,  
że w przypadku <math>m=n</math>, a więc dla kwadratowego układu równań,  
koszt ten wynosi <math>\displaystyle (4/3)n^3</math> i jest dwa razy większy od kosztu  
koszt ten wynosi <math>(4/3)n^3</math> i jest dwa razy większy od kosztu  
eliminacji Gaussa.  
eliminacji Gaussa.  


===Implementacja===
===Implementacja===


Cała informacja o przekształceniu Householdera znajduje się w wektorze <math>\displaystyle u</math> oraz czynniku skalującym <math>\displaystyle \gamma</math> --- i w ten sposób najwygodniej przechowywać macierz Householdera. W żadnym miejscu algorytmu nie będzie nam potrzebne nic ponad umiejętność mnożenia zadanego wektora <math>\displaystyle x</math> przez macierz Householdera <math>\displaystyle H = I - \frac{1}{\gamma}uu^T</math>.  
Cała informacja o przekształceniu Householdera znajduje się w wektorze <math>u</math> oraz czynniku skalującym <math>\gamma</math> --- i w ten sposób najwygodniej przechowywać macierz Householdera. W żadnym miejscu algorytmu nie będzie nam potrzebne nic ponad umiejętność mnożenia zadanego wektora <math>x</math> przez macierz Householdera <math>H = I - \frac{1}{\gamma}uu^T</math>.  


Nie popełnijmy jednak częstego błędu, prostodusznie implementując to mnożenie (przykładowo, w Octave) jako
Nie popełnijmy jednak częstego błędu, prostodusznie implementując to mnożenie (przykładowo, w Octave) jako


  <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>H = eye(length(u)) - (u*u') / <math>\displaystyle \gamma</math>;
  <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>H = eye(length(u)) - (u*u') / <math>\gamma</math>;
y = H*x;
y = H*x;
</pre></div>  
</pre></div>  
   
   
Gdybyśmy użyli takiej implementacji, potrzebowalibyśmy aż <math>\displaystyle O(N^2)</math> miejsc w pamięci (chociaż, przypomnijmy raz jeszcze, cała informacja o <math>\displaystyle H</math> to tylko <math>\displaystyle O(N)</math> liczb). Ponadto, mnożenie przez macierz to aż <math>\displaystyle O(N^2)</math> działań arytmetycznych.
Gdybyśmy użyli takiej implementacji, potrzebowalibyśmy aż <math>O(N^2)</math> miejsc w pamięci (chociaż, przypomnijmy raz jeszcze, cała informacja o <math>H</math> to tylko <math>O(N)</math> liczb). Ponadto, mnożenie przez macierz to aż <math>O(N^2)</math> działań arytmetycznych.


Aby znacznie lepiej skorzystać z bardzo specyficznej postaci macierzy <math>\displaystyle H</math>, która jest po prostu zaburzeniem macierzy identyczności macierzą rzędu co najwyżej 1, wystarczy w odpowiednim miejscu wstawić nawiasy:
Aby znacznie lepiej skorzystać z bardzo specyficznej postaci macierzy <math>H</math>, która jest po prostu zaburzeniem macierzy identyczności macierzą rzędu co najwyżej 1, wystarczy w odpowiednim miejscu wstawić nawiasy:


<center><math>\displaystyle
<center><math>
Hx = \left(I - \frac{1}{\gamma}uu^T\right) \, x = x - \frac{1}{\gamma}uu^Tx =  
Hx = \left(I - \frac{1}{\gamma}uu^T\right) \, x = x - \frac{1}{\gamma}uu^Tx =  
x - \frac{1}{\gamma}u(u^Tx).
x - \frac{1}{\gamma}u(u^Tx)</math></center>
</math></center>


Stąd <strong>prawidłowa</strong> implementacja mnożenia przez macierz Householdera:
Stąd <strong>prawidłowa</strong> implementacja mnożenia przez macierz Householdera:


  <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre><math>\displaystyle \omega</math> = u'*x;
  <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre><math>\omega</math> = u'*x;
y = x - <math>\displaystyle \frac{\omega}{\gamma}</math>*u;
y = x - <math>\frac{\omega}{\gamma}</math>*u;
</pre></div>  
</pre></div>  
   
   
Tym razem wcale nie potrzeba dodatkowej pamięci, a koszt algorytmu jest liniowy(!) względem <math>\displaystyle N</math> --- <math>\displaystyle N</math>-krotny zysk w porównaniu z poprzednim!
Tym razem wcale nie potrzeba dodatkowej pamięci, a koszt algorytmu jest liniowy(!) względem <math>N</math>, a więc uzyskaliśmu <math>N</math>-krotne przyspieszenie w porównaniu z poprzednim!


Jest to całkiem typowe w numeryce:
Jest to całkiem typowe w numeryce:
Linia 412: Linia 389:
<blockquote  style="background-color: #fefeee; padding:1em;  margin-left,margin-right:2em;  margin-top,margin-bottom: 1em;">   
<blockquote  style="background-color: #fefeee; padding:1em;  margin-left,margin-right:2em;  margin-top,margin-bottom: 1em;">   
Optymalizacja kodu źródłowego może być źródłem dużego przyspieszenia programu numerycznego. Ale największe przyspieszenie zazwyczaj jest efektem restrukturyzacji całego algorytmu (lub wręcz jego zmiany).
Optymalizacja kodu źródłowego może być źródłem dużego przyspieszenia programu numerycznego. Ale największe przyspieszenie zazwyczaj jest efektem restrukturyzacji całego algorytmu (lub wręcz jego zmiany).
</blockquote>  
</blockquote>


==Uwarunkowanie==
==Uwarunkowanie==
Linia 422: Linia 399:
{{definicja|Uwarunkowanie macierzy prostokątnej w normie euklidesowej|Uwarunkowanie macierzy prostokątnej w normie euklidesowej|
{{definicja|Uwarunkowanie macierzy prostokątnej w normie euklidesowej|Uwarunkowanie macierzy prostokątnej w normie euklidesowej|


Niech <math>\displaystyle \Sigma(A)</math> będzie zbiorem wartości własnych macierzy <math>\displaystyle A^TA</math>. Definiujemy
Niech <math>\Sigma(A)</math> będzie zbiorem wartości własnych macierzy <math>A^TA</math>. Definiujemy


<center><math>\displaystyle  \mbox{cond} _2(A) = \sqrt{\frac{\max\{\lambda: \lambda \in \Sigma(A)\}}{\min\{\lambda: \lambda \in \Sigma(A)\}}}.
<center><math>\mbox{cond} _2(A) = \sqrt{\frac{\max\{\lambda: \lambda \in \Sigma(A)\}}{\min\{\lambda: \lambda \in \Sigma(A)\}}}</math></center>
</math></center>


(Jeśli w mianowniku pojawiłoby się zero, kładziemy <math>\displaystyle  \mbox{cond} _2(A) = +\infty</math>).
(Jeśli w mianowniku pojawiłoby się zero, kładziemy <math>\mbox{cond} _2(A) = +\infty</math>).
}}
}}


Linia 434: Linia 410:
{{twierdzenie|O uwarunkowaniu zadania wygładzania liniowego|O uwarunkowaniu zadania wygładzania liniowego|
{{twierdzenie|O uwarunkowaniu zadania wygładzania liniowego|O uwarunkowaniu zadania wygładzania liniowego|


Niech <math>\displaystyle x</math> będzie rozwiązaniem zadania najmniejszych kwadratów dla niezerowej prawej strony <math>\displaystyle b</math>,  
Niech <math>x</math> będzie rozwiązaniem zadania najmniejszych kwadratów dla niezerowej prawej strony <math>b</math>,  
<center><math>\displaystyle
<center><math>
||b-Ax||_2\rightarrow \min{} !
||b-Ax||_2\rightarrow \min{} !
</math></center>
</math></center>


i niech <math>\displaystyle \widetilde{x}</math> będzie rozwiązaniem zadania zaburzonego <center><math>\displaystyle
i niech <math>\widetilde{x}</math> będzie rozwiązaniem zadania zaburzonego <center><math>
||\widetilde{b}-\widetilde{A}\widetilde{x}||_2\rightarrow \min{} !,
||\widetilde{b}-\widetilde{A}\widetilde{x}||_2\rightarrow \min{} !</math>,</center>
</math></center>
   
   
przy czym zakładamy, że  
przy czym zakładamy, że  
<center><math>\displaystyle
<center><math>
\frac{||\widetilde{b}-b||_2}{||b||_2}, \quad \frac{||\widetilde{A}-A||_2}{||A||_2} \leq \epsilon,
\frac{||\widetilde{b}-b||_2}{||b||_2}, \quad \frac{||\widetilde{A}-A||_2}{||A||_2} \leq \epsilon</math>,</center>
</math></center>


gdzie <math>\displaystyle \epsilon</math> jest dostatecznie małe.
gdzie <math>\epsilon</math> jest dostatecznie małe.


Oznaczmy  
Oznaczmy  


<center><math>\displaystyle \sin(\theta) = \frac{||b-Ax||_2}{||b||_2} < 1
<center><math>\sin(\theta) = \frac{||b-Ax||_2}{||b||_2} < 1
</math></center>
</math></center>


Linia 459: Linia 433:
Wtedy
Wtedy


<center><math>\displaystyle \frac{||\widetilde{x}-x||_2}{||x||_2} \lesssim \left( \frac{2 \mbox{cond} _2(A)}{\cos(\theta)} + \tan(\theta) \mbox{cond} _2^2(A)\right) \cdot \epsilon.
<center><math>\frac{||\widetilde{x}-x||_2}{||x||_2} \lesssim \left( \frac{2 \mbox{cond} _2(A)}{\cos(\theta)} + \tan(\theta) \mbox{cond} _2^2(A)\right) \cdot \epsilon</math></center>
</math></center>


}}
}}


Generalnie więc, jeśli reszta <math>\displaystyle ||b-Ax||_2</math> jest mała, wrażliwość na zaburzenia jest na poziomie <math>\displaystyle  \mbox{cond} (A)</math>. Ale jeśli reszta jest duża (tzn. prawa strona jest taka, że nie można dobrze spełnić równania <math>\displaystyle b\approx Ax</math> w sensie średniokwadratowym), wtedy wrażliwość może być daleko większa.
Generalnie więc, jeśli reszta <math>||b-Ax||_2</math> jest mała, wrażliwość na zaburzenia jest na poziomie <math>\mbox{cond} (A)</math>. Ale jeśli reszta jest duża (tzn. prawa strona jest taka, że nie można dobrze spełnić równania <math>b\approx Ax</math> w sensie średniokwadratowym), wtedy wrażliwość może być daleko większa.


{{wniosek|||
{{wniosek|||
W przypadku, gdy <math>\displaystyle m \gg n</math>, zdawać by się mogło --- zgodnie z popularnym, acz błędnym, jak za chwilę się okaże, poglądem --- że użycie układu równań normalnych jest najszybszym algorytmem, a skoro tak, to powinno dawać najmniejszą "akumulację błędu zaokrągleń". Tymczasem widzimy, że jest sens rozwiązywać nasze zadanie poprzez układ równań normalnych tylko wtedy, gdy reszta rozwiązania jest duża. W przeciwnym wypadku, gdy <math>\displaystyle \sin(\theta) \ll 1</math>, rozwiązanie obliczone (kosztowniejszym) rozkładem QR będzie miało błąd na poziomie <math>\displaystyle  \mbox{cond} _2(A)</math>, a tymczasem rozwiązanie wyznaczone z układu równań normalnych będzie obarczone błędem na poziomie <math>\displaystyle  \mbox{cond} _2^2(A) >  \mbox{cond} _2(A)</math>.
W przypadku, gdy <math>m \gg n</math>, zdawać by się mogło --- zgodnie z popularnym, acz błędnym, jak za chwilę się okaże, poglądem --- że użycie układu równań normalnych jest najszybszym algorytmem, a skoro tak, to powinno dawać najmniejszą "akumulację błędu zaokrągleń". Tymczasem widzimy, że jest sens rozwiązywać nasze zadanie poprzez układ równań normalnych tylko wtedy, gdy reszta rozwiązania jest duża. W przeciwnym wypadku, gdy <math>\sin(\theta) \ll 1</math>, rozwiązanie obliczone (kosztowniejszym) rozkładem QR będzie miało błąd na poziomie <math>\mbox{cond} _2(A)</math>, a tymczasem rozwiązanie wyznaczone z układu równań normalnych będzie obarczone błędem na poziomie <math>\mbox{cond} _2^2(A) >  \mbox{cond} _2(A)</math>.
}}
}}


Linia 477: Linia 450:
</pre></div>  
</pre></div>  
   
   
Dla zadania najmniejszych kwadratów mamy dwie podstawowe funkcje LAPACKa: <code style="color: #903">DGELS</code>, która rozwiązuje dokładnie zadanie takie, jak postawiliśmy w wykładzie, to znaczy w przypadku, gdy macierz <math>\displaystyle A</math> jest pełnego rzędu --- wykorzystując rozkład QR, który omówiliśmy.
Dla zadania najmniejszych kwadratów mamy dwie podstawowe funkcje LAPACKa: <code style="color: #903">DGELS</code>, która rozwiązuje dokładnie zadanie takie, jak postawiliśmy w wykładzie, to znaczy w przypadku, gdy macierz <math>A</math> jest pełnego rzędu --- wykorzystując rozkład QR, który omówiliśmy.


Natomiast dla przypadku, <strong>gdy macierz nie jest pełnego rzędu</strong>, działa funkcja <code style="color: #903">DGELSS</code>. Wówczas, co łatwo sprawdzić, zadanie najmniejszych kwadratów tak, jak je postawiliśmy, nie musi mieć jednoznacznego rozwiązania. Jednak jeśli dołożyć wymaganie, by znalezione rozwiązanie <math>\displaystyle x</math> miało <strong>minimalną normę</strong> euklidesową spośród wszystkich spełniających warunek <math>\displaystyle ||b-Ax||_2 \rightarrow \min !</math>, to wtedy takie rozwiązanie jest już jedyne. Jednakże dla takiego zadania rozkład QR jest już niewystarczający i stosuje się inny rozkład, tzw. SVD, który wykracza poza ramy naszego wykładu.
Natomiast dla przypadku, <strong>gdy macierz nie jest pełnego rzędu</strong>, działa funkcja <code style="color: #903">DGELSS</code>. Wówczas, co łatwo sprawdzić, zadanie najmniejszych kwadratów tak, jak je postawiliśmy, nie musi mieć jednoznacznego rozwiązania. Jednak jeśli dołożyć wymaganie, by znalezione rozwiązanie <math>x</math> miało <strong>minimalną normę</strong> euklidesową spośród wszystkich spełniających warunek <math>||b-Ax||_2 \rightarrow \min !</math>, to wtedy takie rozwiązanie jest już jedyne. Jednakże dla takiego zadania rozkład QR jest już niewystarczający i stosuje się inny rozkład, tzw. SVD, który wykracza poza ramy naszego wykładu.


Funkcje biblioteczne rozwiązujące zadanie wygładzania liniowego są oczywistym składnikiem wszystkich szanujących się pakietów statystycznych.
Funkcje biblioteczne rozwiązujące zadanie wygładzania liniowego są oczywistym składnikiem wszystkich szanujących się pakietów statystycznych.

Aktualna wersja na dzień 11:17, 12 wrz 2023


Nadokreślone układy równań liniowych

<<< Powrót do strony głównej przedmiotu Metody numeryczne

Zajmiemy się zadaniem wygładzania liniowego, nazywanym też liniowym zadaniem najmniejszych kwadratów. Jest ono uogólnieniem zadania rozwiązywania kwadratowych układów równań liniowych do przypadku, gdy układ jest nadokreślony --- to znaczy, jest więcej równań niż niewiadomych. W takim przypadku nie należy liczyć na to, że uda się nam wskazać rozwiązanie spełniające wszystkie równania (jest ich za dużo!), dlatego będziemy szukać rozwiązania x, które minimalizuje resztę,

||bAx||2

Jest to praktycznie bardzo często pojawiające się zadanie, a autorem pierwszego rozwiązania był nie kto inny jak sam wielki Gauss.

Carl Friedrich Gauss
Zobacz biografię

Okazuje się bowiem, że jeśli np. potraktować b jako dane eksperymentalne (obarczone pewnym losowym błędem pomiaru o rozkładzie normalnym), a x --- parametrami zależności liniowej dla punktów pomiaru zadanych w macierzy A, to x minimalizujący ||bAx||2 (właśnie w tej normie!) jest jednocześnie najbardziej prawdopodobnym zestawem współczynników tej zależności. W języku statystyki takie zadanie nazywa się zadaniem regresji liniowej i jest w tym kontekście bardzo często znajdowane w najrozmaitszych gałęziach nauki --- wszędzie tam, gdzie zachodzi potrzeba dopasowania parametrów liniowego modelu do wyników uzyskanych na drodze eksperymentu.

Stąd zresztą nazwa zadania: wygładzanie liniowe, bo chodzi nam o to, by dopasowując parametry krzywej do wyników eksperymentu, wygładzić ewentualne błędy pomiarowe.

Dopasowanie krzywej minimalizującej błąd średniokwadratowy

Przykład

Przypuśćmy, że dla pewnej funkcji f:[a,b]R obserwujemy jej wartości fi (dokładne lub zaburzone) w punktach ti, 1im. Funkcję tę chcielibyśmy przybliżyć inną funkcją w należącą do pewnej n wymiarowej przestrzeni liniowej W, np. przestrzeni wielomianów stopnia mniejszego niż n. Jakość przybliżenia mierzymy, sprawdzając, jak dokładnie spełniona jest przybliżona równość fiw(ti), dokładniej, badając tzw. błąd średniokwadratowy,

1mi=1m(fiw(ti))2

Wybierając pewną bazę (wj)j=1n w W i rozwijając w w tej bazie, w(t)=j=1ncjwj(t), sprowadzamy problem do minimalizacji

i=1m(fij=1ncjwj(ti))2

względem cj, a więc do zadania wygładzania liniowego.

Rzeczywiście, kładąc A=(ai,j)Rm×n z ai,j=wj(ti), b=(fi)i=1m i x=(cj)j=1n, reszta jest równa bAx22, a minimalizacja reszty jest oczywiście równoważna minimalizacji błędu średniokwadratowego.

Wielomian w (czerwony) stopnia 3, aproksymujący 7 zadanych wartości (zaznaczone na zielono) danej funkcji f w sensie minimalizacji błędu średniokwadratowego

Powyższe zadanie aproksymacji średniokwadratowej w zadanych węzłach (xi,yi), i=1,,m. wielomianem stopnia co najwyżej N, realizuje w Octave funkcja polyfit(x,y,N). (Co dostaniemy, gdy N=m1?)

Można pokazać, że rozwiązanie minimalizujące błąd średniokwadratowy jest najbardziej prawdopodobnym zestawem parametrów naszego (liniowego) modelu, gdy zmierzone wartości fi mogą być zaburzone losowym błędem pomiarowym.

W kontekście nie-statystycznym, możemy myśleć o zadaniu wygładzania liniowego jako sposobie skrócenia listy parametrów x modelu przy zachowaniu przybliżonego spełnienia warunków modelu, tzn. Axb.

Dodajmy, że spotyka się uogólnienie tego zadania w formie następującej: dla danych wartości bRm, i danej funkcji F:RnRm, znaleźć xRn minimalizujący resztę:

||bF(x)||2

Właśnie tego typu nieliniowe zadanie najmniejszych kwadratów rozwiązują np. nasze przenośne [ odbiorniki GPS]... Na marginesie zauważmy, że gdy F jest liniowa, zadanie sprowadza się do poprzedniego. W niniejszym wykładzie ograniczymy się wyłącznie do liniowego zadania najmniejszych kwadratów, nieliniowe jest omówiane na wykładzie z metod optymalizacji.

Układ równań normalnych

Niech A będzie daną macierzą o m wierszach i n kolumnach, ARm×n, taką, że

mn=rank(A),

albo równoważnie, taką że jej wektory kolumny są liniowo niezależne. Niech także dany będzie wektor bRm. Jasne jest, że wtedy układ równań Ax=b nie zawsze ma rozwiązanie - mówimy, że układ jest nadokreślony.

Zadanie wygładzania liniowego polega na znalezieniu wektora x*Rn, który minimalizuje wektor residualny (wektor reszty) r=bAx w normie drugiej, tzn.

bAx*2=minxRnbAx2

Lemat

Zadanie wygładzania liniowego ma jednoznaczne rozwiązanie x*, które można scharakteryzować jako rozwiązanie układu równań

ATAx=ATb

Zauważmy, że jeśli macierz A jest kwadratowa, m=n, to rozwiązaniem jest x*=A1b i residuum jest zerem. Zadanie wygładzania liniowego jest więc uogólnieniem rozwiązywania kwadratowych układów równań liniowych.

Równanie powyższe nazywa się układem równań normalnych. Może ono nam sugerować sposób rozwiązania zadania wygładzania liniowego. Wystarczy bowiem pomnożyć macierz AT przez A i rozwiązać układ normalny. Zauważmy ponadto, że macierz ATA jest symetryczna i dodatnio określona, bo (ATA)T=ATA i dla x0 mamy xT(ATA)x=(Ax)T(Ax)=Ax2>0, przy czym ostatnia nierówność wynika z faktu, że kolumny macierzy A są liniowo niezależne i dlatego Ax0. Przy mnożeniu AT przez A wystarczy więc obliczyć tylko elementy na głównej przekątnej i pod nią, a do rozwiązania równania z macierzą ATA można zastosować algorytm Cholesky'ego-Banachiewicza. Jak łatwo się przekonać, koszt takiego algorytmu wynosi n2(m+n/3), przy czym dominuje koszt mnożenia obliczenia macierzy ATA.

Ma on jednak pewne wady. Mnożenie macierzy powoduje w flν powstanie po drodze dodatkowych błędów, które mogą nawet zmienić rząd macierzy. Na przykład, dla macierzy

A=(1111ϵϵϵϵ)

mamy

ATA=(1+ϵ211111+ϵ211111+ϵ211111+ϵ2)

Jeśli ϵ2<ν to flν(1+ϵ2)=1, co implikuje rank(flν(ATA))=1, podczas, gdy rank(flν(A))=4. Inne potencjalne wady układu równań normalnych wymieniamy w dalszej części wykładu.

Poniżej przedstawimy inną metodę rozwiązywania zadania wygładzania liniowego, która oparta jest na specjalnych przekształceniach zwanych odbiciami Householdera.

Odbicia Householdera

Dla danego wektora wRm o normie w2=wTw=1, odbicie (macierz) Householdera zdefiniowane jest jako

H=I2wwT

Zauważmy, że

Hx=x2(wTx)w,

a ponieważ (wTx)w=(x,w)2w jest rzutem prostopadłym x na kierunek wektora w ((,)2 oznacza iloczyn skalarny), to Hx jest odbiciem lustrzanym wektora x względem hiperpłaszczyzny (wymiaru m1) prostopadłej do w.

Odbicia Householdera są przekształceniami nieosobliwymi spełniającymi

H1=H=HT

Rzeczywiście, ponieważ w ma normę jednostkową, mamy

H2=(I2wwT)2=I4wwT+4w(wTw)wT=I,

oraz

HT=(I2wwT)T=I2(wT)TwT=I.

W szczególności H jest więc przekształceniem ortogonalnym, H1=HT, czyli nie zmienia długości wektora,

Hx2=(Hx)T(Hx)=xT(HTH)x=xTx=x2

Odbicia Householdera zastosujemy do przeprowadzenia danego wektora x0 na kierunek innego niezerowego wektora, powiedzmy e, tzn.

Hx=(I2wwT)x=αe


Załóżmy dla uproszczenia, że e2=1. Aby wyznaczyć H zauważmy, że

w=xαe2(wTx),

a ponieważ α=±x2 i w2=1 to

w=xx2exx2e2

W szczególności, jeśli e=e1 jest pierwszym wersorem, powyższe wzory dają

H=IuuTγ,

gdzie

ui={x1x2i=1,xi2im,

oraz

γ=12u22=12((x1x2)2+i=2mxi2)=12(i=1mxi2+x222x1x2)=x22x1x2.

Otrzymaliśmy dwa odbicia Householdera przekształcające dany wektor x na kierunek pierwszego wersora, w zależności od wybranego znaku przy x2. Ustalimy ten znak na plus gdy x10 oraz na minus gdy x1<0, co pozwoli na obliczenie u1 i γ z małym błędem względem w flν. Wtedy bowiem mamy

u1={x1+x2x10,x1x2x1<0,

oraz γ=x22+|x1|x2, czyli zawsze dodajemy liczby tych samych znaków. Ponadto pierwsza współrzędna wektora Hx jest równa x2, gdy x10, a +x2 jeśli x1<0.

Rozkład QR

Odbić Householdera można użyć do rozkładu macierzy ARm×n na iloczyn ortogonalno-trójkątny.

Niech A=(a1,a2,,an), gdzie aj są wektorami-kolumnami macierzy A. Wybierzmy pierwsze odbicie Householdera H1=Imu1u1T/γ1 tak, aby przekształcało pierwszy wektor-kolumnę macierzy A na kierunek e1. Efektem pomnożenia macierzy A z lewej strony przez H1 będzie wtedy macierz

A(1)=(a1(1),,an(1))=(H1a1,,H1an),

w której pierwsza kolumna a1(1) ma niezerową tylko pierwszą współrzędną. W następnym kroku wybieramy drugie przekształcenie Householdera H¯2=Im1v2v2T/γ2 wymiaru m1 tak, aby przeprowadzało wektor (ai,2(1))i=2m na kierunek pierwszego wersora w Rm1. Rozszerzając v2Rm1 do wektora u2Rm przez dodanie zera jako pierwszej współrzędnej, u2=(0,v2)T, otrzymujemy przekształcenie (macierz) Householdera H2=Imu2u2T/γ2 w Rm postaci

H2=(10T0H¯2)

Pomnożenie macierzy A(1) z lewej strony przez H2 spowoduje teraz wyzerowanie drugiej kolumny macierzy pod elementem a2,2(1), przy czym pierwszy wiersz i pierwsza kolumna pozostaną niezmienione. Postępując tak dalej n razy (albo n1 razy gdy m=n) otrzymujemy

HnHn1H2H1A=R,

gdzie RRm×n jest uogólnioną macierzą trójkątną górną, tzn. ri,j=0 dla i>j. Stąd, podstawiając Q=H1H2Hn, dostajemy rozkład macierzy na iloczyn ortogonalno-trójkątny

A=QR.

Rzeczywiście, macierz QRm×m jest ortogonalna, bo

Q1=(H1H2Hn)1=Hn1H21H11=HnTH2TH1T=(H1H2Hn)T=QT.

Dyspunując rozkładem QR, zadanie wygładzania liniowego można rozwiązać następująco. Ponieważ mnożenie przez macierz ortogonalną nie zmienia normy drugiej wektora, mamy

r2=bAx2=bQRx2=Q(QTbRx)2=cRx2,

gdzie c=QTb=HnH2H1b. Rozbijając wektor c na c=(cI,cII)T, gdzie cIRn i cIIRmn, oraz macierz R na

R=(RI0),

gdzie RIRn×n jest macierzą trójkątną górną, a 0 jest macierzą zerową wymiaru (mn)×n, otrzymujemy

r22=cIRIx22+cII22.

Rozwiązanie x* zadania wygładzania jest więc rozwiązaniem układu liniowego trójkątnego,

x*=RI1cI,

oraz r*2=bAx*2=cII2.

Zastanówmy się nad praktyczną realizacją tego algorytmu. Każde z kolejnych przekształceń Householdera Hk wyznaczamy przez obliczenie γk oraz współrzędnych wektora uk. Wektor ten ma tylko mk+1 współrzędnych niezerowych, a ponadto uk,i=ai,k(k1) dla k+1im. Dzięki takiej reprezentacji Hk, mnożenia Hkx możemy dla dowolnego x realizować według wzoru

(Hkx)i=xisuk,i,

gdzie s=ukTx/γk.

Uwzględnizjąc obecność zerowych elementów w uk, przejście od macierzy A(k1) do A(k) kosztuje rzędu 4(mk+1)(nk) operacji arytmetycznych i obliczenie jednego pierwiastka kwadratowego. Cały rozkład A=QR kosztuje więc rzędu (dla dużych m i n)

k=1n4(mk+1)(nk)43n3+2n2(mn)=2n2(mn/3)

operacji arytmetycznych i n pierwiastków kwadratowych. Zauważmy, że w przypadku m=n, a więc dla kwadratowego układu równań, koszt ten wynosi (4/3)n3 i jest dwa razy większy od kosztu eliminacji Gaussa.

Implementacja

Cała informacja o przekształceniu Householdera znajduje się w wektorze u oraz czynniku skalującym γ --- i w ten sposób najwygodniej przechowywać macierz Householdera. W żadnym miejscu algorytmu nie będzie nam potrzebne nic ponad umiejętność mnożenia zadanego wektora x przez macierz Householdera H=I1γuuT.

Nie popełnijmy jednak częstego błędu, prostodusznie implementując to mnożenie (przykładowo, w Octave) jako

H = eye(length(u)) - (u*u') / <math>\gamma</math>;
y = H*x;

Gdybyśmy użyli takiej implementacji, potrzebowalibyśmy aż O(N2) miejsc w pamięci (chociaż, przypomnijmy raz jeszcze, cała informacja o H to tylko O(N) liczb). Ponadto, mnożenie przez macierz to aż O(N2) działań arytmetycznych.

Aby znacznie lepiej skorzystać z bardzo specyficznej postaci macierzy H, która jest po prostu zaburzeniem macierzy identyczności macierzą rzędu co najwyżej 1, wystarczy w odpowiednim miejscu wstawić nawiasy:

Hx=(I1γuuT)x=x1γuuTx=x1γu(uTx)

Stąd prawidłowa implementacja mnożenia przez macierz Householdera:

<math>\omega</math> = u'*x;
y = x - <math>\frac{\omega}{\gamma}</math>*u;

Tym razem wcale nie potrzeba dodatkowej pamięci, a koszt algorytmu jest liniowy(!) względem N, a więc uzyskaliśmu N-krotne przyspieszenie w porównaniu z poprzednim!

Jest to całkiem typowe w numeryce:

Optymalizacja kodu źródłowego może być źródłem dużego przyspieszenia programu numerycznego. Ale największe przyspieszenie zazwyczaj jest efektem restrukturyzacji całego algorytmu (lub wręcz jego zmiany).

Uwarunkowanie

Łatwo domyślać się, że uwarunkowanie zadania wygładzania będzie miało jakieś cechy podobieństwa do uwarunkowania zadania rozwiązywania układu równań liniowych. Ale są także różnice, gdyż, w przeciwieństwie do układu równań liniowych, wrażliwość rozwiązania na zaburzenia będzie zależna nie tylko od samej macierzy układu, ale także od prawej strony.

Najpierw jednak musimy rozszerzyć pojęcie uwarunkowania macierzy na macierze prostokątne.

Definicja Uwarunkowanie macierzy prostokątnej w normie euklidesowej

Niech Σ(A) będzie zbiorem wartości własnych macierzy ATA. Definiujemy

cond2(A)=max{λ:λΣ(A)}min{λ:λΣ(A)}

(Jeśli w mianowniku pojawiłoby się zero, kładziemy cond2(A)=+).

Zauważmy, że jest to rozszerzenie definicji zgodne z tym, co wcześniej definiowaliśmy dla macierzy kwadratowych.

Twierdzenie O uwarunkowaniu zadania wygładzania liniowego

Niech x będzie rozwiązaniem zadania najmniejszych kwadratów dla niezerowej prawej strony b,

||bAx||2min!
i niech x~ będzie rozwiązaniem zadania zaburzonego
||b~A~x~||2min!,

przy czym zakładamy, że

||b~b||2||b||2,||A~A||2||A||2ϵ,

gdzie ϵ jest dostatecznie małe.

Oznaczmy

sin(θ)=||bAx||2||b||2<1

--- będzie to miara, jak bardzo jesteśmy w stanie zminimalizować resztę w oryginalnym zadaniu.

Wtedy

||x~x||2||x||2(2cond2(A)cos(θ)+tan(θ)cond22(A))ϵ

Generalnie więc, jeśli reszta ||bAx||2 jest mała, wrażliwość na zaburzenia jest na poziomie cond(A). Ale jeśli reszta jest duża (tzn. prawa strona jest taka, że nie można dobrze spełnić równania bAx w sensie średniokwadratowym), wtedy wrażliwość może być daleko większa.

Wniosek

W przypadku, gdy mn, zdawać by się mogło --- zgodnie z popularnym, acz błędnym, jak za chwilę się okaże, poglądem --- że użycie układu równań normalnych jest najszybszym algorytmem, a skoro tak, to powinno dawać najmniejszą "akumulację błędu zaokrągleń". Tymczasem widzimy, że jest sens rozwiązywać nasze zadanie poprzez układ równań normalnych tylko wtedy, gdy reszta rozwiązania jest duża. W przeciwnym wypadku, gdy sin(θ)1, rozwiązanie obliczone (kosztowniejszym) rozkładem QR będzie miało błąd na poziomie cond2(A), a tymczasem rozwiązanie wyznaczone z układu równań normalnych będzie obarczone błędem na poziomie cond22(A)>cond2(A).

Biblioteki

W Octave, zadanie najmniejszych kwadratów rozwiązujemy praktycznie tak samo, jak równanie liniowe:

x = A \ b;

Dla zadania najmniejszych kwadratów mamy dwie podstawowe funkcje LAPACKa: DGELS, która rozwiązuje dokładnie zadanie takie, jak postawiliśmy w wykładzie, to znaczy w przypadku, gdy macierz A jest pełnego rzędu --- wykorzystując rozkład QR, który omówiliśmy.

Natomiast dla przypadku, gdy macierz nie jest pełnego rzędu, działa funkcja DGELSS. Wówczas, co łatwo sprawdzić, zadanie najmniejszych kwadratów tak, jak je postawiliśmy, nie musi mieć jednoznacznego rozwiązania. Jednak jeśli dołożyć wymaganie, by znalezione rozwiązanie x miało minimalną normę euklidesową spośród wszystkich spełniających warunek ||bAx||2min!, to wtedy takie rozwiązanie jest już jedyne. Jednakże dla takiego zadania rozkład QR jest już niewystarczający i stosuje się inny rozkład, tzw. SVD, który wykracza poza ramy naszego wykładu.

Funkcje biblioteczne rozwiązujące zadanie wygładzania liniowego są oczywistym składnikiem wszystkich szanujących się pakietów statystycznych.

Literatura

W celu dogłębnego zapoznania się z omawianym na wykładzie materiałem, przeczytaj rozdział 5.3 w

  • D. Kincaid, W. Cheney Analiza numeryczna, Wydawnictwa Naukowo-Techniczne, Warszawa 2006, ISBN 83-204-3078-X.

Bardzo dużo na temat rozwiązywania liniowego zadania najmniejszych kwadratów można dowiedzieć się z książki

  • A. Kiełbasiński, H. Schwetlick, Numeryczna algebra liniowa, Wydawnictwa Naukowo-Techniczne, Warszawa, 1992.