SVD, pseudoinverse en PCA: SVD, pseudoinverse en PCA in MATLAB

Theorie 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

kwadfit.png

About us ⋅ Help ⋅ Privacy ⋅ Terms and conditions
Copyright © 2023 SOWISO