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: \(y= 0.6667+ t\). 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 \(1-2x+\frac{1}{2}x^2\) toe te voegen. We zoeken daarna de best bij de gegevens passende parabool. In onze dataset wordt deze bij benadering \(y=0.92-1.90x+0.48x^2\).
>> 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