1 logictic回归
该方法是一种监督学习算法,为非线性回归模型,是研究分类观察结果(y)与一些影响因素(x)之间关系的一种多变量分析方法,在这里的y属于【0,1】。
训练过程:
此过程就是求回归方程中的几个参数,theta1,theta2,theta3,这个是根据公式 y = x1*theta1 + x2*theta2+x3*theta3, 然后根据 http://hi.baidu.com/hehehehello/item/40025c33d7d9b7b9633aff87 这个基础理论知识,可以求得这三个参数,这里我主要谈一下自己代码实现所遇到的问题,一个就是关于theta迭代步长的选取,我这里选的是0.01,迭代10000次,求得三个参数,初始化theta分别选取为1.其实这里最主要的是想说为什么叫logistic回归,与线性回归的的一点区别,这里面主要用到了函数归一化,也就是对模拟函数 x1*theta1 + x2*theta2+x3*theta3用指数函数进行归一。也就是程序里面的g函数。
识别过程:
对于已经训练好的三个参数theta1,theta2,theta3,我们把一个数据代入计算出属于为某一类的概率,也就是先计算 y = x1*theta1 + x2*theta2+x3*theta3 ,然后利用g函数对y值进行归一,这就为该数据属于哪一类的概率。
这是写的一个简单demo: 供大家参考:
logistic回归
梯度下降算法
#define N 6
#define M 3
//g函数 也是归一函数
void function_g( int z)
{
float ez = pow(2.4167852,z);
return ez/(1+ez);
}
//梯度下降算法
void Gradient()
{
}
//代价函数
double function_Cost()
{
double sum;
for(int i = 0; i < N;i++)
{
sum += result[i]*log(function_g(function_regection())) + (1- result[i])*log(1 - function_g(function_regection())));
}
sum = -sum/N;
return sum;
}
//生成的线性回归函数
void fuction_regecion()
{
double xi = 0;
xi + = theta[0]*matrix[i][0] + theta[1]*matrix[i][1] + theta[2]*matrix[i][2]);
return xi;
}
//计算迭代步数的和
void sum_error(int j)
{
double sum;
for(int i = 0 ; i < N ;i++)
{
sum + = (fuction_g(theta[0]*matrix[i][0] + theta[1]*matrix[i][1] + theta[2]*matrix[i][2]) - result[i])*matric[i][j];
}
}
void logisticfunction()
{
double matrix[N][M] ={};
double result[N] ={1,1,1,1,1,1};
double theta[M] = {1,1,1};
float step = 1.0;
int i =0;
//让迭代次数趋于1000次
while(i< 1000)
{
for(int j =0; j < M ;j++)
{
theta[j] = theta[j] - step*sum_error(j);
}
i++;
//计算cost函数
double costvalue = function_Cost();
}
}