python - যবহ - পাইথন প্রোগ্রামিং বই pdf download




পাইথনে টুকরোড়া লিনিয়ার ফিট কীভাবে প্রয়োগ করবেন? (5)

@ বিনয়-পিলকাত এর উত্তর বাড়ানো হচ্ছে।

আপনার numpy.interp ব্যবহার করা উচিত:

np.random.seed(9999)
x = np.random.normal(0, 1, 1000) * 10
y = np.where(x < -15, -2 * x + 3 , np.where(x < 10, x + 48, -4 * x + 98)) + np.random.normal(0, 3, 1000)
plt.scatter(x, y, s = 5, color = u'b', marker = '.', label = 'scatter plt')

def piecewise_linear(x, x0, x1, b, k1, k2, k3):
    condlist = [x < x0, (x >= x0) & (x < x1), x >= x1]
    funclist = [lambda x: k1*x + b, lambda x: k1*x + b + k2*(x-x0), lambda x: k1*x + b + k2*(x-x0) + k3*(x - x1)]
    return np.piecewise(x, condlist, funclist)

p , e = optimize.curve_fit(piecewise_linear, x, y)
xd = np.linspace(-30, 30, 1000)
plt.plot(x, y, "o")
plt.plot(xd, piecewise_linear(xd, *p))

আমি একটি ডেটা সেটের জন্য ডুমুর 1 এ দেখানো হিসাবে টুকরোজা লিনিয়ার ফিট ফিট করার চেষ্টা করছি

এই চিত্রটি লাইনে সেট করে প্রাপ্ত হয়েছিল। আমি কোডটি ব্যবহার করে টুকরোজ লিনিয়ার ফিট প্রয়োগ করার চেষ্টা করেছি:

from scipy import optimize
import matplotlib.pyplot as plt
import numpy as np


x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12, 13, 14, 15])
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 linear_fit(x, a, b):
    return a * x + b
fit_a, fit_b = optimize.curve_fit(linear_fit, x[0:5], y[0:5])[0]
y_fit = fit_a * x[0:7] + fit_b
fit_a, fit_b = optimize.curve_fit(linear_fit, x[6:14], y[6:14])[0]
y_fit = np.append(y_fit, fit_a * x[6:14] + fit_b)


figure = plt.figure(figsize=(5.15, 5.15))
figure.clf()
plot = plt.subplot(111)
ax1 = plt.gca()
plot.plot(x, y, linestyle = '', linewidth = 0.25, markeredgecolor='none', marker = 'o', label = r'\textit{y_a}')
plot.plot(x, y_fit, linestyle = ':', linewidth = 0.25, markeredgecolor='none', marker = '', label = r'\textit{y_b}')
plot.set_ylabel('Y', labelpad = 6)
plot.set_xlabel('X', labelpad = 6)
figure.savefig('test.pdf', box_inches='tight')
plt.close()    

তবে এটি আমাকে ডুমুরের ফর্মের ফিটিং দিয়েছিল। 2, আমি মানগুলি নিয়ে খেলতে চেষ্টা করেছি তবে কোনও পরিবর্তন আমি উপরের লাইনের ফিট সঠিকভাবে পেতে পারি না। আমার জন্য সবচেয়ে গুরুত্বপূর্ণ প্রয়োজন হ'ল আমি কীভাবে পাইথনকে গ্রেডিয়েন্ট পরিবর্তন পয়েন্ট পেতে পারি। সংক্ষেপে আমি পাইথনটি উপযুক্ত ব্যাপ্তিতে দুটি লিনিয়ার ফিটকে সনাক্ত করতে এবং ফিট করতে চাই। পাইথনে এটি কীভাবে করা যায়?


আপনি উভয় টুকরোচক লিনিয়ার প্রবৃত্তি সঞ্চালন এবং বক্ররেখার টার্নিং পয়েন্ট খুঁজে পেতে একটি স্প্লাইন ইন্টারপোলেশন স্কিম করতে পারেন। দ্বিতীয় ডেরাইভেটিভটি টার্নিং পয়েন্টে সর্বোচ্চ হবে (একঘেয়ে বর্ধমান বক্ররেখার জন্য) এবং আদেশের স্প্লিন ইন্টারপোলেশন দিয়ে গণনা করা যায়> 2।

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12, 13, 14, 15])
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])

tck = interpolate.splrep(x, y, k=2, s=0)
xnew = np.linspace(0, 15)

fig, axes = plt.subplots(3)

axes[0].plot(x, y, 'x', label = 'data')
axes[0].plot(xnew, interpolate.splev(xnew, tck, der=0), label = 'Fit')
axes[1].plot(x, interpolate.splev(x, tck, der=1), label = '1st dev')
dev_2 = interpolate.splev(x, tck, der=2)
axes[2].plot(x, dev_2, label = '2st dev')

turning_point_mask = dev_2 == np.amax(dev_2)
axes[2].plot(x[turning_point_mask], dev_2[turning_point_mask],'rx',
             label = 'Turning point')
for ax in axes:
    ax.legend(loc = 'best')

plt.show()


পাইথনে অবিচ্ছিন্নভাবে টুকরোয়াল লিনিয়ার রিগ্রেশন সম্পাদন করতে আপনি পিডব্লুএফ ব্যবহার করতে পারেন। এই লাইব্রেরিটি পাইপ ব্যবহার করে ইনস্টল করা যেতে পারে।

আপনার ফিটটি সম্পাদনের জন্য পিডব্লিউএফটিতে দুটি পন্থা রয়েছে:

  1. আপনি রেখাংশের একটি নির্দিষ্ট সংখ্যার জন্য ফিট করতে পারেন।
  2. আপনি এক্স অবস্থানগুলি নির্দিষ্ট করতে পারেন যেখানে অবিচ্ছিন্ন টুকরোজ লাইনগুলি শেষ করা উচিত।

আসুন 1 সহজ পদ্ধতির সাথে চলে আসুন, এবং আপনার আগ্রহী 'গ্রেডিয়েন্ট পরিবর্তন বিন্দু' স্বীকৃতি দেবে।

ডেটা দেখার সময় আমি দুটি স্বতন্ত্র অঞ্চল লক্ষ্য করি। সুতরাং এটি দুটি লাইন বিভাগগুলি ব্যবহার করে সর্বোত্তম সম্ভাব্য ধারাবাহিক টুকরোপাখের লাইনটি সন্ধান করে। এটি পন্থা 1।

import numpy as np
import matplotlib.pyplot as plt
import pwlf

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
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])

my_pwlf = pwlf.PiecewiseLinFit(x, y)
breaks = my_pwlf.fit(2)
print(breaks)

[1. 1.99819559 15.]

প্রথম লাইন বিভাগটি [1., 5.99819559] থেকে চলেছে, যখন দ্বিতীয় লাইনের বিভাগটি [5.99819559, 15.] থেকে চলেছে। সুতরাং আপনি যে গ্রেডিয়েন্ট পরিবর্তন পয়েন্টটি চেয়েছিলেন তা হবে 5.99819559।

পূর্বাভাস ফাংশন ব্যবহার করে আমরা এই ফলাফলগুলি প্লট করতে পারি।

x_hat = np.linspace(x.min(), x.max(), 100)
y_hat = my_pwlf.predict(x_hat)

plt.figure()
plt.plot(x, y, 'o')
plt.plot(x_hat, y_hat, '-')
plt.show()


github.com/DataDog/piecewise কাজ করে

from piecewise.regressor import piecewise
import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12, 13, 14, 15,16,17,18], 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,120,112,110])

model = piecewise(x, y)

'মডেল' মূল্যায়ন করুন:

FittedModel with segments:
* FittedSegment(start_t=1.0, end_t=7.0, coeffs=(2.9999999999999996, 2.0000000000000004))
* FittedSegment(start_t=7.0, end_t=16.0, coeffs=(-68.2972222222222, 13.888333333333332))
* FittedSegment(start_t=16.0, end_t=18.0, coeffs=(198.99999999999997, -5.000000000000001))

numpy.piecewise() ফাংশন তৈরি করতে আপনি numpy.piecewise() ব্যবহার করতে পারেন এবং তারপরে curve_fit() ব্যবহার করতে পারেন, এখানে কোডটি দেওয়া হয়েছে

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

আউটপুট:





piecewise