WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Linefit - Warnung

 

Pendler01
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 30.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2017, 13:18     Titel: Linefit - Warnung
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein Problem mit einem Programm zur Ermittlung kleinster Quadrate bzw. Least-square Methode.

Code:

function[c,R2] = linefit(x,y);
% linefit    Least-squares fit of data to y = c(1)*x + c(2)
%
% Synopsis:   c     = linefit(x,y)
%            [c,R2] = linefit(x,y)
%
% Input:   x,y = vectors of independent and dependent variables
%
% Output:  c  = vector of slope, c(1), and intercept, c(2) of least sq. line fit
%          R2 = (optional) coefficient of determination; 0 <= R2 <= 1
%               R2 close to 1 indicates a strong relationship between y and x
if length(y)~= length(x),  error('x and y are not compatible');  end
x = x(:);  y = y(:);    %  Make sure that x and y are column vectors
A = [x ones(size(x))];  %  m-by-n matrix of overdetermined system
c = (A'*A)\(A'*y);      %  Solve normal equations
if nargout>1
r=y-A*c;
R2 = 1 - (norm(r)/norm(y-mean(y)))^2;
end
 


Mir werden bei der Analyse eines Datensatzes unzählige Warnung angezeigt vom Typ:
Zitat:

In linefit at 16
In Programmxy at 123
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.431325e-20.


Abweichungen finden sich nur in der RCOND-Zeile. Leider habe ich keine wirkliche Ahnung, wo das Problem liegt. Kann mir jemand Hilfestellung leisten?

Beste Grüße
Pendler01

Datensatz_Forum.mat
 Beschreibung:
Datensatz

Download
 Dateiname:  Datensatz_Forum.mat
 Dateigröße:  409.06 KB
 Heruntergeladen:  321 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 10.04.2017, 13:33     Titel: Re: Linefit - Warnung
  Antworten mit Zitat      
Hallo Pendler01,

Die Fehlermeldung ist eigentlich klar:
Zitat:
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.

Beim Lösen eines Gleichungssystems kann die Matrix schlecht konditioniert sein, also fast singulär. Das Ergebnis kann den von Rundungsfehlern dominiert sein.

Das kann z.B. vorkommen, wenn alle X-Werte sehr groß sind und sehr nahe beieinander liegen. Die übliche Lösung ist dann eine Skalierung:
Code:
x = (x - mean(x)) / std(x)

Jetzt liegen die X-Werte um 0 herum und haben eine Standard-Abweichung von 1. Dann muss man allerdings Mean und Std mit ausgeben, damit man später die Daten wieder zurück-skalieren kann. Siege polyfit .

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Pendler01
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 30.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.04.2017, 15:38     Titel:
  Antworten mit Zitat      
Hallo Jan,

ich stehe da leider etwas auf dem Schlauch. Die Determinate scheint also nahe 0 oder 0 zu sein, also entstehen ggf. Fehler. Meine x-Werte sind einfache Werte von 0 bis xyz in 1er Schritten, die eine Art Zeitstrahl symbolisieren.

Diese normiere ich jetzt.

Code:

function[c,R2] = linefit(x,y);
% linefit    Least-squares fit of data to y = c(1)*x + c(2)
%
% Synopsis:   c     = linefit(x,y)
%            [c,R2] = linefit(x,y)
%
% Input:   x,y = vectors of independent and dependent variables
%
% Output:  c  = vector of slope, c(1), and intercept, c(2) of least sq. line fit
%          R2 = (optional) coefficient of determination; 0 <= R2 <= 1
%               R2 close to 1 indicates a strong relationship between y and x
if length(y)~= length(x),  error('x and y are not compatible');  end
x = x(:);  y = y(:);    %  Make sure that x and y are column vectors
std_x = std(x);
mean_x = mean(x);
x = (x - mean(x)) / std(x) % standard score / z-value
A = [x ones(size(x))];  %  m-by-n matrix of overdetermined system
c = (A'*A)\(A'*y);      %  Solve normal equations
c = (c * std_x) + mean_x   % reconversation
if nargout>1
r=y-A*c;
R2 = 1 - (norm(r)/norm(y-mean(y)))^2;
end


So kann es jedoch nicht richtig sein... Wo habe ich denn den falschen Gedanken?
Grüße und Dank
Pendler
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.04.2017, 16:39     Titel:
  Antworten mit Zitat      
Hallo Pendler01,

Schaue mal in den Code von polyfit .
Hier werden die Werte zur Skalierung mit ausgegeben. Man benötigt sie erst wieder beim Auswerten des Polynoms.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.04.2017, 17:15     Titel:
  Antworten mit Zitat      
Hallo,

mir stellt sich hier vor allem auch die Frage, warum nicht gleich polyfit verwendet wird?

Was die "unzähligen" Warnungen angeht: rufst du die gepostete Funktion vielleicht unzählige Male auf?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Pendler01
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 30.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.04.2017, 22:38     Titel:
  Antworten mit Zitat      
Hallo ihr beiden,

polyfit benötige ich in diesem Fall nicht, mir ist die KQ-Methode also die lineare Regression wichtig. Ja, der Fehler ist immer der gleiche, aufgrund einer vorgeschalteten Schleife. Aber die Ergebnisse die ich jetzt erhalte, sind einfach falsch...
Deswegen bringen mich die Hinweise auf polyfit nur bedingt weiter.

Grüße
Pendler
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.04.2017, 23:09     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
polyfit benötige ich in diesem Fall nicht

Was heißt du benötigst das nicht? Wenn ich die Wahl zwischen einer fertigen, jahrzehntelang bewährten Funktion und einer selbstgeschriebenen habe, würde ich ersteres wählen.

Zitat:
mir ist die KQ-Methode also die lineare Regression wichtig.

... und genau die führt polyfit nach meinem Verständnis ja aus

Zitat:
Aber die Ergebnisse die ich jetzt erhalte, sind einfach falsch...
Deswegen bringen mich die Hinweise auf polyfit nur bedingt weiter.

Hast du denn mal versucht, ob du mit polyfit korrekte Ergebnisse bekommst?

Wenn du einen Beispieldatensatz zur Verfügung stellen kannst, wäre das hilfreich.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.