বিভাগযুক্ত রিগ্রেশন (অ্যারাম টুকরোচক রিগ্রেশন) এর জন্য পাইথন গ্রন্থাগার


16

আমি পাইথন লাইব্রেরির সন্ধান করছি যা সেগমেন্টেড রিগ্রেশন (ওরফে টোকওয়াসওয়ালা রিগ্রেশন) সম্পাদন করতে পারে ।

উদাহরণ :

এখানে চিত্র বর্ণনা লিখুন



এই প্রশ্নটি একটি ফাংশন সংজ্ঞায়িত করে এবং স্ট্যান্ডার্ড পাইথন লাইব্রেরি ব্যবহার করে টুকরোজ রিগ্রেশন করার জন্য একটি পদ্ধতি দেয়। stackoverflow.com/questions/29382903/...

অনুরূপ একটি প্রশ্ন ( stackoverflow.com/questions/29382903/... ) এবং piecewise রিগ্রেশন জন্য একটি সহায়ক লাইব্রেরী ( pypi.org/project/pwlf )
prashanth

উত্তর:


7

numpy.piecewise এটি করতে পারেন।

টুকরোজা (এক্স, কনডলিস্ট, ফানক্লাইস্ট, * আরগস, ** কেডব্লু)

টুকরোড়া সংজ্ঞায়িত ফাংশনটি মূল্যায়ন করুন।

শর্তাদি এবং সংশ্লিষ্ট ফাংশনগুলির একটি সেট দেওয়া, ইনপুট ডেটার প্রতিটি ফাংশন এর শর্তটি সত্য যেখানেই মূল্যায়ন করুন।

একটি উদাহরণ এখানে এসও দেওয়া হয় । সম্পূর্ণতার জন্য, এখানে একটি উদাহরণ:

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

4

ভিটো এমআর মুগজিও [1] দ্বারা প্রস্তাবিত পদ্ধতিটি তুলনামূলক সহজ এবং দক্ষ। এটি নির্দিষ্ট সংখ্যক বিভাগের জন্য এবং একটি অবিচ্ছিন্ন ফাংশনের জন্য কাজ করে। ব্রেকপয়েন্টগুলির অবস্থানগুলি প্রতিটি পুনরাবৃত্তির জন্য সম্পাদন করে পুনরাবৃত্তভাবে অনুমান করা হয়, একটি বিভাজনযুক্ত লিনিয়ার রিগ্রেশন ব্রেকপয়েন্টগুলিতে লাফিয়ে লাফিয়ে অনুমতি দেয়। জাম্পগুলির মানগুলি থেকে, পরবর্তী ব্রেকপয়েন্ট পজিশনগুলি হ্রাস করা হয়, যতক্ষণ না আরও কিছুটা বিচ্ছিন্নতা (জাম্প) না থাকে।

"প্রক্রিয়াটি সম্ভাব্য রূপান্তর না হওয়া পর্যন্ত পুনরাবৃত্তি হয় যা সাধারণভাবে নিশ্চিত হয় না"

বিশেষত, রূপান্তর বা ফলাফল ব্রেকপয়েন্টগুলির প্রথম অনুমানের উপর নির্ভর করে।

আর সেগমেন্টেড প্যাকেজে ব্যবহৃত পদ্ধতিটি এটি ।

অজগরটিতে এখানে একটি বাস্তবায়ন দেওয়া হল:

import numpy as np
from numpy.linalg import lstsq

ramp = lambda u: np.maximum( u, 0 )
step = lambda u: ( u > 0 ).astype(float)

def SegmentedLinearReg( X, Y, breakpoints ):
    nIterationMax = 10

    breakpoints = np.sort( np.array(breakpoints) )

    dt = np.min( np.diff(X) )
    ones = np.ones_like(X)

    for i in range( nIterationMax ):
        # Linear regression:  solve A*p = Y
        Rk = [ramp( X - xk ) for xk in breakpoints ]
        Sk = [step( X - xk ) for xk in breakpoints ]
        A = np.array([ ones, X ] + Rk + Sk )
        p =  lstsq(A.transpose(), Y, rcond=None)[0] 

        # Parameters identification:
        a, b = p[0:2]
        ck = p[ 2:2+len(breakpoints) ]
        dk = p[ 2+len(breakpoints): ]

        # Estimation of the next break-points:
        newBreakpoints = breakpoints - dk/ck 

        # Stop condition
        if np.max(np.abs(newBreakpoints - breakpoints)) < dt/5:
            break

        breakpoints = newBreakpoints
    else:
        print( 'maximum iteration reached' )

    # Compute the final segmented fit:
    Xsolution = np.insert( np.append( breakpoints, max(X) ), 0, min(X) )
    ones =  np.ones_like(Xsolution) 
    Rk = [ c*ramp( Xsolution - x0 ) for x0, c in zip(breakpoints, ck) ]

    Ysolution = a*ones + b*Xsolution + np.sum( Rk, axis=0 )

    return Xsolution, Ysolution

উদাহরণ:

import matplotlib.pyplot as plt

X = np.linspace( 0, 10, 27 )
Y = 0.2*X  - 0.3* ramp(X-2) + 0.3*ramp(X-6) + 0.05*np.random.randn(len(X))
plt.plot( X, Y, 'ok' );

initialBreakpoints = [1, 7]
plt.plot( *SegmentedLinearReg( X, Y, initialBreakpoints ), '-r' );
plt.xlabel('X'); plt.ylabel('Y');

চিত্রলেখ

[1]: মুগজিও, ভিএম (2003)। অজানা ব্রেকপয়েন্ট সহ রিগ্রেশন মডেলগুলি অনুমান করা। মেডিসিনে পরিসংখ্যান, 22 (19), 3055-3071।


3

আমি একই জিনিসটি খুঁজছিলাম, এবং দুর্ভাগ্যবশত মনে হচ্ছে যে এই মুহুর্তে এখানে কোনও নেই। কীভাবে এগিয়ে যেতে হবে তার জন্য কিছু পরামর্শ এই পূর্ববর্তী প্রশ্নে পাওয়া যাবে ।

অন্যথায় আপনি কিছু আর দেখব পারে লাইব্রেরি যেমন segmented, মানদণ্ড, strucchange, এবং কিছু ওখানেই তোমার সঙ্গে পাইথন মধ্যে R কোডটিকে এম্বেড করার চেষ্টা জন্য কাজ করে যদি rpy2

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


2

পিসওয়াস রিগ্রেশনটির পুনরাবৃত্তিমূলক বাস্তবায়ন সহ একটি ব্লগ পোস্ট রয়েছে। এই সমাধান বিচ্ছিন্ন রিগ্রেশন ফিট করে।

আপনি যদি বিচ্ছিন্ন মডেল নিয়ে অসন্তুষ্ট হন এবং অবিচ্ছিন্ন সেটিং চান, আমি স্পর্শের kজন্য লাসো ব্যবহার করে এল-আকৃতির বক্ররেখার ভিত্তিতে আপনার বক্ররেখার সন্ধান করার প্রস্তাব করব :

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso
# generate data
np.random.seed(42)
x = np.sort(np.random.normal(size=100))
y_expected = 3 + 0.5 * x + 1.25 * x * (x>0)
y = y_expected + np.random.normal(size=x.size, scale=0.5)
# prepare a basis
k = 10
thresholds = np.percentile(x, np.linspace(0, 1, k+2)[1:-1]*100)
basis = np.hstack([x[:, np.newaxis],  np.maximum(0,  np.column_stack([x]*k)-thresholds)]) 
# fit a model
model = Lasso(0.03).fit(basis, y)
print(model.intercept_)
print(model.coef_.round(3))
plt.scatter(x, y)
plt.plot(x, y_expected, color = 'b')
plt.plot(x, model.predict(basis), color='k')
plt.legend(['true', 'predicted'])
plt.xlabel('x')
plt.ylabel('y')
plt.title('fitting segmented regression')
plt.show()

এই কোডটি আপনাকে আনুমানিক সহগের ভেক্টর ফিরিয়ে দেবে:

[ 0.57   0.     0.     0.     0.     0.825  0.     0.     0.     0.     0.   ]

লাসোর পদ্ধতির কারণে, এটি খুব কমই পাওয়া যায়: 10 সম্ভাব্যদের মধ্যে মডেলটি ঠিক একটি ব্রেকপয়েন্ট পেয়েছিল। প্রকৃত ডিজিপিতে 0.57 এবং 0.825 নম্বর 0.5 এবং 1.25 এর সাথে মিলে যায়। যদিও এগুলি খুব কাছাকাছি না, লাগানো বাঁকগুলি হ'ল:

এখানে চিত্র বর্ণনা লিখুন

এই পদ্ধতির আপনাকে ব্রেকআপপয়েন্টটি ঠিকঠাক অনুমান করতে দেয় না। তবে আপনার ডেটাসেটটি যদি যথেষ্ট পরিমাণে বড় হয় তবে আপনি বিভিন্নের সাথে খেলতে পারেনk (সম্ভবত এটি ক্রস-বৈধকরণের মাধ্যমে টিউন করুন) এবং ব্রেকপয়েন্টটি যথাযথভাবে অনুমান করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.