SVD, pseudoinverse en PCA: SVD, pseudoinverse en PCA in MATLAB
Pseudoinverse
MATLAB heeft de functie pinv
aan boord om numeriek de pseudoinverse van een matrix te bepalen.
Voorbeeld 1: lineaire regressie Eerst rekenen we het voorbeeld uit de lestekst na:
>> A = [1 1; 1 2; 1 3] % matrix A voor regressielijn
A =
1 1
1 2
1 3
>> b = [2; 2; 4] % gegevensvector
b =
2
2
4
Ainv = pinv(A) % pseudoinverse
Ainv =
1.3333 0.3333 -0.6667
-0.5000 0.0000 0.5000
>> Ainv * b % coëfficiënten regressielijn
ans =
0.6667
1.0000
Hier staat de uitkomst: . We kunnen het resultaat ook via de singulierewaardenontbinding berekenen.
>> [U S V] = svd(A) % singulierewaardenontbinding
U =
-0.3231 0.8538 0.4082
-0.5475 0.1832 -0.8165
-0.7719 -0.4873 0.4082
S =
4.0791 0
0 0.6005
0 0
V =
-0.4027 0.9153
-0.9153 -0.4027
>> Splus = zeros(2,3);
>> Splus(1:2,1:2) = S(1:2,1:2)^(-1)
Splus =
0.2451 0 0
0 1.6653 0
>> Ainv = V * Splus * U' % pseudoinverse
Ainv =
1.3333 0.3333 -0.6667
-0.5000 0.0000 0.5000
>> Ainv * b % coëfficiënten regressielijn
ans =
ans =
0.6667
1.0000
Voorbeeld 2: kwadratische regressie Het tweede voorbeeld betreft een gegevensverzameling die we construëren door ruis aan de parabool toe te voegen. We zoeken daarna de best bij de gegevens passende parabool. In onze dataset wordt deze bij benadering .
>> x = [0:0.5:4]';
>> m = length(x);
>> y = ones(m,1) - 2*x + x.^2/2; % parabool
>> y = y + 0.1*max(y)*(2*rand(m,1)-ones(m,1)); % 10 procent ruis toegevoegd
>> A = [ones(m,1) x x.^2 ]
>> pinvA = pinv(A); c = pinvA*y % pseudoinverse van A geeft regressiecoëfficiënten
c =
0.9204
-1.8975
0.4769
>> xx = linspace(-0.1,4.1,50);
>> yy = c(1)+ c(2)*xx + c(3)*xx.^2;
>> plot(x, y, 'bo', xx, yy, 'g-','LineWidth', 2) % visualisatie data + benadering
Ontgrendel volledige toegang