Użyłem kodu znalezionego w pytaniu How to apply piecewise linear fit in Python?, aby wykonać segmentację liniową z pojedynczym punktem przerwania.Kawałkowo liniowe dopasowanie z n punktami przerwania
Kod jest w następujący sposób:
from scipy import optimize
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12, 13, 14, 15], dtype=float)
y = np.array([5, 7, 9, 11, 13, 15, 28.92, 42.81, 56.7, 70.59, 84.47, 98.36, 112.25, 126.14, 140.03])
def piecewise_linear(x, x0, y0, k1, k2):
return np.piecewise(x,
[x < x0],
[lambda x:k1*x + y0-k1*x0, lambda x:k2*x + y0-k2*x0])
p , e = optimize.curve_fit(piecewise_linear, x, y)
xd = np.linspace(0, 15, 100)
plt.plot(x, y, "o")
plt.plot(xd, piecewise_linear(xd, *p))
Próbuję dowiedzieć się, w jaki sposób mogę przedłużyć ten obsłużyć n wartości graniczne.
Próbowałem następujący kod dla metody piecewise_linear() do obsługi 2 punktów przerwania, ale w żaden sposób nie zmienia wartości punktów przerwania.
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], dtype=float)
y = np.array([5, 7, 9, 11, 13, 15, 28.92, 42.81, 56.7, 70.59, 84.47, 98.36, 112.25, 126.14, 140.03, 150, 152, 154, 156, 158])
def piecewise_linear(x, x0, x1, a1, b1, a2, b2, a3, b3):
return np.piecewise(x,
[x < x0, np.logical_and(x >= x0, x < x1), x >= x1 ],
[lambda x:a1*x + b1, lambda x:a2*x+b2, lambda x: a3*x + b3])
p , e = optimize.curve_fit(piecewise_linear, x, y)
xd = np.linspace(0, 20, 100)
plt.plot(x, y, "o")
plt.plot(xd, piecewise_linear(xd, *p))
Każde wejście byłoby bardzo mile widziane
'' 'To nie work''' jest prawie bezużyteczny opis. Myślę też, że nie osiągniesz tego za pomocą curve_fit(), która staje się bardziej złożona, gdy istnieje wiele punktów przerwania (wymagałoby ograniczeń liniowych do obsługi b0
sascha
Myślę, że jeśli najpierw rozprowadzę punkty przerwania równomiernie na osi X, to znalezienie minimalnych lokalnych będzie wystarczające, aby zapewnić przyzwoite, nieoptymalne rozwiązanie. Czy znasz inny moduł optymalizacji, który obsługuje ograniczenia liniowe? –
Jak wam powiedziałem, nie chodzi tylko o to. Ignorując gładkość i potencjalny non-convexity, możesz rozwiązać ten problem za pomocą bardziej ogólnych funkcji optymalizacji scipy, mianowicie COBYLA i SQSLP (jedyne dwa ograniczenia wspierające). Jedyne prawdziwe podejście, jakie widzę, to programowanie wypukłe z integracją całkowitą, ale oprogramowanie jest rzadkie (bonmin i couenne są dwoma rozwiązaniami open-source, których nie można używać z python; pajarito @ julialang, ale to podejście w ogóle wymaga pewnych trywialne sformułowanie). – sascha