您的位置:首页 > 编程语言 > C语言/C++

C语言实现logistic回归

2016-02-27 10:55 309 查看
logistic和线性回归的区别与联系 :

区别:logistic回归是做分类(0,1,分类),线性回归是做预测(y值是多少)

区别:线性回归的求法:求theta,让J(theta)达到最小值【J(theta)是凸函数】

logistic回归的求法:写出似然函数,求theta,让似然函数达到最大值【似然函数是凹函数】

联系:求参数,使目标函数达到极值,都是用 梯度下降方法求的

联系:梯度下降的方法里,我们需要人手动算出它的导数,导数的公式是一样的(h(x)-y)*xj)。唯一区别是差一个符号。

所以代码和线性回归基本一样,唯一的区别是增加了一个sigmoid函数,把原来的h(x)变为1/1+e^(-hx) 然后求误差,梯度下降改参数,同上

代码如下:

#include<stdio.h>
#include<math.h>
double sigmoidFunction(double x)
{
double ex;
ex = pow(2.718281828,x);
return ex/(1+ex);
}

int main()
{
double matrix[6][4] = {{1,47,76,24}, //include x0=1
{1,46,77,23},
{1,48,74,22},
{1,34,76,21},
{1,35,75,24},
{1,34,77,25},
};

double result[6] = {1,1,1,0,0,0};
double theta[4] = {2,2,2,2};

int i,j,k;
double h,error,derivate;
for(i=1;i<1000;i++)
{
for(j=0;j<6;j++)
{
h=0;
for(k=0;k<4;k++)
{
h += matrix[j][k]*theta[k];

}
error = sigmoidFunction(h) - result[j];
for(k=0;k<4;k++)
{

derivate = (-1)*error*matrix[j][k];
theta[k] += 0.05*derivate;
}
}

printf("%lf %lf %lf %lf\n",theta[0],theta[1],theta[2],theta[3]);

}

}


【出现的问题】:我和子昊的学习率不同,他用0.01,我用0.05,之后就出现了收敛值不一样的情况。因此,应该是我步长太长,导致跳过了某个收敛值,因此,研究学习率如何变化是下一个需要注意的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: