Least mean square의 방식(편미분)
#include <stdio.h>
#define SIZE 4
double a=0.0,b=0.0;
//double x,y;
double x[SIZE] = {1, 2.5, 3, 3.9};
double y[SIZE] = {2.1, 3.4, 3.7, 3.1};
int i;
double calculate1(double a, double b)
{
double gradienta=0.0,suma=0.0;
for(i=0; i<SIZE; i++)
{
gradienta = (y[i] - (a*x[i] + b)) * (y[i] - (a*x[i] + b));
suma += gradienta;
}
return suma;
}
double calculate2(double a, double b)
{
double gradientb=0.0,sumb=0.0;
//a에 대해 편미분
for(i=0; i<SIZE; i++)
{
gradientb = 2*(y[i] - (a*x[i] + b)) * (-x[i]);
sumb += gradientb;
}
return sumb;
}
double calculate3(double a, double b)
{
double gradientc=0.0,sumc=0.0;
//b에 대해 편미분
for(i=0; i<SIZE; i++)
{
gradientc = 2*(y[i] - (a*x[i] + b)) * (-1);
sumc += gradientc;
}
return sumc;
}
int main()
{
double old_a=10.0,old_b=10.0;
double result1,result2;
while(1)
{
old_a = a;
old_b = b;
result1 = calculate1(old_a,old_b);
a = old_a - 0.0001 * calculate2(old_a,old_b);
b = old_b - 0.0001 * calculate3(old_a,old_b);
result2 = calculate1(a,b);
if (result1 < result2)
break;
}
printf("a = %f, b = %f\n",a,b);
printf("8개월때 = %f",8*a+b);
return 0;
}
'과거에 공부했던 것들(저장용) > 학부생' 카테고리의 다른 글
아이언돔 예측하기 (0) | 2015.07.23 |
---|---|
월세예측 프로그램 (0) | 2015.07.23 |
QT) Timer를 이용하여 공움직이기 (0) | 2015.07.23 |
QT) ThreadScaler (0) | 2015.07.23 |
QT) Mouse 움직임 나타내기 (0) | 2015.07.23 |