Convex Hull - Wo ist mein Fehler?

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

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: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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: 116
Registriert: Freitag 3. Juni 2016, 05:45

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: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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

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: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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: 116
Registriert: Freitag 3. Juni 2016, 05:45

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