আমি মূলত নীচের numpy.corrcoef
মানদণ্ডগুলি সুপারিশের উদ্দেশ্যে পোস্ট করেছি, মূর্খতার সাথে বুঝতে পারি না যে আসল প্রশ্নটি ইতিমধ্যে ব্যবহার করে corrcoef
এবং বাস্তবে উচ্চতর অর্ডার বহুবর্ষীয় ফিটগুলির বিষয়ে জিজ্ঞাসা করছে। আমি স্ট্যাটাসমডেলগুলি ব্যবহার করে বহুবর্ষীয় r-স্কোয়ার্ড প্রশ্নের একটি প্রকৃত সমাধান যুক্ত করেছি এবং আমি মূল মাপদণ্ড রেখে গেছি, যা অফ-টপিকের কারণে, কারও পক্ষে সম্ভাব্য উপকারী।
statsmodels
r^2
পলিনোমিয়াল ফিটের গণনা করার ক্ষমতা রয়েছে সরাসরি, এখানে 2 টি পদ্ধতি ...
import statsmodels.api as sm
import statsmodels.formula.api as smf
def get_r2_statsmodels(x, y, k=1):
xpoly = np.column_stack([x**i for i in range(k+1)])
return sm.OLS(y, xpoly).fit().rsquared
def get_r2_statsmodels_formula(x, y, k=1):
formula = 'y ~ 1 + ' + ' + '.join('I(x**{})'.format(i) for i in range(1, k+1))
data = {'x': x, 'y': y}
return smf.ols(formula, data).fit().rsquared
আরও সুবিধা গ্রহণ করার জন্য statsmodels
, লাগানো মডেলের সংক্ষিপ্তসারটিও দেখতে হবে, যা জুপিটার / আইপিথন নোটবুকে একটি সমৃদ্ধ HTML টেবিল হিসাবে মুদ্রিত বা প্রদর্শিত হতে পারে। ফলাফলের বস্তুটি ছাড়াও অনেকগুলি দরকারী পরিসংখ্যানের মেট্রিকগুলিতে অ্যাক্সেস সরবরাহ করে rsquared
।
model = sm.OLS(y, xpoly)
results = model.fit()
results.summary()
নীচে আমার মূল উত্তরটি দেওয়া হয়েছে যেখানে আমি বিভিন্ন লিনিয়ার রিগ্রেশন r ^ 2 পদ্ধতির বেঞ্চমার্ক করেছি ...
Corrcoef প্রশ্ন ব্যবহৃত ফাংশন গণনা পারস্পরিক সম্পর্কের সহগের, r
মাত্র একটি একক রৈখিক রিগ্রেশনের জন্য, তাই এটি প্রশ্নে ধরে নি r^2
উচ্চতর ক্রম বহুপদী বেশি মানানসই। যাইহোক, এটির মূল্য কিসের জন্য, আমি এটি সন্ধান করতে এসেছি যে লিনিয়ার রিগ্রেশন এর জন্য এটি গণনার সবচেয়ে দ্রুত এবং সর্বাধিক প্রত্যক্ষ পদ্ধতি r
।
def get_r2_numpy_corrcoef(x, y):
return np.corrcoef(x, y)[0, 1]**2
এগুলি 1000 এলোমেলো (x, y) পয়েন্টের জন্য একগুচ্ছ পদ্ধতির তুলনায় আমার সময়সীমার ফলাফল ছিল:
- খাঁটি পাইথন (সরাসরি
r
গণনা)
- 1000 লুপ, প্রতি লুপে 3: 1.59 এমএসের মধ্যে সেরা
- নম্পি পলিটফিট (এন-ডিগ্রি ডিগ্রি পলিনোমিয়াল ফিটগুলির জন্য প্রযোজ্য)
- 1000 লুপ, 3 লুপ প্রতি: 326 µ এস সেরা of
- নম্পি ম্যানুয়াল (সরাসরি
r
গণনা)
- 10000 লুপ, 3 লুপের জন্য 62.1 µ সেরা op
- নোমকি কর্কোফ (সরাসরি
r
গণনা)
- 10000 লুপ, 3 লুপ প্রতি: 56.6 µ এস সেরা
- স্কিপি (
r
আউটপুট হিসাবে লিনিয়ার রিগ্রেশন )
- 1000 লুপগুলি, প্রতি লুপে 3: 676 µ এস সেরা
- স্ট্যাটাসমডেলস (এন-ডিগ্রি ডিগ্রি পলিনোমিয়াল এবং অন্যান্য অনেকগুলি ফিট করতে পারে)
- 1000 লুপগুলি, প্রতি লুপে 3: 422 of এর মধ্যে সেরা
কর্কোয়েফ পদ্ধতিটি সঙ্কুচিতভাবে r ^ 2 "ম্যানুয়ালি" নকল পদ্ধতি ব্যবহার করে গণনা করে। এটি পলিটফিট পদ্ধতির চেয়ে 5X দ্রুত এবং স্কিপি.লিনগ্র্রেসের চেয়ে 12X ডলার দ্রুত। নম্পি আপনার জন্য কী করছে তা কেবল আরও জোরদার করতে, খাঁটি অজগর থেকে এটি 28 এক্স দ্রুত। আমি নাম্বা এবং পাইপির মতো জিনিসগুলিতে পারদর্শী নই, সুতরাং অন্য কারও কাছে সেই শূন্যস্থান পূরণ করতে হবে, তবে আমি মনে করি এটি আমার পক্ষে যথেষ্ট পরিমাণে বিশ্বাসযোগ্য যা সাধারণ লিনিয়ার রিগ্রেশন corrcoef
গণনার r
জন্য সেরা সরঞ্জাম ।
আমার বেনমার্কিং কোডটি এখানে। আমি একটি বৃহত্তর নোটবুক থেকে কপি-পেস্ট করেছি (এটিকে আইপিথন নোটবুক না বলা শক্ত ...), তাই পথে যদি কিছু ভেঙে যায় তবে আমি ক্ষমাপ্রার্থী। % টাইমিট ম্যাজিক কমান্ডের আইপিথন প্রয়োজন।
import numpy as np
from scipy import stats
import statsmodels.api as sm
import math
n=1000
x = np.random.rand(1000)*10
x.sort()
y = 10 * x + (5+np.random.randn(1000)*10-5)
x_list = list(x)
y_list = list(y)
def get_r2_numpy(x, y):
slope, intercept = np.polyfit(x, y, 1)
r_squared = 1 - (sum((y - (slope * x + intercept))**2) / ((len(y) - 1) * np.var(y, ddof=1)))
return r_squared
def get_r2_scipy(x, y):
_, _, r_value, _, _ = stats.linregress(x, y)
return r_value**2
def get_r2_statsmodels(x, y):
return sm.OLS(y, sm.add_constant(x)).fit().rsquared
def get_r2_python(x_list, y_list):
n = len(x_list)
x_bar = sum(x_list)/n
y_bar = sum(y_list)/n
x_std = math.sqrt(sum([(xi-x_bar)**2 for xi in x_list])/(n-1))
y_std = math.sqrt(sum([(yi-y_bar)**2 for yi in y_list])/(n-1))
zx = [(xi-x_bar)/x_std for xi in x_list]
zy = [(yi-y_bar)/y_std for yi in y_list]
r = sum(zxi*zyi for zxi, zyi in zip(zx, zy))/(n-1)
return r**2
def get_r2_numpy_manual(x, y):
zx = (x-np.mean(x))/np.std(x, ddof=1)
zy = (y-np.mean(y))/np.std(y, ddof=1)
r = np.sum(zx*zy)/(len(x)-1)
return r**2
def get_r2_numpy_corrcoef(x, y):
return np.corrcoef(x, y)[0, 1]**2
print('Python')
%timeit get_r2_python(x_list, y_list)
print('Numpy polyfit')
%timeit get_r2_numpy(x, y)
print('Numpy Manual')
%timeit get_r2_numpy_manual(x, y)
print('Numpy corrcoef')
%timeit get_r2_numpy_corrcoef(x, y)
print('Scipy')
%timeit get_r2_scipy(x, y)
print('Statsmodels')
%timeit get_r2_statsmodels(x, y)