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) 然后求误差,梯度下降改参数,同上
代码如下:
【出现的问题】:我和子昊的学习率不同,他用0.01,我用0.05,之后就出现了收敛值不一样的情况。因此,应该是我步长太长,导致跳过了某个收敛值,因此,研究学习率如何变化是下一个需要注意的问题。
区别: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,之后就出现了收敛值不一样的情况。因此,应该是我步长太长,导致跳过了某个收敛值,因此,研究学习率如何变化是下一个需要注意的问题。
相关文章推荐
- C++基础总结(1)--基本数据类型范围
- C++基础总结(1)--基本数据类型范围
- C++: 解释error: call of overloaded ‘abs(int)’ is ambiguous
- Java JNI调用c语言的dll测试
- c++ virtual
- C语言书籍推荐
- C++中的namespace
- C语言之基本算法09—各位全是a的数列之和
- C++笔记:1
- C++开发人脸性别识别教程(15)——搭建MFC框架启动摄像头
- 【C++】Accessor and Mutator Functions & 函数形参与类私有成员重名的解决方法
- Boost MPI scatter
- C++ DirectX 游戏开发初级视频教程 20 资源下载链接
- c++11对多线程的典型用法
- C++基础——1.变量和基本类型(基于c++11)
- C++模板板块
- C++ 2杈树 完整
- C++ 红黑树
- C++ 酒桶算法
- C++常用集合开发:STL vector