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

Balkendiagramm interpolieren (Wahrscheinlichkeitsverteilung)

 

andree
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 18.09.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2008, 09:34     Titel: Balkendiagramm interpolieren (Wahrscheinlichkeitsverteilung)
  Antworten mit Zitat      
Hallo

Also ich habe folgendes Problem:
Ich habe x und y Werte, die ein Balkendiagramm beschreiben. Die Werte beschreiben eine Wahrscheinlichkeitsverteilung.
Hierzu hätte ich nun gern eine interpolierte Kurve, ähnlich einer Glockenkurve. Wie kann ich sowas machen?

Ich hatte es versucht über interp1, dabei wird die kurve aber zu spitz.

Als Beispiel mal die Werte:
x=[1 2 3 4 5]
y=[0.5 1.5 4 1.5 0.5]

Nun soll dort kein Dreieck rauskommen sondern eine Art Parabel / Glockenkurve.

Kann mir da jemand einen Tipp geben?

Vielen Dank schonmal Very Happy

mfg
André
Private Nachricht senden Benutzer-Profile anzeigen


Maddy
Ehrenmitglied

Ehrenmitglied



Beiträge: 494
Anmeldedatum: 02.10.08
Wohnort: Greifswald
Version: ---
     Beitrag Verfasst am: 08.10.2008, 14:37     Titel:
  Antworten mit Zitat      
Also in 5 Messpunkte eine Gausskurve reinzulegen erfordert schon Mut. Smile
Eine Erhöhung der Anzahl der Messpunkte wäre deshalb erstrebenswert.

Ansonsten:

Code:
x=[1 2 3 4 5]                   % x-Daten
y=[0.5 1.5 4 1.5 0.5]           % y-Daten
x_opt=[1:0.1:5];                % x-Achse für die Fit-Formel

Startpara=[1 1 1];                      % Startparameter, könnte man z.B. noch automatisieren

opt_para=fminsearch(@(para) GaussFit(para,x,y),Startpara);

figure(1)
plot(x,y,'b.')
hold on
plot(x_opt,opt_para(1).*exp(-((x_opt-opt_para(2))./opt_para(3)).^2),'r')
legend('Daten','Fit')


zusätzlich wird natürlich folgende Funktion in einer eigenständigen m-file mit dem namen GaussFit.m benötigt.


Code:

function err=GaussFit(para,x,y)

x=x(:);
y=y(:);

gauss=para(1).*exp(-((x-para(2))./para(3)).^2);

err = norm(gauss-y);

end
 

_________________

>> why
The computer did it.
Private Nachricht senden Benutzer-Profile anzeigen
 
Joa
Forum-Century

Forum-Century


Beiträge: 133
Anmeldedatum: 19.05.09
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 16.07.2010, 11:16     Titel:
  Antworten mit Zitat      
Ich hab ein ähnliches Problem und zwar generiere ich mir per Zufall, normalverteilt Durchmesser für Kreise und zeige die mittels:

Code:

hist(Werte,100);
 


an. Dabei ist Werte eine nx1 Matrix. Jetzt möchte ich über dieses Histogramm die Gausskurve legen und ich komme dabei einfach nicht weiter.

Ich brauche dringend Hilfe.

Danke schonmal.

LG Joa
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.07.2010, 11:26     Titel:
  Antworten mit Zitat      
Hallo,

in der Statistics Toolbox gibt es dafür die Funktion normfit.
Ansonsten hat Maddy genau beschrieben, was man machen muss.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Joa
Forum-Century

Forum-Century


Beiträge: 133
Anmeldedatum: 19.05.09
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 16.07.2010, 11:37     Titel:
  Antworten mit Zitat      
Hey,
mit normfit habe ich es schon probiert, das funktioniert aber nicht so wie ich es mir vorstelle.

Ich mache das jetzt so:
Code:

min=MW1-staw1*4;
max=MW1+staw1*4;

%hold all;
[n,xout]=hist(Werte,100);
hist(Werte,100);

x=xout;                   % x-Daten
y=n;                        % y-Daten
x_opt=[min:0.1:max];                % x-Achse für die Fit-Formel

Startpara=[1 1 1];                      % Startparameter

opt_para=fminsearch(@(para) GaussFit(para,x,y),Startpara);

hold all;
plot(x,y,'r.');
hold all;
plot(x_opt,opt_para(1).*exp(-((x_opt-opt_para(2))./opt_para(3)).^2),'r');
 

und dabei kommt dann das raus was auf dem Bild im Anhang zu sehen ist.

Klappt ja alles wunderbar, bis auf das die Gausskurve nicht geplottet wird...

Also wie bekomme ich es hin, dass die Gausskurve auch noch geplottet wird?

LG Joa

Test Gausskurve.JPG
 Beschreibung:

Download
 Dateiname:  Test Gausskurve.JPG
 Dateigröße:  17.35 KB
 Heruntergeladen:  1008 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.07.2010, 12:13     Titel:
  Antworten mit Zitat      
Hallo,

ich sehe zunächst keinen Grund für dieses Verhalten.
Gibt es Fehlermeldungen im Command Window? Wurde gespeichert?

max und min werden hier als Variablen verwendet. Das ist sehr gefährlich, da dadurch die Funktionen max und min überlagert werden und dadurch Fehlermeldungen entstehen können.

Wenn etwas "nicht so funktioniert, wie du es dir vorstellst", bitte genauer erklären, wo das Problem liegt. Mit so einer Aussage kann man eher wenig anfangen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Joa
Forum-Century

Forum-Century


Beiträge: 133
Anmeldedatum: 19.05.09
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 16.07.2010, 12:14     Titel:
  Antworten mit Zitat      
Ok,
ich habe rausgefunden, dass es an den Startparametern liegt.
Wie kann ich diese denn für die jeweilige Anzahl usw an Punkten herausfinden?

Es gibt keinerlei Fehlermeldungen.

Das mit dem das es nicht funktioniert wie ich das gerne hätte sieht man auf dem Bild im Anhang ganz gut. Ich weiß nicht woran das liegt das mein Histogramm so klein ist im Gegensatz zu der Gausskurve, wahrscheinlich an der Achsendefinition aber ich weiß wie ich die so setzen kann, dass die Kurve sich an mein Histogramm schmiegt.

LG
Joa

Test Gauss 2.JPG
 Beschreibung:

Download
 Dateiname:  Test Gauss 2.JPG
 Dateigröße:  14.78 KB
 Heruntergeladen:  1012 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.07.2010, 13:56     Titel:
  Antworten mit Zitat      
Hallo,

das dürfte daran liegen, dass die Fläche unter der Verteilungsfunktion 1 ist. Man sollte sie also entsprechend skalieren (Vorfaktor). Wenn man den Aufruf so verwendet
Code:

... und anschließend bar, sollte das gehen.

Vorschlag für Startwerte: [length(Werte), mean(Werte), std(Werte)]

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Joa
Forum-Century

Forum-Century


Beiträge: 133
Anmeldedatum: 19.05.09
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 16.07.2010, 15:10     Titel:
  Antworten mit Zitat      
Es funktioniert leider immer noch nicht.

Mein Code sieht jetzt so aus:

Code:

minSTEP=MW1-staw1*4;
maxSTEP=MW1+staw1*4;

axes(handles.axesMU);

hold all;
[n,xout]=hist(Werte,50);
bar(xout,n);

x=xout;
y=n;
x_opt=[minSTEP:0.001:maxSTEP];                % x-Achse für die Fit-Formel

Startpara=[length(Werte), mean(Werte), std(Werte)];                      
opt_para=fminsearch(@(para) GaussFit(para,x,y),Startpara);

hold all;
plot(x,y,'r.');
hold all;
plot(x_opt,opt_para(1).*exp(-((x_opt-opt_para(2))./opt_para(3)).^2),'green');


htt=title('Simulierte Merkmalwerte');
set(htt,'FontWeight','bold') ;
xlabel(TextMU);
ylabel('Anzahl');
 


Und das auf dem BIld kommt dann dabei raus.

Gibt es noch irgendwelche Alternativen mit denen es auch funktionieren könnte?

LG Joa

Test Gauss 3.JPG
 Beschreibung:

Download
 Dateiname:  Test Gauss 3.JPG
 Dateigröße:  15.02 KB
 Heruntergeladen:  1013 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.07.2010, 19:06     Titel:
  Antworten mit Zitat      
Hi,

1. Startwerte verbessern. Plotte doch mal für die bisherigen Startwerte die Funktion drüber, dann siehst du ja, wo's hapert. Z.B. habe ich gesehen, dass bei der Standardabweichung der Faktor 1/2 mit eingerechnet werden muss, der bei der Formel für die Normalverteilung vorne dran steht.

2. Der Ansatz über normfit. Der Vorteil davon ist, dass man ohne Startwerte auskommt. Man muss lediglich ein wenig drüber nachdenken, wie der Skalierungsfaktor zu wählen ist.

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 - 2025 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.