Seite 1 von 1

Convex Hull - Wo ist mein Fehler?

Verfasst: Dienstag 23. Januar 2018, 23:53
von Patrick1990
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()




Re: Convex Hull - Wo ist mein Fehler?

Verfasst: Mittwoch 24. Januar 2018, 08:17
von MagBen
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.

Re: Convex Hull - Wo ist mein Fehler?

Verfasst: Mittwoch 24. Januar 2018, 09:27
von Patrick1990
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?

Re: Convex Hull - Wo ist mein Fehler?

Verfasst: Mittwoch 24. Januar 2018, 09:57
von Sirius3
@Patrick1990: dann mußt Du halt erst Deine x-Werte umrechnen, bevor Du die Hülle berechnest.

Re: Convex Hull - Wo ist mein Fehler?

Verfasst: Mittwoch 24. Januar 2018, 10:09
von Patrick1990
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)?

Re: Convex Hull - Wo ist mein Fehler?

Verfasst: Mittwoch 24. Januar 2018, 11:08
von MagBen

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()

Re: Convex Hull - Wo ist mein Fehler?

Verfasst: Mittwoch 24. Januar 2018, 11:15
von Patrick1990
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)