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

Gewichtete Fitfunktion

 

Chaos391
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2017, 14:49     Titel: Gewichtete Fitfunktion
  Antworten mit Zitat      
Halli hallo,
ich brauche dringend Eure Hilfe. Ich möchte einen bikonischen Fit so wichten, dass die zentralen Werte mehr zählen. Gibt es dafür eine einfache Möglichkeit?

Meine bisherige Funktion lautet so:
Code:

function [fitresult, gof, output] = biconic_fitVOCT(x, y, Z, lower, upper, start, model, tolfun)
% BICONIC_FIT
% This function fits the biconic, given by the formula model, to the
% corneal surface data specified in the vector Z. The spatial coordinates
% of each data point are given by the vectors x and y. Upper and lower
% bounds as well as the starting point are defined by the vectors upper,
% lower and start.
%
% INPUT ARGS
% x, y [double]:                        2-dimensional coordinate system (vectors)
% Z [double]:                           measurement values (vector)
% lower, upper, start [1x10 double]:    boundaries and starting point
%                                       (vectors)
% model [char]:                         model function to be fitted
% tolfun [double]:                      termination tolerance for the model parameters
%
% OUTPUT ARGS
% fitresult [1x1 sfit]:                 fit result
% gof [1x1 struct]:                     goodness-of-fit statistics
% output [1x1 struct]:                  fitting algorithm information

% Set up fittype and options.
ft = fittype( model, 'independent', {'x', 'y'}, 'dependent', 'z' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Lower =      lower;                % unterer Grenzwert
opts.StartPoint = start;                % Startpunkt
opts.Upper =      upper;                % oberer Grenzwert
opts.MaxFunEvals = 10000;               % maximale Anzahl von Funktionsauswertungen
opts.MaxIter = 10000;                   % maximale Anzahl Iterationsn
opts.Algorithm = 'Trust-Region';        % Trust-Region-Algorithmus verwenden
opts.Robust = 'Off';                    % keine MATLAB-eigene Regressionsmethode verwenden (z.B. Re-weighting)
%opts.Display = 'iter';                 % Zwischenergebnisse einer jeden Iteration ausgeben
opts.TolFun = tolfun;                   % Abbruchkriterium: Konvergenz der Modellparameter

% Fit model to data.
[fitresult, gof, output] = fit( [x, y], Z, ft, opts );

end

 


Ich hoffe Ihr könnt mir helfen.
LG Stephi391
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: 11.04.2017, 17:36     Titel:
  Antworten mit Zitat      
Hallo,

du kannst das wohl in opts angeben:
Code:
opts.Weights = ...


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.04.2017, 08:13     Titel:
  Antworten mit Zitat      
Danke, dass habe ich auch schon gefunden. Wenn ich einen kreisförmigen Bereich in der Mitte mehr gewichten will, wie muss das die Gewichtsfunktion lauten? Einfach die Defintion eines Kreises? Sind dann automatisch die im Kreis liegenden Werte mehr gewichtet?
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: 12.04.2017, 08:25     Titel:
  Antworten mit Zitat      
Hallo,

ich würde an sich an einen Bereich von x-Werten denken. Wie das hier mit kreisförmig gemeint ist, ist mir nicht ganz klar.

Die Gewichtsfunktion ist deine freie Wahl. Für Anregungen kannst du dir auch mal die robustopts bei fitlm ansehen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.04.2017, 09:19     Titel:
  Antworten mit Zitat      
Ich kann leider nicht nur die x-Werte gewichten, da ich eine Fläche habe, die ich fitten möchte (siehe Bild). Ich habe jetzt eine Gewichtsfunktion eingegeben, die wie folgt lautet:

weight_vk=sqrt((x_vk).^2+(y_vk).^2)<1;

Kann das stimmen?

Fläche.jpg
 Beschreibung:

Download
 Dateiname:  Fläche.jpg
 Dateigröße:  134.19 KB
 Heruntergeladen:  236 mal
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: 12.04.2017, 09:24     Titel:
  Antworten mit Zitat      
Hallo,

das würde bedeuten: Punkte, die in dem Kreis sind, werden berücksichtigt. Punkte, die außerhalb sind, nicht. Möchtest du nicht eher eine Abstufung?

Code:
max(r - sqrt((x_vk).^2+(y_vk).^2), 0)


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.04.2017, 09:25     Titel:
  Antworten mit Zitat      
Abstufung klingt besser ja. Was würde deine Funktion bewirken? Ist es eine Funktion? Kann ich die mit

weight=...

benutzen?
Sorry, ich bin Matlab Neuling Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
Chaos391
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.04.2017, 09:32     Titel:
  Antworten mit Zitat      
Ist in deiner Funktion r der Radius? Müsste ja eigentlich?
Und wenn ich die Definition von max(..,..) richtig verstehe, ist 0 die Dimension? Warum 0?
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: 12.04.2017, 09:42     Titel:
  Antworten mit Zitat      
Hallo,

die Funktion an sich hat ja wenig mit MATLAB zu tun.

Kreisinneres: Gewicht r
Kreisrand und außerhalb: Gewicht 0
Dazwischen abgestuft.

Ja, die kannst du mit weight... benutzen. Im Zweifelsfall mal ausprobieren :)

r ist der Radius. Es wird das Maximum des Gewichts und von 0 genommen um zu verhindern, dass die Gewichte außerhalb des Kreises negativ werden. Das steht aber auch in der Doku von max .

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.04.2017, 09:51     Titel:
  Antworten mit Zitat      
Oh man, ich bin aber auch schwer von kp^^
Danke für die nette Erklärung. Am liebsten hätte ich es ja, wenn in der Mitte meiner Fläche die Werte hoch gewichtet werden und die Gewichtung zum Rand abnimmt. Gibt es dafür vllt noch eine andere Möglichkeit außer einen Kreis? Vllt irgendwie reziprok? Mit 1/x? aber wie man ich das zweidimensional? 1/x+1/y?
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: 12.04.2017, 10:25     Titel:
  Antworten mit Zitat      
Hallo,

wenn, dann 1./abs(x) + 1./abs(y)

Aber Vorsicht, bei x = 0 und y = 0 wäre das ja unendlich.
Also eher etwas wie
1./(1+abs(x)) + 1./(1+abs(y))

oder auch
1./(1 + x.^2 + y.^2)

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.04.2017, 15:27     Titel:
  Antworten mit Zitat      
Ich danke Dir sehr für deine Hilfe. Leider möchte mein Professor nun, dass ich einen Kegelstumpf als Gewichtsfunktion benutze. Also in der Mitte einen Kreis mit hoher Gewichtung und dann parabelförmig nach Außen in alle Richtungen abfallen....
Ich hab noch keine Idee wie ich das Problem löse Sad
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: 12.04.2017, 16:36     Titel:
  Antworten mit Zitat      
Hallo,

Kegelstumpf und Parabel passen m.E. nicht zusammen.

Kegelstumpf: w = 1 - r
Parabelförmig: nicht eindeutig, z.B. w = (r-1).^2

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.