" এটি কী কারণে কেউ জানেন কি? " - এর পরিবর্তে জলবায়ুবিরোধী উত্তরটি হ'ল কেবল কোনও অ নেগেটিভ রিজ রিগ্রেশন রুটিন বাস্তবায়নের জন্য যথেষ্ট যত্ন করে না। এর অন্যতম প্রধান কারণ হ'ল লোকেরা ইতিমধ্যে নেতিবাচক ইলাস্টিক নেট রুটিনগুলি প্রয়োগ করতে শুরু
করেছে (উদাহরণস্বরূপ এখানে এবং এখানে )। ইলাস্টিক নেট একটি বিশেষ কেস হিসাবে রিজ রিগ্রেশন অন্তর্ভুক্ত (একটি মূলত শূন্য ওজন জন্য ল্যাসো অংশ সেট করে)। এই কাজগুলি তুলনামূলকভাবে নতুন তাই এগুলি এখনও বিজ্ঞান-শিখতে বা অনুরূপ সাধারণ ব্যবহারের প্যাকেজে অন্তর্ভুক্ত করা হয়নি। আপনি এই কাগজপত্রের লেখকদের কোডের জন্য জিজ্ঞাসা করতে চাইতে পারেন।
সম্পাদনা করুন:
@ অ্যামিবা এবং আমি মন্তব্যে আলোচনা করেছিলাম এর বাস্তব বাস্তবায়ন তুলনামূলক সহজ। বলুন যে কারওর কাছে নিম্নলিখিত প্রতিরোধের সমস্যা রয়েছে:
y=2x1−x2+ϵ,ϵ∼N(0,0.22)
যেখানে এবং উভয়ই স্ট্যান্ডার্ড নরমাল যেমন: । নোটিশ করুন আমি প্রমিতিকর পূর্বাভাসকারী ভেরিয়েবলগুলি ব্যবহার করি যাতে এর পরে আমাকে স্বাভাবিক করতে হবে না। সরলতার জন্য আমি কোনও ইন্টারসেপ্টও অন্তর্ভুক্ত করি না। আমরা স্ট্যান্ডার্ড লিনিয়ার রিগ্রেশন ব্যবহার করে অবিলম্বে এই রিগ্রেশন সমস্যাটি সমাধান করতে পারি। সুতরাং আর এ এটির মতো কিছু হওয়া উচিত:x1x2xp∼N(0,1)
rm(list = ls());
library(MASS);
set.seed(123);
N = 1e6;
x1 = rnorm(N)
x2 = rnorm(N)
y = 2 * x1 - 1 * x2 + rnorm(N,sd = 0.2)
simpleLR = lm(y ~ -1 + x1 + x2 )
matrixX = model.matrix(simpleLR); # This is close to standardised
vectorY = y
all.equal(coef(simpleLR), qr.solve(matrixX, vectorY), tolerance = 1e-7) # TRUE
শেষ লাইন লক্ষ্য করুন। প্রায় সমস্ত লিনিয়ার রিগ্রেশন রুটিন অনুমান করতে QR পচন ব্যবহার করে । আমরা আমাদের রিজ রিগ্রেশন সমস্যার জন্য একইটি ব্যবহার করতে চাই। এই মুহুর্তে @ ভুবার এই পোস্টটি পড়ুন ; আমরা ঠিক এই পদ্ধতি বাস্তবায়ন করা হবে । সংক্ষেপে বলতে গেলে, আমরা আমাদের মূল নকশা উদ্দীপক হবে ম্যাট্রিক্স সঙ্গে একটি তির্যক ম্যাট্রিক্স এবং আমাদের প্রতিক্রিয়া ভেক্টর সঙ্গে শূন্য। সেভাবে আমরা মূল রিজ রিগ্রেশন সমস্যাটি পুনরায় প্রকাশ করতে সক্ষম হব হিসাবে যেখানেβXλ−−√Ipyp(XTX+λI)−1XTy(X¯TX¯)−1X¯Ty¯¯সংযুক্ত সংস্করণ প্রতীক। সম্পূর্ণতার জন্য এই নোটগুলি থেকে 18-19 স্লাইডগুলি চেক করুন , আমি সেগুলি বেশ সোজা পেয়েছি। সুতরাং আর তে আমরা কয়েকটি নিম্নলিখিত চাই:
myLambda = 100;
simpleRR = lm.ridge(y ~ -1 + x1 + x2, lambda = myLambda)
newVecY = c(vectorY, rep(0, 2))
newMatX = rbind(matrixX, sqrt(myLambda) * diag(2))
all.equal(coef(simpleRR), qr.solve(newMatX, newVecY), tolerance = 1e-7) # TRUE
এবং এটি কাজ করে। ঠিক আছে, সুতরাং আমরা রিজ রিগ্রেশন অংশ পেয়েছি। আমরা অন্য কোনও উপায়ে সমাধান করতে পারলাম, আমরা এটি একটি অপ্টিমাইজেশন সমস্যা হিসাবে তৈরি করতে পারি যেখানে স্কোয়ারের অবশিষ্টাংশের ব্যয়টি ব্যয় হয় এবং তারপরে এর বিরুদ্ধে অপ্টিমাইজ করা হয়, অর্থাৎ। । নিশ্চিতভাবেই আমরা এটি করতে পারি:সর্বনিম্নβ| |Y¯-এক্স¯β||22
myRSS <- function(X,y,b){ return( sum( (y - X%*%b)^2 ) ) }
bfgsOptim = optim(myRSS, par = c(1,1), X = newMatX, y= newVecY,
method = 'L-BFGS-B')
all.equal(coef(simpleRR), bfgsOptim$par, check.attributes = FALSE,
tolerance = 1e-7) # TRUE
যা প্রত্যাশা মতো আবার কাজ করে। সুতরাং এখন আমরা কেবল চাই: যেখানে । যা কেবল একই অপটিমাইজেশন সমস্যা তবে সীমাবদ্ধ যাতে সমাধানটি অ-নেতিবাচক হয়।সর্বনিম্নβ| |Y¯-এক্স¯β||22β≥ 0
bfgsOptimConst = optim(myRSS, par = c(1,1), X=newMatX, y= newVecY,
method = 'L-BFGS-B', lower = c(0,0))
all(bfgsOptimConst$par >=0) # TRUE
(bfgsOptimConst$par) # 2.000504 0.000000
যা দেখায় যে আসল অ-নেতিবাচক রিজ রিগ্রেশন টাস্কটিকে একটি সীমাবদ্ধ অপটিমাইজেশন সমস্যা হিসাবে সংস্কার করে সমাধান করা যেতে পারে। কিছু সতর্কতা:
- আমি (প্রাকৃতিকভাবে) প্রমিতিকর ভেরিয়েবলকে নরমালাইজড করেছিলাম। আপনার নিজেরাই সাধারণীকরণের অ্যাকাউন্ট করতে হবে।
- একই জিনিসটি ইন্টারসেপ্টের অ- সাধারণকরণের জন্য যায় ।
- আমি ব্যবহৃত
optim
'র , L-BFGS-বি যুক্তি। এটি সর্বাধিক ভ্যানিলা আর সলভার যা সীমা গ্রহণ করে। আমি নিশ্চিত যে আপনি কয়েক ডজন আরও ভাল সলভার পাবেন।
- সাধারণত সীমাবদ্ধ রৈখিক মধ্যে সর্বনিম্ন-স্কোয়ারের সমস্যাগুলি চতুর্ভুজ অপ্টিমাইজেশন কার্য হিসাবে দেখা দেয় । এটি এই পোস্টের জন্য একটি ওভারকিল তবে মনে রাখবেন প্রয়োজনে আরও ভাল গতি পেতে পারেন।
- মন্তব্যে উল্লিখিত হিসাবে আপনি রিজ-রিগ্রেশনকে অগমেন্টেড-লিনিয়ার-রিগ্রেশন অংশ হিসাবে এড়িয়ে যেতে পারেন এবং একটি অপ্টিমাইজেশন সমস্যা হিসাবে রিজ কস্ট ফাংশনটিকে সরাসরি এনকোড করতে পারেন। এটি অনেক সহজ এবং এই পোস্টটি উল্লেখযোগ্যভাবে ছোট হবে। যুক্তির খাতিরে আমি এই দ্বিতীয় সমাধানটিও সংযোজন করি।
- আমি পাইথনে পুরোপুরি কথোপকথন করছি না তবে নুমপির লিনালগ.সলভ এবং সায়পাইয়ের অনুকূলিত ফাংশনগুলি ব্যবহার করে আপনি এই কাজটির প্রতিলিপি করতে পারেন ।
- হাইপারপ্যারামিটার- ইত্যাদি চয়ন করতে আপনি কেবলমাত্র সিভি-স্টেপটিই করেন যা আপনি কোনও ক্ষেত্রেই করেন; কিছুই পরিবর্তন.λ
পয়েন্ট 5 এর কোড:
myRidgeRSS <- function(X,y,b, lambda){
return( sum( (y - X%*%b)^2 ) + lambda * sum(b^2) )
}
bfgsOptimConst2 = optim(myRidgeRSS, par = c(1,1), X = matrixX, y = vectorY,
method = 'L-BFGS-B', lower = c(0,0), lambda = myLambda)
all(bfgsOptimConst2$par >0) # TRUE
(bfgsOptimConst2$par) # 2.000504 0.000000