Ankündigung

Einklappen
Keine Ankündigung bisher.

Singulärwertzerlegung in PHP programmieren

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Singulärwertzerlegung in PHP programmieren

    Hallo!

    Ich habe eine Matrix A:
    1 1
    0 1
    1 0
    Diese Matrix stelle ich in PHP ja wohl am besten als zweidimensionales Array dar, oder?
    Jetzt möchte ich die Singulärwertzerlegung (A=USV) daraus programmieren.
    Könnt ihr mir dabei helfen? Das wäre super! Danke im Voraus!

    Wer nicht weiß, was "Singulärwertzerlegung" ist, kann hier klicken.

  • #2
    Für Python gibt es die numpy Bibliothek und diese stellt eine Methode zur Berechnung der Matrizen bereit. Für PHP kenne ich nichts vergleichbares.

    Kommentar


    • #3
      Danke, sieht gut aus. Muss ich mir mal angucken.

      Ich habe noch einige Links rausgesucht, auf denen die SVD erklärt wird:
      http://fed.matheplanet.com/mprender....ringid=1080115
      Singular Value Decomposition (SVD) tutorial
      SVD and LSI Tutorial 4: Latent Semantic Indexing (LSI) How-to Calculations
      Singulärwertzerlegung – Wikipedia
      Und der QR-Algorithmus:
      QR-Algorithmus – Wikipedia

      Vielleicht kann mir damit noch jemand in PHP weiterhelfen?

      Kommentar


      • #4
        Dann leg doch mal vor.

        Kommentar


        • #5
          OK, ich versuchs!

          Also hier findet man auf jeden Fall schon mal eine JavaScript-Version. Da kann man sich vielleicht etwas abgucken oder es komplett in PHP umschreiben:
          http://users.telenet.be/paul.larmuseau/SVD.htm

          Mein Ansatz:
          1) A = USV
          2) Man muss die Eigenwerte und Eigenvektoren von AAT und ATA finden
          3) Die Eigenvektoren von ATA bilden die Spalten von V
          4) Die Eigenvektoren von AAT bilden die Spalten von U
          5) Die Singulärwerte in S sind die Quadratwurzeln der Eigenwerte aus AAT oder ATA; die Singulärwerte sind die diagonalen Elemente von S

          Zu 3, 4 und 5:
          Man muss AAT zu einer nxn-Matrix machen: Von dieser Matrix kann man dann die Eigenwerte nehmen. Dasselbe gilt für ATA.

          Das ist der Ansatz. Könnt ihr mir jetzt vielleicht helfen, das zu programmieren? Das wäre echt super, ich hab mir da jetzt so viel durchgelesen in den letzten Wochen (auch bevor ich hier gefragt habe), es wäre schade, wenn das umsonst war. Und einen Ansatz habe ich ja. Das oben ist eigentlich der komplette Lösungsweg. Den muss man "nur" noch programmieren.

          Kommentar


          • #6
            Vorweg: Ich hab keine Ahnung von Matrizen.

            Ich möchte dir empfehlen das mit OOP aufzuziehen, ist am Ende dann am verständlichsten und sehr gut wieder zu verwenden oder zu erweitern.

            AAT und ATA sind Objekte mit einer Methode, die den Eigenverktor liefert.
            Vielleicht benutzt du als Grundlage eine Matrizenklasse, das gibt es auch sicher schon im Netz. Für die Singulärwerte nimmst du entweder ein Überobjekt, oder eine weitere Methode für ein AAT Objekt, die zB ein ATA Objekt als Wert annimmt.
            Das sollte nun etwas konkreter sein, damit kannst du schon einiges aufziehen. Wenn du zu einem Punkt kommst, wo du ein wirkliches Problem hast, dann melde dich nochmal. Vorerst musst du selbst was zu Datei bringen.

            Kommentar


            • #7
              Also ich habs jetzt mal versucht. Ich habe bisher geschafft:
              1) Matrix A wird in Array dargestellt und ausgegeben
              2) Matrix A wird transponiert zu A' (AT) und ausgegeben
              3) Produkt von AA' (AAT) wird berechnet und ausgegeben
              4) Produkt von A'A (ATA) wird berechnet und ausgegeben
              Hier kann man es sehen:
              http://wp1080088.wp029.webpack.hosteurope.de/_svd.php

              Als nächstes müsste ich die Eigenwerte berechnen. Ich habe aber keine Ahnung wie. Hab gelesen, man könnte den QR-Algorithmus verwenden. Der scheint auch ziemlich einfach zu sein, verwendet aber die QR-Zerlegung. Die verstehe ich kein bisschen. Könntet ihr mir an dieser Stelle noch einmal weiterhelfen? Das wäre super!

              Kommentar


              • #8
                Sorry wegen Doppelpost, aber ich bin jetzt schon ziemlich weit und brauche nur noch ein kleines bisschen Hilfe, dann bin ich fertig:

                Meine Rechnung am Beispiel einer Matrix
                Ich habe es jetzt geschafft, für eine Matrix und ihre transponierte Matrix einen Eigenwert zu finden (im Beispiel: 0.133). Ich löse die Gleichung ...
                (5-x)*(25-x)-11*11 = 0
                ... mit der Bisektion auf. Als Ergebnis bekomme ich 0.133. Der andere Eigenwert (29.866) fehlt mir aber. Gibt es eine Möglichkeit, den auch noch irgendwie zu finden?

                Kommentar

                Lädt...
                X