অন্যান্য উত্তরগুলি সমস্ত ভাল পন্থা। তবে আর-তে আরও কয়েকটি অপশন রয়েছে যা উল্লেখ করা হয়নি lowess
এবং এর সাথে approx
আরও ভাল ফিট বা দ্রুত পারফরম্যান্স দিতে পারে।
বিকল্প ডেটাসেটের সাহায্যে সুবিধাগুলি আরও সহজেই প্রদর্শিত হয়:
sigmoid <- function(x)
{
y<-1/(1+exp(-.15*(x-100)))
return(y)
}
dat<-data.frame(x=rnorm(5000)*30+100)
dat$y<-as.numeric(as.logical(round(sigmoid(dat$x)+rnorm(5000)*.3,0)))
সিগময়েড বক্ররেখা যা এটি উত্পন্ন করে তা এখানে দেওয়া তথ্য রয়েছে:
জনসংখ্যার মধ্যে বাইনারি আচরণ দেখার সময় এই ধরণের ডেটা সাধারণ। উদাহরণস্বরূপ, কোনও গ্রাহক সাইটে কিছু পরিমাণ সময় (x- অক্ষ) ব্যয় করেছেন তার বিপরীতে কোনও কিছু (y- অক্ষের উপর বাইনারি 1/0) কিনেছিল কিনা তা এই প্লট হতে পারে।
এই ফাংশনগুলির পারফরম্যান্স পার্থক্যগুলি আরও ভালভাবে প্রদর্শন করতে প্রচুর পরিমাণে পয়েন্ট ব্যবহার করা হয়।
Smooth
, spline
এবং smooth.spline
আমি চেষ্টা করেছি এমন কোনও পরামিতিগুলির সেট সহ এই জাতীয় ডেটাসেটে জিব্বারিশ উত্পাদন করে, সম্ভবত প্রতিটি পয়েন্টে মানচিত্রের প্রবণতার কারণে, যা কোলাহলযুক্ত ডেটার জন্য কাজ করে না।
loess
, lowess
, এবং approx
ফাংশন সব ব্যবহারযোগ্য ফল, যদিও মাত্র সবে জন্য approx
। হালকা অপ্টিমাইজড প্যারামিটার ব্যবহারের জন্য এটির জন্য কোড:
loessFit <- loess(y~x, dat, span = 0.6)
loessFit <- data.frame(x=loessFit$x,y=loessFit$fitted)
loessFit <- loessFit[order(loessFit$x),]
approxFit <- approx(dat,n = 15)
lowessFit <-data.frame(lowess(dat,f = .6,iter=1))
এবং ফলাফল:
plot(dat,col='gray')
curve(sigmoid,0,200,add=TRUE,col='blue',)
lines(lowessFit,col='red')
lines(loessFit,col='green')
lines(approxFit,col='purple')
legend(150,.6,
legend=c("Sigmoid","Loess","Lowess",'Approx'),
lty=c(1,1),
lwd=c(2.5,2.5),col=c("blue","green","red","purple"))
আপনি দেখতে পাচ্ছেন, lowess
আসল উত্পন্ন কার্ভটির জন্য একটি নিখুঁত নিখুঁত ফিট উত্পাদন করে। Loess
কাছাকাছি, তবে উভয় লেজতে একটি অদ্ভুত বিচ্যুতি অনুভব করে।
যদিও আপনার ডেটা সেটটি খুব আলাদা হতে হবে, আমি খুঁজে পেয়েছি যে অন্য ডেটাসেট উভয় সঙ্গে, একভাবে সঞ্চালন loess
এবং lowess
ভালো ফল উৎপাদন করতে সক্ষম। আপনি মাপদণ্ডের দিকে তাকালে পার্থক্যগুলি আরও তাত্পর্যপূর্ণ হয়ে ওঠে:
> microbenchmark::microbenchmark(loess(y~x, dat, span = 0.6),approx(dat,n = 20),lowess(dat,f = .6,iter=1),times=20)
Unit: milliseconds
expr min lq mean median uq max neval cld
loess(y ~ x, dat, span = 0.6) 153.034810 154.450750 156.794257 156.004357 159.23183 163.117746 20 c
approx(dat, n = 20) 1.297685 1.346773 1.689133 1.441823 1.86018 4.281735 20 a
lowess(dat, f = 0.6, iter = 1) 9.637583 10.085613 11.270911 11.350722 12.33046 12.495343 20 b
Loess
যতক্ষণ পর্যন্ত 100x নিচ্ছে তা অত্যন্ত ধীর approx
। এখনও Lowess
তুলনামূলকভাবে approx
দ্রুত চলার সময় (লসের চেয়ে 15x দ্রুত) এর চেয়ে ভাল ফলাফল তৈরি করে ।
Loess
পয়েন্ট সংখ্যা বৃদ্ধি পাওয়ায় ক্রমশ বোকা হয়ে যায়, প্রায় ৫০,০০০ অব্যবহৃত হয়ে পড়ে।
সম্পাদনা: অতিরিক্ত গবেষণা দেখায় যে loess
নির্দিষ্ট ডেটাসেটের জন্য আরও ভাল ফিট করে। আপনি যদি একটি ছোট ডেটাसेट নিয়ে কাজ করছেন বা পারফরম্যান্স বিবেচনা না করে থাকেন তবে উভয় ফাংশন চেষ্টা করে ফলাফলের তুলনা করুন।