अभिसरण नहीं करेगा मैं स्टैनफोर्ड मशीन लर्निंग लेक्चर (lecture 2 at around 25:00) में समझाया गया ग्रेडियेंट वंश एल्गोरिदम के लिए थोड़ा सा कोड लिखने की कोशिश कर रहा हूं। नीचे मैंने पहले उपयोग किया गया कार्यान्वयन है, और मुझे लगता है कि यह व्याख्यान से ठीक से कॉपी किया गया है, लेकिन जब मैं बड़ी संख्या में (>8
) प्रशिक्षण सेट में जोड़ता हूं तो यह अभिसरण नहीं होता है।ग्रेडियेंट डेसेंट एल्गोरिदम
मैं एक नंबर X
inputting रहा हूँ, और point (X,X)
, प्रशिक्षण सेट में जोड़ा जाता है तो इस समय, मैं केवल यह करने के लिए y=ax+b
जहां a=1=theta\[1\]
और b=0=theta\[0\]
अभिसरण को पाने के लिए कोशिश कर रहा हूँ। प्रशिक्षण सेट सरणी x
और y
है, जहां (x[i],y[i])
एक बिंदु है।
void train()
{
double delta;
for (int i = 0; i < x.size(); i++)
{
delta = y[i]-hypothesis(x[i]);
theta[1] += alpha*delta*x[i];
theta[0] += alpha*delta*1;
}
}
void C_Approx::display()
{
std::cout<<theta[1]<<"x + "<<theta[0]<<" \t "<<"f(x)="<<hypothesis(1)<<std::endl;
}
परिणाम मैं हो रही है में से कुछ
:
: मैं इनपुट एक नंबर है, यहtrain()
कई बार, फिर
display()
1
0.33616x + 0.33616 f(x)=0.67232
1
0.482408x + 0.482408 f(x)=0.964816
1
0.499381x + 0.499381 f(x)=0.998762
1
0.499993x + 0.499993 f(x)=0.999986
1
0.5x + 0.5 f(x)=1
यह अपसारी के बाद यह 8
पारित कर दिया का एक उदाहरण चलाता है
1
0.33616x + 0.33616 f(x)=0.67232
2
0.705508x + 0.509914 f(x)=1.21542
3
0.850024x + 0.449928 f(x)=1.29995
4
0.936062x + 0.330346 f(x)=1.26641
5
0.951346x + 0.231295 f(x)=1.18264
6
0.992876x + 0.137739 f(x)=1.13062
7
0.932206x + 0.127372 f(x)=1.05958
8
1.00077x + 0.000493063 f(x)=1.00126
9
-0.689325x + -0.0714712 f(x)=-0.760797
10
4.10321e+08x + 4.365e+07 f(x)=4.53971e+08
11
1.79968e+22x + 1.61125e+21 f(x)=1.9608e+22
12
-3.9452e+41x + -3.26957e+40 f(x)=-4.27216e+41
मैंने चरण को स्केल करने के लिए here प्रस्तावित समाधान की कोशिश की और इसी तरह के परिणामों के साथ समाप्त हो गया। मैं क्या गलत कर रहा हूँ?
आप यादृच्छिक नमूना के आधार पर α कैसे निर्धारित करेंगे? – howardh
@ हावर्ड, बस अलग-अलग मूल्यों की कोशिश करके और एक को चुनकर जो जल्दी से एक छोटे जे (θ) में परिवर्तित हो जाता है। –
तो मैं केवल मूल प्रशिक्षण सेट, कॉल ट्रेन() से उस सेट के साथ यादृच्छिक रूप से चयनित डेटा बिंदुओं का एक नया सेट बना देता हूं, और यदि प्रत्येक चरण में त्रुटि कम नहीं होती है, तो मैं α कम करता हूं और दोहराता हूं? – howardh