Logistic Regression求解classification问题

时间:2022-02-20 10:51:20

classification问题和regression问题类似,区别在于y值是一个离散值,例如binary classification,y值只取0或1。

方法来自Andrew Ng的Machine Learning课件的note1的PartII,Classification and logsitic regression.

实验表明,通过多次迭代,能够最大化Likehood,使得分类有效,实验数据为人工构建,没有实际物理意义,matrix的第一列为x0,取常数1,第二列为区分列,第三列,第四列为非区分列,最后对预测起到主导地位的参数是theta[0]和theta[1]。

  1. #include "stdio.h"
  2. #include "math.h"
  3. double matrix[6][4]={{1,47,76,24}, //include x0=1
  4. {1,46,77,23},
  5. {1,48,74,22},
  6. {1,34,76,21},
  7. {1,35,75,24},
  8. {1,34,77,25},
  9. };
  10. double result[]={1,1,1,0,0,0};
  11. double theta[]={1,1,1,1}; // include theta0
  12. double function_g(double x)
  13. {
  14. double ex = pow(2.718281828,x);
  15. return ex/(1+ex);
  16. }
  17. int main(void)
  18. {
  19. double likelyhood = 0.0;
  20. float sum=0.0;
  21. for(int j = 0;j<6;++j)
  22. {
  23. double xi = 0.0;
  24. for(int k=0;k<4;++k)
  25. {
  26. xi += matrix[j][k]*theta[k];
  27. }
  28. printf("sample %d,%f\n",j,function_g(xi));
  29. sum += result[j]*log(function_g(xi)) + (1-result[j])*log(1-function_g(xi)) ;
  30. }
  31. printf("%f\n",sum);
  32. for(int i =0 ;i<1000;++i)
  33. {
  34. double error_sum=0.0;
  35. int j=i%6;
  36. {
  37. double h = 0.0;
  38. for(int k=0;k<4;++k)
  39. {
  40. h += matrix[j][k]*theta[k];
  41. }
  42. error_sum = result[j]-function_g(h);
  43. for(int k=0;k<4;++k)
  44. {
  45. theta[k] = theta[k]+0.001*(error_sum)*matrix[j][k];
  46. }
  47. }
  48. printf("theta now:%f,%f,%f,%f\n",theta[0],theta[1],theta[2],theta[3]);
  49. float sum=0.0;
  50. for(int j = 0;j<6;++j)
  51. {
  52. double xi = 0.0;
  53. for(int k=0;k<4;++k)
  54. {
  55. xi += matrix[j][k]*theta[k];
  56. }
  57. printf("sample output now: %d,%f\n",j,function_g(xi));
  58. sum += result[j]*log(function_g(xi)) + (1-result[j])*log(1-function_g(xi)) ;
  59. }
  60. printf("maximize the log likelihood now:%f\n",sum);
  61. printf("************************************\n");
  62. }
  63. return 0;
  64. }