Aby ocenić wartość hodowlaną
(5.1) |
Szukane wartości hodowlane zwierząt oznaczone są jako wektor
Pozostałe parametry występujące w (5.1) —
Wreszcie, o macierzy
W praktyce [19, Table 1] spotyka się zadania dla
Poniżej zacytujemy konkretne zadanie modelowe opisane w [29].
W oparciu o metodę BLUP wykonać ocenę wartości hodowlanej zwierząt dla cechy masa cieląt przy odsadzeniu w oparciu o następujące informacje:
Cielę | Płeć | Ojciec | Matka | Waga przy odsadzeniu (kg) |
4 | buhajek | 1 | - | 4,5 |
5 | cieliczka | 3 | 2 | 2,9 |
6 | cieliczka | 1 | 2 | 3,9 |
7 | buhajek | 4 | 5 | 3,5 |
8 | buhajek | 3 | 6 | 5,0 |
Zebrane informacje fenotypowe prowadzą do zadania (5.1), w którym
parametr
Zadanie wydaje się łatwe do rozwiązania: dane są macierze i parametry, wskazany jest układ
G = [X'*X, X'*Z ; Z'*X, Z'*Z + k*inv(A)]; r = [X'*y; Z'*y]; s = inv(G)*r; b = s(1:2); a = s(3:end);
Przedyskutujmy wady i zalety powyższego rozwiązania. Tym, co od razu kłuje na w oczy, jest używanie funkcji inv
do wyznaczania macierzy odwrotnej do
metodą s = inv(G)*r
powinno zjeżyć nam włos na głowie. Oczywiście, choć matematycznie jest to poprawne, w realizacji numerycznej nie powinniśmy wyznaczać wprost macierzy odwrotnej! Znacznie lepiej dokonać rozkładu LDL macierzy
s = G\r;
Zapatrzeni w odwracanie macierzy, możemy przeoczyć inną niepokojącą cechę układu (5.1): jeśli bowiem
To jest przecież nic innego, jak macierz równań normalnych dla zadania najmniejszych kwadratów
— a zadanie najmniejszych kwadratów, jak wiemy, bezpieczniej rozwiązywać metodami innymi niż poprzez układ równań normalnych: na przykład, opartymi na rozkładzie QR macierzy
Biorąc więc
(5.2) |
Problem z ostatnim sformułowaniem problemu polega na tym, że aby go postawić, musimy wyznaczyć
Jednak po chwili namysłu możemy zobaczyć, że
dostajemy
Ostatecznie więc, zamiast zadania (5.1) należy rozwiązać równoważne zadanie najmniejszych kwadratów,
(5.3) |
Jeśli obecność macierzy odwrotnej w powyższym sformułowaniu wciąż nas niepokoi, możemy drążyć dalej. Rozpisując, dostajemy inną postać minimalizowanego wyrażenia (5.3),
Oznaczając
— a tu już nie występuje macierz odwrotna do
Wyznacz rozkład Cholesky'ego
Wyznacz rozwiązanie
(5.4) |
gdzie
Oblicz
Dzięki odpowiedniemu potraktowaniu problemu, całkowicie uniknęliśmy wyznaczania macierzy odwrotnych oraz niepotrzebnego przekształcania zadania najmniejszych kwadratów do postaci normalnej.
Rozkład Cholesky'ego macierzy U = chol(A)
. Jednak musimy pamiętać, że wynikiem działania chol(A)
jest macierz trójkątna górna taka, że
B = [X Z*U'; zeros(n,2), sqrt(k)*eye(size(U))];
Dalej, wystarczy rozwiązać zadanie najmniejszych kwadratów z macierzą
f = [y; zeros(n,1)]; q = B \ f; b = q(1:2); a = U'*q(3:end);
Przypomnijmy, że w Octave zadanie najmniejszych kwadratów rozwiązuje się, korzystając z tego samego operatora ,,dzielenia”, \
, który służy do rozwiązywania układów równań.
Jednak nasze zadanie jest bardzo szczególnej postaci blokowej: blok
co spowoduje, że iloczyn
Dotychczas atakowaliśmy postawione zadanie przy minimalnej wiedzy o jego naturze. Staraliśmy się przyjąć neutralny punkt widzenia numeryka, pozwalający nam dostrzec w zadaniu pewne typowe cechy samego zadania obliczeniowego. Jednak tym, co naprawdę jest piękne w obliczeniach naukowych jest to, że zadania — choć na swój sposób typowe — mają swoje niuanse, które powodują, że czasem warto zmienić swój punkt widzenia i dopasować używane metody do tego, co więcej wiemy o charakterze zadania!
Jak dotąd, braliśmy pod uwagę jedynie fakt, że macierz
Przypomnijmy powody:
Wyznaczenie macierzy odwrotnej
Aby dla danego
Nawet jeśli
Tymczasem okazuje się, że spotykane w praktyce modele (5.1) korzystają z macierzy
A = [0 0 0 1/2 0 1/2 1/4 1/4; 0 0 0 0 1/2 1/2 1/4 1/4; 0 0 0 0 1/2 0 1/4 1/2; 0 0 0 0 0 1/4 1/2 1/8; 0 0 0 0 0 1/4 1/2 3/8; 0 0 0 0 0 0 1/4 1/2; 0 0 0 0 0 0 0 1/4; 0 0 0 0 0 0 0 0;]; n = size(A,1); A = A + A' + eye(n); inv(A)
Jednak, jeśli sprawdzić w fachowej literaturze (np. w [19]) definicję macierzy
gdzie
Widzimy więc, że macierz
To odkrycie zmienia nasz punkt widzenia! Jeśli bowiem mamy do dyspozycji rozrzedzoną macierz
B = [X Z; zeros(n,2), spdiag(sqrt(k*d))*(speye(n)-P)];
Niektóre badania mogą dotyczyć
Przede wszystkim, należy wykorzystać fakt, że macierze
Jeśli więc utworzymy sparse
), to macierz \
zostanie przyłożony do prostokątnej macierzy rzadkiej, spowoduje wywołanie specjalizowanej funkcji bibliotecznej z pakietu CXSPARSE, wykonującej rzadki rozkład QR.
Równań normalnych nie musimy się obawiać, gdy uwarunkowanie macierzy
Gdy
Stosując metodę iteracyjną, można przy okazji uniknąć składania całej wielkiej macierzy
Alternatywą dla rozwiązania układu równań normalnych metodą PCG możne być rozwiązanie (nieco lepiej uwarunkowanego) zadania z (pozornie!) wielką macierzą kwadratową
gdzie
Rzeczywiście,
Ponieważ macierz
M = [alpha*speye(size(B,1)), B; B', spalloc(size(B,2),size(B,2))]; [X,info,relres] = pcr(M,[y;zeros(size(B,2),1)]); info q = X(size(B,1)+1:end);może efektywnością ustąpić miejsca bardziej wyrafinowanej, korzystającej z operatorowej definicji
Mmult = @(x) [alpha*x(1:size(B,1)) + B*x(size(B,1)+1:end); B'*x(1:size(B,1))]; [X,info,relres] = pcr(Mmult,[y;zeros(size(B,2),1)]); info q = X(size(B,1)+1:end);Koszt mnożenia wektora przez
Możemy też próbować mnożenie przez
gdy ojcem
a gdy żadne z rodziców zwierzęcia
Stąd wynika, że
przy czym elementy tej macierzy należy rozrzucić na trójkę
Niech będzie dana tabela
Podobnie określamy
Jeśli chcesz zbliżyć się do realnych warunków pracy, przyjmij założenie, że dane z tablicy
W bardzo licznych zastosowaniach statystycznych należy wskazać zestaw tych wartości własnych (i, przy okazji, wektorów własnych) macierzy kowariancji
W sformułowaniu matematycznym, mając zadaną macierz
gdzie
Napisz funkcję, która wykona to zadanie.
Funkcja Octave, realizująca nasze zadanie mogłaby mieć postać:
function [V, L] = pca1(X, eta) [V, L] = eig(X'*X); [L, I] = sort(diag(L), 'descend'); V = V(:,I); I = find(L>eta); V = V(:,I); L = L(I); end
Dodatkowo, nasza funkcja sortuje wektory i wartości własne w kolejności od największej, do najmniejszej.
Jednak ma ona tę wadę, że formując macierz
i faktu, że svd
zwraca macierze
function [V, L] = pca(X, eta) [U L V] = svd(X,0); % economy-version [L, I] = sort(diag(L).^2, 'descend'); V = V(:,I); I = find(L>eta); V = V(:,I); L = L(I); end
Treść automatycznie generowana z plików źródłowych LaTeXa za pomocą oprogramowania wykorzystującego LaTeXML.
strona główna | webmaster | o portalu | pomoc
© Wydział Matematyki, Informatyki i Mechaniki UW, 2009-2010. Niniejsze materiały są udostępnione bezpłatnie na licencji Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Bez utworów zależnych 3.0 Polska.
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego.
Projekt współfinansowany przez Ministerstwo Nauki i Szkolnictwa Wyższego i przez Uniwersytet Warszawski.