Least squares über SVD



  • Hallo,
    ich versuche testweise Datenfehler zu minimieren. Es ist möglich über SVD die Methode der kleinsten Quadrate anzuwenden.
    Das ganze wollte ich mit sinus ausprobieren, wo ich einen Fehler von 0.001 hinzuaddiert habe.
    Wenn ich allerdings cv::solve() anwende und die Matrix x erhalte, und die Test-Daten mit x multipliziere, erhalte ich Fehler, die deutlich größer sind als 0.001.
    Hat jemand eine Idee, weshalb das passiert? Habe ich einen Denkfehler? Ist das Problem möglicherweise, dass eine Sinus-Funktion keine lineare Funktion ist?

    Danke im Voraus

    #include <vector>
    #include <opencv2/core.hpp>
    #include <cmath>
    
    int main()
    {
        std::vector<double> x_data;
        std::vector<double> y_distorted_data;
        std::vector<double> y_real_data;
    
    
        for(double x = 0.0; x < (M_PI + 0.1); x += 0.1)
        {
            x_data.emplace_back(x);
            const double y = std::sin(x);
            y_real_data.emplace_back(y);
            y_distorted_data.emplace_back(y + 0.001);
        }
    
        cv::Mat A(x_data);
        cv::Mat b(y_distorted_data);
    
        cv::Mat x;
        cv::solve(A, b, x, cv::DECOMP_SVD);
    
    
        // Predict
        cv::Mat matSolution = A * x;
    
        std::vector<double> solution;
        for (int i = 0; i <x_data.size(); ++i)
        {
            solution.emplace_back(matSolution.at<double>(i, 0));
        }
    
        std::vector<double> diff;
        for (int i = 0; i <x_data.size(); ++i)
        {
            diff.emplace_back(solution[i] - y_real_data[i]);
        }
    
    
        return 0;
    }
    


  • Ich bin zum Schluss gekommen, dass das einfach am nicht-linearen Problem liegt und SVD dafür nicht gemacht ist.


Anmelden zum Antworten