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 iflength(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
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:
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
.
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 iflength(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
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.
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
Einstellungen und Berechtigungen
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
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.