스탠포드 머신 학습 강의 (lecture 2 at around 25:00)에서 설명한 그라디언트 디센트 알고리즘에 대한 코드를 작성하려고합니다. 아래는 처음에 사용한 구현이며 강의에서 제대로 복사 한 것 같습니다. 그러나 큰 숫자 (>8
)를 교육 집합에 추가하면 수렴되지 않습니다.그라디언트 디센트 알고리즘이 수렴하지 않습니다.
나는 숫자 X
를 입력 해요, 그리고, 나는 단지 그것을 y=ax+b
곳 a=1=theta\[1\]
및 b=0=theta\[0\]
수렴하려고 노력하고있어 순간 있도록 point (X,X)
는 트레이닝 세트에 추가됩니다. 훈련 집합은 배열 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;
}
내가지고있어 결과의 일부
: : I 입력 숫자, 그 다음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
을 통과 한 후에는 분기의 예 train()
몇 번을 실행
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, 간단히 다른 값을 시도하고 작은 J (θ)로 빠르게 수렴하는 것을 선택하면됩니다. –
그래서 원래의 훈련 세트에서 무작위로 선택한 새로운 데이터 세트를 만들고 해당 세트를 특정 α로 호출하여 train()을 호출하고 오류가 모든 단계에서 감소하지 않으면 α를 줄이고 반복합니까? – howardh