Convex Hull - Wo ist mein Fehler?

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Patrick1990
User
Beiträge: 67
Registriert: Freitag 3. Juni 2016, 05:45

Dienstag 23. Januar 2018, 23:53

Hallo,

ich habe versucht eine Punktwolke mit Hilfe einer konvexen Hülle zu umschließen.
Leider liegen nicht alle Punkte innerhalb der Hülle,
Könnt ihr mir helfen?

Hier ein Beispiel:

Code: Alles auswählen

import matplotlib.pyplot as plt
import numpy as np
from scipy.spatial import ConvexHull


xdata = np.array([1.50000000e-01,   2.90000000e-01,   4.20000000e-01,   5.10000000e-01,
                  5.80000000e-01,   8.00000000e-01,   1.03000000e+00,   1.40000000e+00,
                  1.59000000e+00,   1.60000000e+00,   2.05000000e+00,   2.40000000e+00,
                  2.70000000e+00,   3.20000000e+00,   3.80000000e+00,   4.10000000e+00,
                  4.90000000e+00,   4.90000000e+00,   5.30000000e+00,   7.50000000e+00,
                  7.60000000e+00,   9.10000000e+00,   9.80000000e+00,   1.00000000e+01,
                  1.06000000e+01,   1.09000000e+01,   1.33000000e+01,   1.42000000e+01,
                  1.42000000e+01,   1.48000000e+01,   1.54000000e+01,   1.55000000e+01,
                  1.78000000e+01,   1.99000000e+01,   1.99000000e+01,   2.16000000e+01,
                  2.20000000e+01,   2.38000000e+01,   2.58000000e+01,   2.60000000e+01,
                  3.00000000e+01,   3.09000000e+01,   3.10000000e+01,   3.48000000e+01,
                  3.48000000e+01,   3.55000000e+01,   4.09000000e+01,   4.39000000e+01,
                  4.77000000e+01,   4.79000000e+01,   5.20000000e+01,   6.00000000e+01,
                  6.20000000e+01,   6.60000000e+01,   6.70000000e+01,   6.90000000e+01,
                  7.80000000e+01,   8.30000000e+01,   9.00000000e+01,   9.00000000e+01,
                  1.04000000e+02,   1.19000000e+02,   1.21000000e+02,   1.32000000e+02,
                  1.36000000e+02,   1.39000000e+02,   1.39000000e+02,   1.56000000e+02,
                  1.58000000e+02,   1.65000000e+02,   1.67000000e+02,   1.80000000e+02,
                  1.90000000e+02,   1.97000000e+02,   2.09000000e+02,   2.25000000e+02,
                  2.40000000e+02,   2.50000000e+02,   2.52000000e+02,   2.57000000e+02,
                  2.63000000e+02,   2.78000000e+02,   2.92000000e+02,   3.13000000e+02,
                  3.19000000e+02,   3.29000000e+02,   3.80000000e+02,   3.90000000e+02,
                  3.96000000e+02,   3.98000000e+02,   4.17000000e+02,   4.61000000e+02,
                  4.81000000e+02,   4.96000000e+02,   5.04000000e+02,   5.27000000e+02,
                  5.48000000e+02,   5.55000000e+02,   5.57000000e+02,   5.69000000e+02,
                  5.77000000e+02,   6.04000000e+02,   6.34000000e+02,   6.41000000e+02,
                  6.93000000e+02,   7.10000000e+02,   7.67000000e+02,   8.30000000e+02,
                  8.78000000e+02,   9.68000000e+02,   9.73000000e+02,   1.00700000e+03,
                  1.09700000e+03,   1.11000000e+03,   1.15500000e+03,   1.20800000e+03,
                  1.23600000e+03,   1.36600000e+03,   1.42100000e+03,   1.49000000e+03,
                  1.52300000e+03,   1.64800000e+03,   1.76100000e+03,   1.76100000e+03,
                  2.00500000e+03,   2.01300000e+03,   2.18100000e+03,   2.24600000e+03,
                  2.74000000e+03,   3.29500000e+03,   3.83700000e+03,   4.36200000e+03])

ydata = np.array([2.72707696,   2.63617439,   2.54527183,   2.45211548,   2.63617439,
                  3.84645565,   2.47615583,   3.05305409,   2.54827687,   3.84645565,
                  2.46413565,   3.84645565,   2.94401644,   3.84645565,   4.73168929,
                  2.98036232,   4.1887902,    4.71190817,   2.88949762,   4.66943022,
                  5.23254529,   7.15293505,   4.71190817,   4.27427572,   4.39964092,
                  5.63676707,   7.03331773,   4.04631435,   4.55163919,   4.60717115,
                  5.4294562,    5.33581921,   6.99572768,   4.25290434,   4.78402922,
                  4.95714817,   5.68848053,   7.03998354,   6.75991664,   6.87467146,
                  5.49979457,   5.44708431,   5.33581921,   5.55440859,   5.99876128,
                  6.97607676,   7.20959136,   5.67555216,   7.05477342,   5.62924139,
                  6.87467146,   5.49979457,   5.46471241,   8.43869703,   6.60614702,
                  5.50652576,   7.6992562,    5.60748354,   5.49979457,   6.65544662,
                  5.53312733,   7.03998354,   5.54562619,   8.43869703,   6.70474623,
                  7.98685649,   5.54642812,   7.6992562,    5.79311695,   5.57370352,
                  5.33095537,   5.49979457,   8.96209787,   8.39607735,   5.55972891,
                  5.89263704,   7.89667302,   5.63000355,   9.13127276,   5.88936335,
                  8.40673227,   7.98685649,   8.93445391,   7.7239333,    5.3879134,
                  8.41312522,   8.96209787,   7.6992562,    8.43869703,   5.3777794,
                  7.98685649,   8.42043146,   7.91312442,   5.58496353,   9.13127276,
                  8.42271465,   10.84809562,  7.97249164,   7.85436942,   5.49166632,
                  9.07215872,   9.24042836,   7.82264171,   5.41324842,   7.96387274,
                  8.57566622,   9.0446435,    7.94855023,   8.9548522,    7.94581407,
                  9.17907497,   9.12221396,   10.85799351,  7.97249164,   9.08002021,
                  9.24042836,   8.95734376,   9.20468097,   8.58170542,   9.11803858,
                  8.97978622,   10.87449001,  8.98035007,   9.11574339,   8.76398243,
                  9.11768456,   10.79365718,  8.59023265,   10.84809562,  10.87119071,
                  10.85092359,  10.79365718])


points = np.vstack((xdata, ydata)).T

hull = ConvexHull(points)


plt.plot(points[:, 0], points[:, 1], 'o')

for simplex in hull.simplices:
    plt.plot(points[simplex, 0], points[simplex, 1], 'k-')

plt.xscale("log")
plt.grid(True)
plt.show()



Benutzeravatar
MagBen
User
Beiträge: 786
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Mittwoch 24. Januar 2018, 08:17

Es liegt an

Code: Alles auswählen

plt.xscale("log")
Eine Gerade im halblogarithmischen Koordinatensystem ist keine Gerade im kartesischen Koordinatensystem.
Lass die Zeile weg, dann siehst du die konvexe Hülle.
a fool with a tool is still a fool, www.magben.de, YouTube
Patrick1990
User
Beiträge: 67
Registriert: Freitag 3. Juni 2016, 05:45

Mittwoch 24. Januar 2018, 09:27

MagBen hat geschrieben:Es liegt an

Code: Alles auswählen

plt.xscale("log")
Eine Gerade im halblogarithmischen Koordinatensystem ist keine Gerade im kartesischen Koordinatensystem.
Lass die Zeile weg, dann siehst du die konvexe Hülle.

Dankeschön, ich möchte jedoch eine Hülle um die Punkte in der halblogarithmischen Darstellung, ist das möglich?
Sirius3
User
Beiträge: 8579
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 24. Januar 2018, 09:57

@Patrick1990: dann mußt Du halt erst Deine x-Werte umrechnen, bevor Du die Hülle berechnest.
Patrick1990
User
Beiträge: 67
Registriert: Freitag 3. Juni 2016, 05:45

Mittwoch 24. Januar 2018, 10:09

Sirius3 hat geschrieben:@Patrick1990: dann mußt Du halt erst Deine x-Werte umrechnen, bevor Du die Hülle berechnest.
Daran habe ich schon gedacht, aber in welcher Form müssen diese nun umgerechnet werden?
Kannst du mir ein Beispiel geben?
Einfach x_neu = ln(x_alt)?
Benutzeravatar
MagBen
User
Beiträge: 786
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Mittwoch 24. Januar 2018, 11:08

Code: Alles auswählen

points = np.vstack((np.log(xdata), ydata)).T
hull = ConvexHull(points)

plt.plot(xdata, ydata, 'o')

for simplex in hull.simplices:
    plt.plot(xdata[simplex], ydata[simplex], 'k-')

plt.xscale("log")
plt.grid(True)
plt.show()
a fool with a tool is still a fool, www.magben.de, YouTube
Patrick1990
User
Beiträge: 67
Registriert: Freitag 3. Juni 2016, 05:45

Mittwoch 24. Januar 2018, 11:15

Perfekt, danke.

Ist es noch möglich den minimalen und maximalen Wert der Hülle bei einem bestimmten x-Wert auszulesen?
Beispielsweise Vorgabe x=10; Ausgabe: y_min=3.2, y_max=7.2.
Also wie bei einer Funktion mit zwei Rückgabewerten [y_min,y_max] = f(x)
Antworten